3
3
4
4
def reset_solver (s ):
5
5
s .reset ()
6
- s .set ('produce-unsat-assumptions ' ,'true' )
6
+ s .set ('produce-unsat-cores ' ,'true' )
7
7
8
- def validate_unsat_assumptions ( assumptions , core ):
9
- # checks that the produced unsat assumptions ( core) match the assumptions (assumptions) sent to the check function
10
- return sum ([c in assumptions for c in core ]) == len (core )
8
+ def validate_unsat_core ( input_formulas , core ):
9
+ # checks that the produced unsat core match the input formulas sent to the check function
10
+ return sum ([c in input_formulas for c in core ]) == len (core )
11
11
12
12
13
- def check_unsat_assumptions ( assertions , core ):
14
- # This function checks wether, given assertions, the produced unsat assumptions ( core) also lead to unsat result
13
+ def check_unsat_core ( core ):
14
+ # This function checks whether the unsat core is unsatisfiable
15
15
slvr = Solver ()
16
- slvr .set ('produce-unsat-assumptions' ,'true' )
17
- for a in assertions :
18
- slvr .add (a )
19
16
return s .check (* core ) == unsat
20
17
21
18
22
19
# To make make sure the unsat_core function works there should be at least one nontrivial solution - a solution that doesn't contain all the assumptions sent in the check function.
23
- nontrivial_counter = 0
20
+ nontrivial_counter = 0
24
21
25
22
p1 , p2 , p3 = Bools ('p1 p2 p3' )
26
23
x , y = Ints ('x y' )
@@ -37,10 +34,9 @@ def check_unsat_assumptions(assertions, core):
37
34
38
35
core = s .unsat_core ()
39
36
40
-
41
- assert validate_unsat_assumptions (assumptions ,core )
42
- assert check_unsat_assumptions (assertions ,core )
43
- if len (core ) < len (assumptions ):
37
+ assert validate_unsat_core (assertions + assumptions ,core )
38
+ assert check_unsat_core (core )
39
+ if len (core ) < len (assumptions ) + len (assertions ):
44
40
nontrivial_counter += 1
45
41
46
42
# example 2 - booleans
@@ -60,11 +56,11 @@ def check_unsat_assumptions(assertions, core):
60
56
assumptions = [a ,b ,c ]
61
57
result = s .check (* assumptions )
62
58
63
- unsat_core = s .unsat_core ()
59
+ core = s .unsat_core ()
64
60
65
- assert validate_unsat_assumptions ( assumptions ,unsat_core )
66
- assert check_unsat_assumptions ( assertions , assumptions )
67
- if len (unsat_core ) < len (assumptions ):
61
+ assert validate_unsat_core ( assertions + assumptions , core )
62
+ assert check_unsat_core ( core )
63
+ if len (core ) < len (assumptions ) + len ( assertions ):
68
64
nontrivial_counter += 1
69
65
70
66
# example 3 - booleans
@@ -83,11 +79,11 @@ def check_unsat_assumptions(assertions, core):
83
79
assumptions = [a ,b ,c ,d ]
84
80
result = s .check (* assumptions )
85
81
86
- unsat_core = s .unsat_core ()
82
+ core = s .unsat_core ()
87
83
88
- assert validate_unsat_assumptions (assumptions , unsat_core )
89
- assert check_unsat_assumptions ( assertions , assumptions )
90
- if len (unsat_core ) < len (assumptions ):
84
+ assert validate_unsat_core (assumptions + assertions , core )
85
+ assert check_unsat_core ( core )
86
+ if len (core ) < len (assumptions ) + len ( assertions ):
91
87
nontrivial_counter += 1
92
88
93
89
# example 4 - reals
@@ -108,13 +104,13 @@ def check_unsat_assumptions(assertions, core):
108
104
assumptions = [x > 0 , y > 0 , z > 0 ]
109
105
result = s .check (* assumptions )
110
106
111
- unsat_core = s .unsat_core ()
107
+ core = s .unsat_core ()
112
108
113
- assert validate_unsat_assumptions (assumptions , unsat_core )
114
- assert check_unsat_assumptions ( assertions , assumptions )
115
- if len (unsat_core ) < len (assumptions ):
109
+ assert validate_unsat_core (assumptions + assertions , core )
110
+ assert check_unsat_core ( core )
111
+ if len (core ) < len (assumptions ) + len ( assertions ):
116
112
nontrivial_counter += 1
117
-
113
+
118
114
119
115
# example 5 - strings
120
116
@@ -135,16 +131,14 @@ def check_unsat_assumptions(assertions, core):
135
131
136
132
result = s .check ( Length (s2 ) < 2 )
137
133
138
- unsat_core = s .unsat_core ()
134
+ core = s .unsat_core ()
139
135
140
- assert validate_unsat_assumptions ([Length (s2 ) < 2 ], unsat_core )
141
- assert check_unsat_assumptions ( assertions ,[ Length ( s2 ) < 2 ] )
142
- if len (unsat_core ) < len ([ Length (s2 ) < 2 ]):
136
+ assert validate_unsat_core ([Length (s2 ) < 2 ] + assertions , core )
137
+ assert check_unsat_core ( core )
138
+ if len (core ) < len ([ Length (s2 ) < 2 ]) + len ( assertions ):
143
139
nontrivial_counter += 1
144
140
145
141
# check that there is at least one nontrivial unsat core
146
142
assert nontrivial_counter >= 1
147
143
148
144
print ('success' )
149
-
150
-
0 commit comments