-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFrameManager.py
66 lines (48 loc) · 1.71 KB
/
FrameManager.py
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
62
63
64
65
66
from z3 import *
from utils import *
solver = Solver()
frame_variables = []
frame_clauses = []
# constant z3 variables for giving true and false values
solver.add(f_val == False)
solver.add(t_val == True)
def add_clause_to_frames(i, clause):
if i >= len(frame_variables):
frame_variables.append(Bool(str(i)))
frame_clauses.append([])
if not clause_present_in_frame(i, clause):
solver.add(Implies(frame_variables[i], clause))
frame_clauses[i].append(clause)
def clause_present_in_frame(i, clause):
for frame_clause in frame_clauses[i]:
# if eq(simplify(clause), simplify(frame_clause)):
# return True
if check_equality(frame_clause, clause):
return True
return False
def check_equality(clause_1, clause_2):
temp = Solver()
temp.add(Not(clause_1 == clause_2))
r = temp.check()
return r == unsat
def print_frame_clauses():
for frame in frame_clauses:
print(frame)
def print_frames():
for frame in frame_variables:
print(frame)
#Checks if there exists distinct i,i+1 such that Frame i = Frame i+1
def check_frames_equality():
F = [True for i in range(len(frame_variables))]
for i in range(len(frame_variables)):
# Extract states satisfying F_i
for clause in frame_clauses[i]:
F[i] = And(F[i],clause)
#Check equality of any two consecutive frames
for i in range(len(frame_variables) - 1):
if check_equality(F[i],F[i+1]):
print("\nFrames " + str(i) + " and " + str(i+1) + " are equal!")
print("\nFrames " + str(i) + " = " + str(F[i]))
print("\nFrames " + str(i+1) + " = " + str(F[i+1]))
return True
return False