-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathSolverResult.fs
61 lines (56 loc) · 2.03 KB
/
SolverResult.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
module RInGen.SolverResult
open SMTLIB2
open FiniteModels
type Model =
| ElemFormula | SizeElemFormula | FiniteModel of finModel | Saturation of string | NoModel
override x.ToString() =
let toStringHeadAndBody head s =
let body = if s = null || s = "" then "" else "\n" + s
head + body
match x with
| ElemFormula -> "ElemFormula"
| SizeElemFormula -> "SizeElemFormula"
| FiniteModel f -> toStringHeadAndBody "FiniteModel" (f.ToString())
| Saturation s -> toStringHeadAndBody "Saturation" s
| NoModel -> "NoModel"
type SolverResult =
| SAT of Model | UNSAT of string | ERROR of string | UNKNOWN of string | SOLVER_TIMELIMIT | OUTOFMEMORY
override x.ToString() =
match x with
| SAT m -> $"SAT %O{m}"
| UNSAT "" -> "UNSAT"
| UNSAT refutation -> $"UNSAT\n{refutation}"
| SOLVER_TIMELIMIT -> "SOLVER_TIMELIMIT"
| OUTOFMEMORY -> "OUTOFMEMORY"
| ERROR s -> $"ERROR %s{s}"
| UNKNOWN s -> $"UNKNOWN %s{s}"
let compactStatus = function
| ERROR _ -> ERROR ""
| UNKNOWN _ -> UNKNOWN ""
| UNSAT _ -> UNSAT ""
| r -> r
let quietModeToString = function
| SAT _ -> "sat"
| UNSAT _ -> "unsat"
| _ -> "unknown"
let tryParseSolverResult (s : string) =
let s = s.Trim()
match split " \n" s with
| "SAT":: model ->
match model with
| "ElemFormula"::_ -> SAT ElemFormula
| "SizeElemFormula"::_ -> SAT SizeElemFormula
| "FiniteModel"::_ -> SAT (FiniteModel SomeFiniteModel)
| "Saturation"::_ -> SAT (Saturation "")
| _ -> SAT NoModel
|> Some
| "UNSAT"::_ -> UNSAT "" |> Some
| "ERROR"::reason -> ERROR (join " " reason) |> Some
| "UNKNOWN"::reason -> UNKNOWN (join " " reason) |> Some
| "SOLVER_TIMELIMIT"::_ -> SOLVER_TIMELIMIT |> Some
| "OUTOFMEMORY"::_ -> OUTOFMEMORY |> Some
| _ -> None
let parseSolverResult s =
match tryParseSolverResult s with
| Some res -> res
| None -> __notImplemented__()