6 changed files with 138 additions and 0 deletions
-
28Lecture3/colours.py
-
35Lecture3/equality.py
-
9Lecture3/example_quantifier.py
-
9Lecture3/example_unsat_core.py
-
57Lecture3/snippet.py
-
BINLecture_05b_SS24_Z3_intro_contd.pdf
@ -0,0 +1,28 @@ |
|||
from itertools import combinations |
|||
from z3 import * |
|||
|
|||
solver = Solver() |
|||
|
|||
Colours = Datatype("Colours") |
|||
Colours.declare("RED") |
|||
Colours.declare("BLUE") |
|||
Colours.declare("GREEN") |
|||
Colours.declare("YELLOW") |
|||
|
|||
Colour = Colours.create() |
|||
f = Function('f', IntSort(), Colour) |
|||
|
|||
variables = list() |
|||
for i in range(0,5): |
|||
variables.append(Int(i)) |
|||
solver.add(0 <= variables[-1]) |
|||
solver.add(variables[-1] <= 5) |
|||
|
|||
solver.add(Distinct(variables)) |
|||
|
|||
for combi in combinations(variables,2): |
|||
solver.add(Implies(Abs(combi[0] - combi[1]) == 1, f(combi[0]) != f(combi[1]))) |
|||
|
|||
result = solver.check() |
|||
if result == sat: |
|||
print(solver.model()) |
@ -0,0 +1,35 @@ |
|||
from z3 import * |
|||
s = Solver() |
|||
bv_size = 4 |
|||
a, b = BitVecs('a b', bv_size) |
|||
x = BitVec('x', bv_size) |
|||
lhs,rhs = BitVecs('lhs rhs', bv_size) |
|||
|
|||
|
|||
s.add(lhs == ((x+a)^b)-a) |
|||
s.add(rhs == ((x-a)^b)+a) |
|||
s.push() |
|||
s.add(ForAll(x, lhs == rhs)) |
|||
# enumerate all possible solutions: |
|||
results=[] |
|||
while True: |
|||
if s.check() == sat: |
|||
m = s.model() |
|||
print (m) |
|||
results.append(m) |
|||
block = [] |
|||
block = [a != m[a].as_long(), b != m[b].as_long()] |
|||
s.add(Or(block)) |
|||
else: |
|||
print ("results total=", len(results)) |
|||
break |
|||
#print(s.sexpr()) |
|||
|
|||
s.pop() |
|||
s.add(Exists(x, lhs != rhs)) |
|||
result = s.check() |
|||
print(result) |
|||
if result == sat: |
|||
print(f"Example where lhs != rhs: {s.model()}") |
|||
|
|||
|
@ -0,0 +1,9 @@ |
|||
from z3 import * |
|||
|
|||
x, y = Ints("x y") |
|||
|
|||
solver = Solver() |
|||
# Check if for all x and y, s.t. if x < 0 and y < 0, x + y < 0 |
|||
|
|||
result = solver.check() |
|||
print(result) |
@ -0,0 +1,9 @@ |
|||
from z3 import * |
|||
|
|||
p, q = Bools('p q') |
|||
s = Solver() |
|||
s.add(Not(q)) |
|||
s.assert_and_track(q, "p1") |
|||
s.assert_and_track(p, "p2") |
|||
print(s.check()) |
|||
print(s.unsat_core()) |
@ -0,0 +1,57 @@ |
|||
solver = z3.Solver() |
|||
|
|||
num = len(matching) |
|||
goal_steps = [[z3.Int(f'g-{n}-{t}') for t in range(num+1)] for n in range(num)] # goal number-of-match time |
|||
goal_steps_bool = [[z3.Bool(f'gb-{n}-{t}') for t in range(num+1)] for n in range(num)] |
|||
start_steps = [[z3.Int(f's-{n}-{t}') for t in range(num+1)] for n in range(num)] # start number-of-match time |
|||
start_steps_bool = [[z3.Bool(f'sb-{n}-{t}') for t in range(num+1)] for n in range(num)] |
|||
|
|||
for n in range(num): |
|||
for t in range(num+1): |
|||
solver.add(z3.Or(start_steps[n][t]==0,start_steps[n][t]==1)) |
|||
solver.add(z3.Or(goal_steps[n][t]==0,goal_steps[n][t]==1)) |
|||
|
|||
# start and end always different |
|||
solver.add(start_steps[n][t] != goal_steps[n][t]) |
|||
|
|||
solver.add(goal_steps_bool[n][t] == z3.If(goal_steps[n][t]==1,True,False)) |
|||
solver.add(goal_steps[n][t] == z3.If(goal_steps_bool[n][t]==True,1,0)) |
|||
solver.add(start_steps_bool[n][t] == z3.If(start_steps[n][t]==1,True,False)) |
|||
solver.add(start_steps[n][t] == z3.If(start_steps_bool[n][t]==True,1,0)) |
|||
|
|||
for t in range(num+1): |
|||
solver.add(z3.Sum([goal_steps[ni][t] for ni in range(num)]) == t) # at t=0, all goals false -> increasing |
|||
|
|||
# given implicitly, s != g |
|||
# starts_at_t = [start_steps[ni][t] for ni in range(num)] |
|||
# solver.add(z3.Sum(starts_at_t) == (num-t)) # at t=0, all start |
|||
|
|||
for n in range(num): |
|||
for t in range(num+1): |
|||
solver.add(z3.Implies(goal_steps_bool[n][t],z3.And(goal_steps_bool[n][t+1:num+1]))) |
|||
|
|||
for s_pt,_,g_vec in start_intersect_triple: |
|||
s_pt_i = find_index_init(matching,s_pt) |
|||
g_vec_i = find_index_goal(matching,g_vec) |
|||
conflicting_starts = [] |
|||
for t in range(num+1): |
|||
conflicting_starts.append(z3.Implies( goal_steps_bool[g_vec_i][t],z3.Or( [z3.Not(start_steps_bool[s_pt_i][ti]) for ti in range(t)] ) )) |
|||
solver.assert_and_track(z3.And(conflicting_starts), f"s-i1:{s_pt_i};i2:{g_vec_i}") |
|||
|
|||
for g_pt,_,g_vec in goal_intersect_triple: |
|||
g_pt_i = find_index_goal(matching,g_pt) |
|||
g_vec_i = find_index_goal(matching,g_vec) |
|||
conflicting_goals = [] |
|||
for t in range(num+1): |
|||
conflicting_goals.append(z3.Implies( goal_steps_bool[g_pt_i][t], z3.Or([goal_steps_bool[g_vec_i][ti] for ti in range(t)]) )) |
|||
solver.assert_and_track(z3.And(conflicting_goals),f"g-i1:{g_pt_i};i2:{g_vec_i}") |
|||
|
|||
|
|||
res = solver.check() |
|||
if res == z3.sat: |
|||
print(solver.model()) |
|||
else: |
|||
core = solver.unsat_core() |
|||
print(solver.sexpr()) |
|||
print(core) |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue