@@ -131,6 +131,9 @@ def test_dpll():
131
131
assert (dpll_satisfiable (A & ~ B & C & (A | ~ D ) & (~ E | ~ D ) & (C | ~ D ) & (~ A | ~ F ) & (E | ~ F )
132
132
& (~ D | ~ F ) & (B | ~ C | D ) & (A | ~ E | F ) & (~ A | E | D ))
133
133
== {B : False , C : True , A : True , F : False , D : True , E : False })
134
+ assert dpll_satisfiable (A & B & ~ C & D ) == {C : False , A : True , D : True , B : True }
135
+ assert dpll_satisfiable ((A | (B & C )) | '<=>' | ((A | B ) & (A | C ))) == {C : True , A : True } or {C : True , B : True }
136
+ assert dpll_satisfiable (A | '<=>' | B ) == {A : True , B : True }
134
137
assert dpll_satisfiable (A & ~ B ) == {A : True , B : False }
135
138
assert dpll_satisfiable (P & ~ P ) is False
136
139
@@ -154,6 +157,9 @@ def test_find_unit_clause():
154
157
def test_unify ():
155
158
assert unify (x , x , {}) == {}
156
159
assert unify (x , 3 , {}) == {x : 3 }
160
+ assert unify (x & 4 & y , 6 & y & 4 , {}) == {x : 6 , y : 4 }
161
+ assert unify (expr ('A(x)' ), expr ('A(B)' )) == {x : B }
162
+ assert unify (expr ('American(x) & Weapon(B)' ), expr ('American(A) & Weapon(y)' )) == {x : A , y : B }
157
163
158
164
159
165
def test_pl_fc_entails ():
@@ -169,6 +175,9 @@ def test_tt_entails():
169
175
assert tt_entails (P & Q , Q )
170
176
assert not tt_entails (P | Q , Q )
171
177
assert tt_entails (A & (B | C ) & E & F & ~ (P | Q ), A & E & F & ~ P & ~ Q )
178
+ assert not tt_entails (P | '<=>' | Q , Q )
179
+ assert tt_entails ((P | '==>' | Q ) & P , Q )
180
+ assert not tt_entails ((P | '<=>' | Q ) & ~ P , Q )
172
181
173
182
174
183
def test_prop_symbols ():
@@ -222,30 +231,39 @@ def test_move_not_inwards():
222
231
223
232
224
233
def test_distribute_and_over_or ():
225
- def test_enatilment (s , has_and = False ):
234
+ def test_entailment (s , has_and = False ):
226
235
result = distribute_and_over_or (s )
227
236
if has_and :
228
237
assert result .op == '&'
229
238
assert tt_entails (s , result )
230
239
assert tt_entails (result , s )
231
- test_enatilment ((A & B ) | C , True )
232
- test_enatilment ((A | B ) & C , True )
233
- test_enatilment ((A | B ) | C , False )
234
- test_enatilment ((A & B ) | (C | D ), True )
240
+ test_entailment ((A & B ) | C , True )
241
+ test_entailment ((A | B ) & C , True )
242
+ test_entailment ((A | B ) | C , False )
243
+ test_entailment ((A & B ) | (C | D ), True )
244
+
235
245
236
246
def test_to_cnf ():
237
247
assert (repr (to_cnf (wumpus_world_inference & ~ expr ('~P12' ))) ==
238
248
"((~P12 | B11) & (~P21 | B11) & (P12 | P21 | ~B11) & ~B11 & P12)" )
239
249
assert repr (to_cnf ((P & Q ) | (~ P & ~ Q ))) == '((~P | P) & (~Q | P) & (~P | Q) & (~Q | Q))'
250
+ assert repr (to_cnf ('A <=> B' )) == '((A | ~B) & (B | ~A))'
240
251
assert repr (to_cnf ("B <=> (P1 | P2)" )) == '((~P1 | B) & (~P2 | B) & (P1 | P2 | ~B))'
252
+ assert repr (to_cnf ('A <=> (B & C)' )) == '((A | ~B | ~C) & (B | ~A) & (C | ~A))'
241
253
assert repr (to_cnf ("a | (b & c) | d" )) == '((b | a | d) & (c | a | d))'
242
254
assert repr (to_cnf ("A & (B | (D & E))" )) == '(A & (D | B) & (E | B))'
243
255
assert repr (to_cnf ("A | (B | (C | (D & E)))" )) == '((D | A | B | C) & (E | A | B | C))'
256
+ assert repr (to_cnf ('(A <=> ~B) ==> (C | ~D)' )) == '((B | ~A | C | ~D) & (A | ~A | C | ~D) & (B | ~B | C | ~D) & (A | ~B | C | ~D))'
244
257
245
258
246
259
def test_pl_resolution ():
247
- # TODO: Add fast test cases
248
260
assert pl_resolution (wumpus_kb , ~ P11 )
261
+ assert pl_resolution (wumpus_kb , ~ B11 )
262
+ assert not pl_resolution (wumpus_kb , P22 )
263
+ assert pl_resolution (horn_clauses_KB , A )
264
+ assert pl_resolution (horn_clauses_KB , B )
265
+ assert not pl_resolution (horn_clauses_KB , P )
266
+ assert not pl_resolution (definite_clauses_KB , P )
249
267
250
268
251
269
def test_standardize_variables ():
@@ -302,8 +320,10 @@ def check_SAT(clauses, single_solution={}):
302
320
check_SAT ([A & B , A & C ])
303
321
check_SAT ([A | B , P & Q , P & B ])
304
322
check_SAT ([A & B , C | D , ~ (D | P )], {A : True , B : True , C : True , D : False , P : False })
323
+ check_SAT ([A , B , ~ C , D ], {C : False , A : True , B : True , D : True })
305
324
# Test WalkSat for problems without solution
306
325
assert WalkSAT ([A & ~ A ], 0.5 , 100 ) is None
326
+ assert WalkSAT ([A & B , C | D , ~ (D | B )], 0.5 , 100 ) is None
307
327
assert WalkSAT ([A | B , ~ A , ~ (B | C ), C | D , P | Q ], 0.5 , 100 ) is None
308
328
assert WalkSAT ([A | B , B & C , C | D , D & A , P , ~ P ], 0.5 , 100 ) is None
309
329
0 commit comments