@@ -32,18 +32,28 @@ def get_atomic_formulas(expression):
3232 return set ([expression ])
3333 elif isinstance (expression , EqualityExpression ):
3434 return set ([expression ])
35- elif isinstance (expression , IndividualVariableExpression ):
36- return set ([expression ])
37- elif isinstance (expression , EventVariableExpression ):
38- return set ([expression ])
39- elif isinstance (expression , FunctionVariableExpression ):
40- return set ([expression ])
41- elif isinstance (expression , ConstantExpression ):
35+ elif isinstance (expression , AbstractVariableExpression ):
4236 return set ([expression ])
4337 else :
4438 return expression .visit (get_atomic_formulas ,
4539 lambda parts : reduce (operator .or_ , parts , set ()))
4640
41+ def get_role_formulas (expression ):
42+ if isinstance (expression , EqualityExpression ):
43+ if isinstance (expression .first , ApplicationExpression ):
44+ variable = expression .first .argument
45+ if isinstance (variable , EventVariableExpression ):
46+ return set ([expression ])
47+ else :
48+ return set ()
49+ else :
50+ return set ()
51+ elif isinstance (expression , AbstractVariableExpression ):
52+ return set ()
53+ else :
54+ return expression .visit (get_role_formulas ,
55+ lambda parts : reduce (operator .or_ , parts , set ()))
56+
4757def new_variable (var ):
4858 var = VariableExpression (var )
4959 # isinstance(var,EventVariableExpression) must come first
@@ -61,6 +71,77 @@ def new_variable(var):
6171true_preds = ['True' , 'TrueP' ]
6272
6373def remove_true (expression ):
74+ # Remove True and TrueP
75+ if isinstance (expression , ApplicationExpression ):
76+ function = remove_true (expression .function )
77+ argument = remove_true (expression .argument )
78+ expr = ApplicationExpression (function , argument )
79+ elif isinstance (expression , EqualityExpression ):
80+ left = remove_true (expression .first )
81+ right = remove_true (expression .second )
82+ expr = EqualityExpression (left , right )
83+ elif isinstance (expression , AndExpression ):
84+ # True & A <=> A & True <=> A
85+ left = expression .first
86+ right = expression .second
87+ left_str = str (left )
88+ right_str = str (right )
89+ if left_str in true_preds :
90+ expr = remove_true (right )
91+ elif right_str in true_preds :
92+ expr = remove_true (left )
93+ else :
94+ left = remove_true (left )
95+ right = remove_true (right )
96+ expr = AndExpression (left , right )
97+ elif isinstance (expression , OrExpression ):
98+ # True or A <=> A or True <=> True
99+ left = expression .first
100+ right = expression .second
101+ left_str = str (left )
102+ right_str = str (right )
103+ if left_str in true_preds :
104+ expr = remove_true (left )
105+ elif right_str in true_preds :
106+ expr = remove_true (right )
107+ else :
108+ left = remove_true (left )
109+ right = remove_true (right )
110+ expr = OrExpression (left , right )
111+ elif isinstance (expression , ImpExpression ):
112+ # True -> A <=> A
113+ left = expression .first
114+ right = expression .second
115+ left_str = str (left )
116+ if left_str in true_preds :
117+ expr = remove_true (right )
118+ else :
119+ left = remove_true (expression .first )
120+ right = remove_true (expression .second )
121+ expr = ImpExpression (left , right )
122+ elif isinstance (expression , NegatedExpression ):
123+ term = remove_true (expression .term )
124+ expr = NegatedExpression (term )
125+ elif isinstance (expression , ExistsExpression ):
126+ variable = expression .variable
127+ term = expression .term
128+ term = remove_true (term )
129+ expr = ExistsExpression (variable , term )
130+ elif isinstance (expression , AllExpression ):
131+ variable = expression .variable
132+ term = expression .term
133+ term = remove_true (term )
134+ expr = AllExpression (variable , term )
135+ elif isinstance (expression , LambdaExpression ):
136+ variable = expression .variable
137+ term = expression .term
138+ term = remove_true (term )
139+ expr = LambdaExpression (variable , term )
140+ else :
141+ expr = expression
142+ return expr
143+
144+ def remove_true_ (expression ):
64145 # Remove True and TrueP
65146 if isinstance (expression , ApplicationExpression ):
66147 function = remove_true (expression .function )
@@ -148,7 +229,6 @@ def remove_true(expression):
148229 expr = expression
149230 return expr
150231
151-
152232def rename_variable (expression ):
153233 # Rename bound variables so that no variable with the same name is bound
154234 # by two different quantifiers in different parts of a formula
0 commit comments