@@ -131,6 +131,9 @@ def test_dpll():
131131 assert (dpll_satisfiable (A & ~ B & C & (A | ~ D ) & (~ E | ~ D ) & (C | ~ D ) & (~ A | ~ F ) & (E | ~ F )
132132 & (~ D | ~ F ) & (B | ~ C | D ) & (A | ~ E | F ) & (~ A | E | D ))
133133 == {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 }
134137 assert dpll_satisfiable (A & ~ B ) == {A : True , B : False }
135138 assert dpll_satisfiable (P & ~ P ) is False
136139
@@ -154,6 +157,9 @@ def test_find_unit_clause():
154157def test_unify ():
155158 assert unify (x , x , {}) == {}
156159 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 }
157163
158164
159165def test_pl_fc_entails ():
@@ -169,6 +175,9 @@ def test_tt_entails():
169175 assert tt_entails (P & Q , Q )
170176 assert not tt_entails (P | Q , Q )
171177 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 )
172181
173182
174183def test_prop_symbols ():
@@ -222,30 +231,39 @@ def test_move_not_inwards():
222231
223232
224233def test_distribute_and_over_or ():
225- def test_enatilment (s , has_and = False ):
234+ def test_entailment (s , has_and = False ):
226235 result = distribute_and_over_or (s )
227236 if has_and :
228237 assert result .op == '&'
229238 assert tt_entails (s , result )
230239 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+
235245
236246def test_to_cnf ():
237247 assert (repr (to_cnf (wumpus_world_inference & ~ expr ('~P12' ))) ==
238248 "((~P12 | B11) & (~P21 | B11) & (P12 | P21 | ~B11) & ~B11 & P12)" )
239249 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))'
240251 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))'
241253 assert repr (to_cnf ("a | (b & c) | d" )) == '((b | a | d) & (c | a | d))'
242254 assert repr (to_cnf ("A & (B | (D & E))" )) == '(A & (D | B) & (E | B))'
243255 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))'
244257
245258
246259def test_pl_resolution ():
247- # TODO: Add fast test cases
248260 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 )
249267
250268
251269def test_standardize_variables ():
@@ -302,8 +320,10 @@ def check_SAT(clauses, single_solution={}):
302320 check_SAT ([A & B , A & C ])
303321 check_SAT ([A | B , P & Q , P & B ])
304322 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 })
305324 # Test WalkSat for problems without solution
306325 assert WalkSAT ([A & ~ A ], 0.5 , 100 ) is None
326+ assert WalkSAT ([A & B , C | D , ~ (D | B )], 0.5 , 100 ) is None
307327 assert WalkSAT ([A | B , ~ A , ~ (B | C ), C | D , P | Q ], 0.5 , 100 ) is None
308328 assert WalkSAT ([A | B , B & C , C | D , D & A , P , ~ P ], 0.5 , 100 ) is None
309329
0 commit comments