def test_or_and_call_with_cut(): e = get_engine(""" f :- (!, fail); true. g :- (call(!), fail); true. """) assert_false("f.", e) assert_true("g.", e)
def test_copy_term_3(): assert_true("copy_term(a, a, []).") assert_true("copy_term(X, Y, []), X \== Y.") assert_false("put_attr(X, foor, bar), copy_term(X, Y, _), X == Y.") assert_false("put_attr(X, foo, bar), copy_term(X, Y, Z), attvar(Y).") assert_true("put_attr(X, foo, bar), copy_term(X, Y, Z), \+ attvar(Y).") assert_true( "put_attr(X, foo, bar), copy_term(X, Y, Z), Z == [put_attr(Y, foo, bar)], X \== Y." ) assert_true( "put_attr(X, foo, bar), put_attr(X, blar, blupp), copy_term(X, Y, Z), Z == [put_attr(Y, foo, bar), put_attr(Y, blar, blupp)], X \== Y." ) e = get_engine("", m=""" :- module(m, []). attr_unify_hook(_, _). """) assert_true("put_attr(X, m, 1), X = a, copy_term(X, a, Z), Z == [].", e) assert_true( "put_attr(X, a, 1), put_attr(Y, b, 2), copy_term(f(X,Y), f(A, B), [put_attr(A, a, 1), put_attr(B, b, 2)]), Z \== f(X, Y)." ) assert_true("put_attr(X, a, Y), copy_term(X, A, [put_attr(A, a, Y)]).") assert_true("(put_attr(X, m, 1), fail; true), copy_term(X, A, []).") assert_true( "copy_term(X, A, []), put_attr(X, m, 1), copy_term(X, A, [put_attr(A, m, 1)])." )
def test_or_with_cut(): e = get_engine(""" f(X) :- ((X = 1, !); X = 2), X = 2. g(X) :- ((X = 1, !); X = 2), X = 1. """) assert_false("f(X).", e) assert_true("g(X).", e)
def test_term_attvars(): e = get_engine("", m=""" :- module(m, []). attr_unify_hook(_, _). """) assert_true("term_attvars(a, []).") assert_true("term_attvars([], []).") assert_false("term_attvars([], 1).") assert_true("put_attr(X, m, 1), term_attvars(X, [X]).") assert_true("term_attvars(X,Y), Y == [].") assert_true("put_attr(X, m, 1), term_attvars(f(g(h(X)), X), [X]).") assert_true( "put_attr(X, m, 1), put_attr(Y, m, 2), term_attvars(f(X, Y), [X, Y]).") assert_false( "put_attr(X, m, 1), put_attr(Y, m, 2), X = Y, term_attvars(f(X, Y), [X, Y]).", e) assert_true( "put_attr(X, m, 1), put_attr(Y, m, 2), X = Y, term_attvars(f(X, Y), [X]).", e) assert_true( "put_attr(X, m, 1), put_attr(Y, m, 2), X = Y, term_attvars(f(X, Y), [Y]).", e) assert_true("put_attr(X, m, 1), term_attvars(f(A, X, B, X), [X]).") assert_true("put_attr(X, m, 1), Y = X, term_attvars(f(X, Y), [Y]).") assert_true("put_attr(X, m, 1), Y = X, term_attvars(f(X, Y), [X]).") assert_true("term_attvars(X, []), put_attr(X, m, 1).") assert_true( "put_attr(X, m , 1), term_attvars(X, [X]), del_attr(X, m), term_attvars(X, [])." ) assert_true("put_attr(X, m, Y), term_variables(X, L), L == [X].")
def test_sub_atom_with_non_var_sub(): assert_true( "sub_atom(abcabc, Before, Length, After, a), Before=3, Length=1, After=2." ) assert_false( "sub_atom(abcabc, Before, Length, After, b), Before==3, Length==1, After==2." )
def test_backtracking(): assert_false("(put_attr(X, m, 1), fail); attvar(X).") assert_false("put_attr(X, m, 2), (put_attr(X, m, 1), fail); get_attr(X, m, 2).") assert_true("(put_attr(X, b, 1), fail); \+ get_attr(X, b, 1).") assert_true("put_attr(X, a, 2), ((put_attr(X, b, 1), fail); get_attr(X, a, 2)), \+ get_attr(X, b, 1).") assert_true("put_attr(X, a, 2), ((put_attr(X, a, 1), put_attr(X, a, 3), fail); get_attr(X, a, 2)).") assert_true("put_attr(X, a, 2), ((put_attr(X, b, 1), put_attr(X, c, 3), fail); get_attr(X, a, 2)), \+ get_attr(X, b, 1), \+ get_attr(X, c, 3).")
def test_integration_efficient_bools(): e = get_engine("", swi_bool_pred = """ :- module(swi_bool_pred, [negate/2]). negate(X, Y) :- ( nonvar(X) -> negate3(X, Y) ; nonvar(Y) -> negate3(Y, X) ; get_attr(X, swi_bool_pred, OtherX) -> Y = OtherX, X \== Y, put_attr(Y, swi_bool_pred, X) ; get_attr(Y, swi_bool_pred, OtherY) -> X = OtherY, X \== Y, put_attr(X, swi_bool_pred, Y) ; X \== Y, put_attr(Y, swi_bool_pred, X), put_attr(X, swi_bool_pred, Y) ). negate3(pred_true, pred_false). negate3(pred_false, pred_true). attr_unify_hook(Other, Value) :- (var(Value) -> (get_attr(Value, swi_bool_pred, Other2) -> Other = Other2, Value \== Other ; put_attr(Value, swi_bool_pred, Other) ) ; negate3(Value, Other)). """) assert_true("swi_bool_pred:negate(X,Y), swi_bool_pred:negate(Y,Z), X==Z, Z=pred_true, X==pred_true, Y==pred_false.", e) assert_true("swi_bool_pred:negate(X,Y), swi_bool_pred:negate(Y,Z), X==Z, Z=pred_true, X==pred_true, Y==pred_false.", e) assert_true("swi_bool_pred:negate(X,Y), swi_bool_pred:negate(X2,Y2), X=X2, Y==Y2, Y=pred_false, X2==pred_true.", e) assert_true("swi_bool_pred:negate(X,Y), swi_bool_pred:negate(X,Z), Y==Z, Z=pred_true, X==pred_false.", e) assert_true("swi_bool_pred:negate(X,Y), swi_bool_pred:negate(Y,Z), \+ swi_bool_pred:negate(Z,X).", e) assert_true("swi_bool_pred:negate(X,Y), swi_bool_pred:negate(Y,Z), swi_bool_pred:negate(Z,X2), \+ X2=X.", e) assert_true("swi_bool_pred:negate(X,Y), swi_bool_pred:negate(Y,Z), X2=X, \+ swi_bool_pred:negate(Z,X2).", e) assert_false("swi_bool_pred:negate(X,X).", e)
def test_numbervars_bindings(): assert_true(""" X = f(A,B,C), numbervars(X, 0, 3), X = f('$VAR'(0), '$VAR'(1), '$VAR'(2)). """, e) assert_true(""" X = f(A,B,C), numbervars(X, 5, 8), X = f('$VAR'(5), '$VAR'(6), '$VAR'(7)). """, e) assert_false(""" X = f(A,B,C), A = 123, B = C, numbervars(X, 5, 8), X = f('$VAR'(5), '$VAR'(6), '$VAR'(7)). """, e) assert_false(""" X = f(A,B,C), A = '$VAR'(5), numbervars(X, 5, 8), X = f('$VAR'(5), '$VAR'(6), '$VAR'(7)). """, e) assert_true(""" X = f(A,B,C), A = '$VAR'(5), numbervars(X, 5, 7), X = f('$VAR'(5), '$VAR'(5), '$VAR'(6)). """, e)
def test_block(): e = get_engine(""" :- block f('?', '-', '?'), f('-', '-', '?'). :- block g('?'). :- block h('-', '-', '-', '?'), h('-', '-', '?', '?'), h('-', '?', '?', '?'). f(A, B, C) :- C = 10. g(_) :- assert(gg(1)). h(A, B, C, D) :- D is A + B + C. """, load_system=True) assert_false("f(X, Y, Z), Z == 10.", e) assert_false("f(a, X, Z), Z == 10.", e) assert_true("f(a, b, Z), Z == 10.", e) assert_true("f(a, X, Z), \+ Z == 10, X = 5, Z == 10.", e) assert_true("f(A, B, Z), \+ Z == 10, A = a, \+ Z == 10, B = b, Z == 10.", e) assert_true("f(a, X, Z), (X = 1, fail; true), var(Z).", e) prolog_raises("existence_error(_, _)", "g(5), gg(1)", e) prolog_raises("existence_error(_, _)", "g(X), gg(1)", e) assert_true("h(A, B, C, D), var(D), C = 5, var(D), B = 5, var(D), A = 5, D == 15.", e) prolog_raises("instantiation_error", "h(5, B, C, D)", e) prolog_raises("instantiation_error", "h(5, 1, C, D)", e) assert_true("h(1, 2, 3, 6).", e) assert_true("h(A, B, C, D), var(D), B = 5, var(D), C = 5, var(D), A = 5, D == 15.", e)
def test_retract_logical_update_view(): e = get_engine(""" p :- retract(p :- true), fail. p :- true. """) assert_true("p.", e) assert_false("p.", e)
def test_strings(): assert_true('X = "abc", X = [97, 98, 99].') assert_true('X = "", X = [].') assert_true('X = [97], X = "a".') assert_true('X = [97], X = Y, Y = "a".') assert_false('X = "a", X = \'a\'.') assert_true('X = "²³¼½¬", X = [178, 179, 188, 189, 172].') assert_true('X = [], X = "".')
def test_basic_term_variables(): assert_true("term_variables(X, [X]).") assert_false("term_variables(X, []).") assert_true("term_variables(f(X, Y), [X, Y]).") assert_true("term_variables(a, []).") assert_true("term_variables(123, []).") assert_true("term_variables(f(Z, g(X), Y), [Z, X, Y]).") assert_false("term_variables(a, a).")
def test_repeat(): assert_true("repeat, true.") e = Engine() assert_false("repeat, !, fail.") # hard to test repeat differently e = get_engine('f :- repeat, !, fail.') assert_false('f.', e) assert_true('f; true.', e)
def test_between(): assert_true("between(12, 15, 12).") assert_true("between(-5, 15, 0).") assert_false("between(12, 15, 6).") assert_false("between(12, 15, 16).") heaps = collect_all(Engine(), "between(1, 4, X).") assert len(heaps) == 4 assert heaps[0]['X'].num == 1 assert heaps[-1]['X'].num == 4
def test_comparison(): assert_true("1 =:= 1.0.") assert_true("1 + 1 > 1.") assert_true("1 + 0.001 >= 1 + 0.001.") assert_true("1 + 0.001 =< 1 + 0.001.") assert_false("1 > 1.") assert_true("1.1 > 1.") assert_false("1 =\\= 1.0.") assert_true("1 =\\= 32.")
def test_del_attrs(): assert_true("del_attrs(1).") assert_true("del_attrs(a).") assert_true("\+ attvar(X), del_attrs(X).") assert_false("put_attr(X, m, 1), del_attrs(X), get_attr(X, m, 1).") assert_true("put_attr(X, m, 1), del_attrs(X), \+ attvar(X).") assert_true("put_attr(X, m, 1), del_attrs(X), del_attrs(X).") assert_true("put_attr(X, m, 1), (del_attrs(X), fail; true), get_attr(X, m, 1).") assert_true("put_attr(X, m, 1), put_attr(X, m, 2), del_attrs(X), \+ attvar(X).")
def test_call_cut(): e = get_engine(""" f(X) :- call(X). f(!). """) heaps = collect_all(e, "f(!).") assert len(heaps) == 2 assert_true("call(((X = a; X = b), !, X = b)); X = c.") assert_false("(((X = a; X = b), !, X = b)); X = c.")
def test_or(): assert_false("fail;fail.") e = get_engine(""" f(X, Y) :- ( fail ; X \== Y ). """) assert_false("f(X,X).", e)
def xtest_get_attrs(): assert_false("get_attrs(X, Y).") assert_false("get_attrs(a, Y).") assert_false("get_attrs(1, Y).") assert_true("put_attr(X, m, 1), get_attrs(X, att(m, 1, [])).") assert_false("put_attr(X, m, 1), get_attrs(f(X), att(m, 1, [])).") assert_true("put_attr(X, m, 1), put_attr(X, a, 2), get_attrs(X, att(m, 1, att(a, 2, []))).") assert_false("(put_attr(X, m, 1), fail; true), get_attrs(X, L).") assert_true("put_attr(X, m, 1), put_attr(Y, m, X), get_attrs(Y, att(m, X, [])), get_attrs(X, att(m, 1, [])).")
def test_frozen(): assert_false("frozen(a, a).", e) assert_true("frozen(1, X), X == true.", e) assert_true("frozen(X, X), X == true.", e) assert_true("frozen(X, Y), Y == true, var(X).", e) assert_true("freeze(X, f(a)), frozen(X, user:f(a)).", e) assert_true("freeze(X, m:g(q)), frozen(X, R), R == m:g(q).", e) assert_true("freeze(X, true), frozen(X, user:true), freeze(X, fail), frozen(X, (user:true, user:fail)).", e) assert_true("freeze(X, true), X = a, frozen(X, R), R == true.", e)
def test_4_queens(): e = get_engine(""" queens(Vars) :- Vars = [_A, _B, _C, _D], safe(Vars), perm([1,2,3,4], Vars). safe([]). safe([H|T]) :- safe(T), attack(H, 1, T). attack(_, _, []). attack(X, N, [H|T]) :- when((nonvar(X), nonvar(H)), (not(X is H + N; X is H - N))), N1 is N + 1, attack(X, N1, T). perm([1,2,3,4], [1,2,3,4]). perm([1,2,3,4], [1,2,4,3]). perm([1,2,3,4], [1,3,2,4]). perm([1,2,3,4], [1,3,4,2]). perm([1,2,3,4], [1,4,2,3]). perm([1,2,3,4], [1,4,3,2]). perm([1,2,3,4], [2,1,3,4]). perm([1,2,3,4], [2,1,4,3]). perm([1,2,3,4], [2,3,1,4]). perm([1,2,3,4], [2,3,4,1]). perm([1,2,3,4], [2,4,1,3]). perm([1,2,3,4], [2,4,2,1]). perm([1,2,3,4], [3,1,2,4]). perm([1,2,3,4], [3,1,4,2]). perm([1,2,3,4], [3,2,1,4]). perm([1,2,3,4], [3,2,4,1]). perm([1,2,3,4], [3,4,1,2]). perm([1,2,3,4], [3,4,2,1]). perm([1,2,3,4], [4,1,3,2]). perm([1,2,3,4], [4,1,2,3]). perm([1,2,3,4], [4,2,1,3]). perm([1,2,3,4], [4,2,3,1]). perm([1,2,3,4], [4,3,1,2]). perm([1,2,3,4], [4,3,2,1]). """, load_system=True) assert_true("queens([2, 4, 1, 3]).", e) assert_true("queens([3, 1, 4, 2]).", e) assert_false("queens([4, 2, 1, 3]).", e) assert_true("queens(X), X == [2, 4, 1, 3].", e) assert_true("queens(X), X == [3, 1, 4, 2].", e) assert_false("queens(X), X == [4, 2, 1, 3].", e) assert_true("findall(X, queens(X), L), L == [[2, 4, 1, 3], [3, 1, 4, 2]].", e)
def XXX_test_at_end_of_stream_or(): src = "__src__" create_file(src, "a") try: assert_false(""" open('%s', read, S), (at_end_of_stream(S); at_end_of_stream(S)). """ % src) finally: delete_file(src)
def test_put_attrs(): e = Engine(load_system=True) assert_false("put_attrs(X, []), attvar(X).", e) prolog_raises("representation_error(A, B)", "put_attrs(a, [])", e) prolog_raises("representation_error(A, B)", "put_attrs(a, att(m, 1, []))", e) assert_true("put_attrs(X, att(m, 1, [])), get_attr(X, m, 1).", e) assert_true("put_attrs(X, att(m, 1, att(n, W, []))), get_attr(X, m, 1), get_attr(X, n, W).", e) assert_false("put_attrs(X, att(m, 1, [])), fail; attvar(X).", e) assert_true("put_attr(X, m, 1), (put_attrs(X, att(m, 2, [])), fail; true), get_attr(X, m, 1).", e) assert_true("put_attr(X, m, 1), put_attrs(X, att(m, 2, [])), get_attr(X, m, 2).", e)
def test_del_attributes(): assert_true("del_attr(X, m).") assert_true("del_attr(a, m).") prolog_raises("instantiation_error", "del_attr(X, Y)") prolog_raises("type_error(A, B)", "del_attr(X, 1)") assert_false("put_attr(X, m, 1), del_attr(X, m), attvar(X).") assert_true("""put_attr(X, m, 1), put_attr(X, m2, 2), del_attr(X, m), attvar(X).""") assert_true("put_attr(X, m, 1), (del_attr(X, m), fail; true), get_attr(X, m, 1).") assert_true("put_attr(X, m, 1), (del_attr(X, m), fail; attvar(X)).")
def test_del_attrs(): assert_true("del_attrs(1).") assert_true("del_attrs(a).") assert_true("\+ attvar(X), del_attrs(X).") assert_false("put_attr(X, m, 1), del_attrs(X), get_attr(X, m, 1).") assert_true("put_attr(X, m, 1), del_attrs(X), \+ attvar(X).") assert_true("put_attr(X, m, 1), del_attrs(X), del_attrs(X).") assert_true( "put_attr(X, m, 1), (del_attrs(X), fail; true), get_attr(X, m, 1).") assert_true( "put_attr(X, m, 1), put_attr(X, m, 2), del_attrs(X), \+ attvar(X).")
def test_del_attributes(): assert_true("del_attr(X, m).") assert_true("del_attr(a, m).") prolog_raises("instantiation_error", "del_attr(X, Y)") prolog_raises("type_error(A, B)", "del_attr(X, 1)") assert_false("put_attr(X, m, 1), del_attr(X, m), attvar(X).") assert_true("""put_attr(X, m, 1), put_attr(X, m2, 2), del_attr(X, m), attvar(X).""") assert_true( "put_attr(X, m, 1), (del_attr(X, m), fail; true), get_attr(X, m, 1).") assert_true("put_attr(X, m, 1), (del_attr(X, m), fail; attvar(X)).")
def test_unifiable(): assert_false("unifiable(a, b, _).", e) assert_true("unifiable(a, a, X), X == [].", e) assert_true("unifiable(X, X, L), L == [].", e) assert_true("unifiable(X, Y, L), L == [X-Y].", e) assert_true("unifiable(f(a), f(a), L), L == [].", e) assert_true("unifiable([A, B, C], T, X), X == [T-[A, B, C]].", e) assert_true("unifiable([A, B, C], [S|T], X), X == [T-[B, C], A-S].", e) assert_true("unifiable(f(a, b, T), X, L), L == [X-f(a, b, T)].", e) assert_true("unifiable(f(g(t(Z)), b, x(y(a))), f(g(Q), b, x(y(A))), L), L == [A-a, Q-t(Z)].", e) assert_true("unifiable([X1, X2, X3], [Y1, Y2, Y3], L), L == [X3-Y3, X2-Y2, X1-Y1].", e)
def test_when_ground(): assert_true("when(ground(f(X, Y)), Z = 1), X = 1, var(Z), Y = a, Z == 1.", e) assert_true("when(ground(f(X, Y)), Z = 1), Y = 1, var(Z), X = a, Z == 1.", e) assert_false("when(ground(f(X, Y)), Z = 1), X = 1, Z == 1.", e) assert_true( "when((ground(X), ground(Y)), Z = 1), X = a, var(Z), Y = b, Z == 1.", e) assert_true( "when((ground(X), ground(Y)), Z = 1), Y = a, var(Z), X = b, Z == 1.", e) assert_true("when((ground(a), ground(Y)), Z = 1), var(Z), Y = a, Z == 1.", e) assert_true("when((ground(X), ground(a)), Z = 1), var(Z), X = a, Z == 1.", e) assert_true("when((ground(a), ground(a)), Z = 1), Z == 1.", e) assert_true("when((ground(X); ground(Y)), Z = 1), var(Z), Y = b, Z == 1.", e) assert_true("when((ground(X); ground(Y)), Z = 1), var(Z), X = b, Z == 1.", e) assert_true( "when((ground(X); ground(Y)), Z = 1), var(Z), Y = b, Z == 1, X = a.", e) assert_true( "when((ground(X); ground(Y)), test_once(Z)), var(Z), Y = b, Z == 1, X = a.", e) assert_true("when(ground(1), m:g(q)).", e) assert_true("when(ground(X), Y = 1), X = a, Y == 1.", e) assert_true( "when(ground(X), Y = 1), when(ground(X), Z = 2), X = a, Y == 1, Z == 2.", e) assert_true( "when(ground(X), Y), when(ground(A), Y = (B = 3)), A = a, X = q, Y == (3 = 3).", e) assert_true( "when(ground(f(X, Y)), when(ground(X), Z = 1)), X = a, var(Z), Y = b, Z == 1.", e) assert_true( "when(ground(f(X, Y)), when(ground(A), Z = 1)), X = a, var(Z), Y = b, var(Z), A = 1, Z == 1.", e) assert_true( "when(ground(X), A = 1), when(ground(Y), B = 2), X = Y, var(A), var(B), X = a, A == 1, B == 2.", e) assert_true( "when(ground(X), A = 1), when(ground(Y), B = 2), Y = X, var(A), var(B), X = a, A == 1, B == 2.", e) assert_true( "when(ground(X), A = 1), when(ground(Y), B = 2), X = Y, var(A), var(B), Y = a, A == 1, B == 2.", e) assert_true( "when(ground(X), A = 1), when(ground(Y), B = 2), Y = X, var(A), var(B), Y = a, A == 1, B == 2.", e)
def test_frozen(): assert_false("frozen(a, a).", e) assert_true("frozen(1, X), X == true.", e) assert_true("frozen(X, X), X == true.", e) assert_true("frozen(X, Y), Y == true, var(X).", e) assert_true("freeze(X, f(a)), frozen(X, user:f(a)).", e) assert_true("freeze(X, m:g(q)), frozen(X, R), R == m:g(q).", e) assert_true( "freeze(X, true), frozen(X, user:true), freeze(X, fail), frozen(X, (user:true, user:fail)).", e) assert_true("freeze(X, true), X = a, frozen(X, R), R == true.", e)
def test_retract_rule_from_other_module(): e = get_engine(""" :- use_module(m). """, m=""" :- module(m, []). a. """) assert_false("retract(a).", e) assert_true("m:retract(a).", e) assert_false("m:retract(a).", e)
def test_retract_rule_from_other_module(): e = get_engine(""" :- use_module(m). """, m = """ :- module(m, []). a. """) assert_false("retract(a).", e) assert_true("m:retract(a).", e) assert_false("m:retract(a).", e)
def test_assert_at_right_end(): e = get_engine("g(b, b). f(b, b). h(b, b).") assert_true("assert(g(a, a)).", e) assert_true("assertz(f(a, a)).", e) assert_true("A = a, asserta(h(A, A)).", e) f = assert_true("g(B, B).", e) assert f['B'].name()== "b" f = assert_true("f(B, B).", e) assert f['B'].name()== "b" assert_false("h(c, c).", e) f = assert_true("h(B, B).", e) assert f['B'].name()== "a"
def test_assert_at_right_end(): e = get_engine("g(b, b). f(b, b). h(b, b).") assert_true("assert(g(a, a)).", e) assert_true("assertz(f(a, a)).", e) assert_true("A = a, asserta(h(A, A)).", e) f = assert_true("g(B, B).", e) assert f['B'].name() == "b" f = assert_true("f(B, B).", e) assert f['B'].name() == "b" assert_false("h(c, c).", e) f = assert_true("h(B, B).", e) assert f['B'].name() == "a"
def test_term_attvars_fail_fast(): py.test.skip("") e = get_engine(""" f(1, [X]) :- put_attr(X, m, 1). f(N, [X|R]) :- N >= 1, put_attr(X, m, 1), N1 is N - 1, f(N1, R). """) assert_false("f(10000, L), term_attvars(L, []).", e)
def test_attr_unify_hook_choice(): e = get_engine("", m=""" :- module(m, []). attr_unify_hook(Attr, f(Value)) :- Value = a; Value = b. """) assert_false("put_attr(X, m, 1), X = c.", e) assert_false("put_attr(X, m, 1), X = f(c).", e) assert_true("put_attr(X, m, 1), X = f(Y), Y = a.", e) assert_true("put_attr(X, m, 1), X = f(Y), Y = b.", e)
def test_nonvar(): e = get_engine(""" g(X) :- nonvar(X). g(x, X) :- nonvar(x), nonvar(X). f(X, Y) :- nonvar(X), nonvar(Y). """) assert_true("g(a).", e) assert_false("g(X).", e) assert_true("g(x).", e) assert_true("g(x, a).", e) assert_true("g(X, X).", e) assert_false("f(X, X).", e)
def test_attr_unify_hook_choice(): e = get_engine("", m = """ :- module(m, []). attr_unify_hook(Attr, f(Value)) :- Value = a; Value = b. """) assert_false("put_attr(X, m, 1), X = c.", e) assert_false("put_attr(X, m, 1), X = f(c).", e) assert_true("put_attr(X, m, 1), X = f(Y), Y = a.", e) assert_true("put_attr(X, m, 1), X = f(Y), Y = b.", e)
def test_retract_other_module(): e = get_engine("", m=""" :- module(m, []). f(a). f(b). """) assert_true("m:f(a), m:f(b).", e) assert_true("retract(m:f(a)).", e) assert_false("retract(m:f(a)).", e) assert_false("m:f(a).", e) assert_true("m:f(b).", e) assert_true("retract(m:f(b)).", e) prolog_raises("existence_error(_, _)", "f(b)", e)
def xtest_get_attrs(): assert_false("get_attrs(X, Y).") assert_false("get_attrs(a, Y).") assert_false("get_attrs(1, Y).") assert_true("put_attr(X, m, 1), get_attrs(X, att(m, 1, [])).") assert_false("put_attr(X, m, 1), get_attrs(f(X), att(m, 1, [])).") assert_true( "put_attr(X, m, 1), put_attr(X, a, 2), get_attrs(X, att(m, 1, att(a, 2, [])))." ) assert_false("(put_attr(X, m, 1), fail; true), get_attrs(X, L).") assert_true( "put_attr(X, m, 1), put_attr(Y, m, X), get_attrs(Y, att(m, X, [])), get_attrs(X, att(m, 1, []))." )
def test_assert_retract(): e = get_engine("g(b, b).") assert_true("g(B, B).", e) assert_true("assert(g(c, d)).", e) assert_true("assert(g(a, b)).", e) assert_true("assert(g(a, b)).", e) # assert the same rule multiple times assert_true("g(B, B).", e) assert_true("g(a, b).", e) assert_true("g(c, d).", e) assert_true("retract(g(B, B)).", e) assert_false("g(B, B).", e) assert_true("retract(g(a, b)).", e) assert_true("g(a, b).", e) assert_true("retract(g(a, b)).", e) assert_false("retract(g(a, b)).", e) assert_false("g(a, b).", e) assert_true("g(c, d).", e) e = get_engine(""" g(b, b). f(X) :- g(X, b). f(a). """) assert_true("f(b).", e) assert_true("f(a).", e) assert_true("retract(f(X) :- g(X, Y)), Y == b.", e) assert_false("f(b).", e) assert_true("f(a).", e) prolog_raises("permission_error(X, Y, Z)", "retract(atom(X))")
def test_backtracking(): assert_false("(put_attr(X, m, 1), fail); attvar(X).") assert_false( "put_attr(X, m, 2), (put_attr(X, m, 1), fail); get_attr(X, m, 2).") assert_true("(put_attr(X, b, 1), fail); \+ get_attr(X, b, 1).") assert_true( "put_attr(X, a, 2), ((put_attr(X, b, 1), fail); get_attr(X, a, 2)), \+ get_attr(X, b, 1)." ) assert_true( "put_attr(X, a, 2), ((put_attr(X, a, 1), put_attr(X, a, 3), fail); get_attr(X, a, 2))." ) assert_true( "put_attr(X, a, 2), ((put_attr(X, b, 1), put_attr(X, c, 3), fail); get_attr(X, a, 2)), \+ get_attr(X, b, 1), \+ get_attr(X, c, 3)." )
def test_retract_other_module(): e = get_engine("", m = """ :- module(m, []). f(a). f(b). """) assert_true("m:f(a), m:f(b).", e) assert_true("retract(m:f(a)).", e) assert_false("retract(m:f(a)).", e) assert_false("m:f(a).", e) assert_true("m:f(b).", e) assert_true("retract(m:f(b)).", e) prolog_raises("existence_error(_, _)", "f(b)", e)
def test_not_with_cut(): assert_true("not((!, fail)).") assert_false("not(!).") e = get_engine(""" p1 :- \\+ q1. q1 :- fail. q1 :- true. p2:- \\+ q2. q2 :- !, fail. q2 :- true. """) assert_false("p1.", e) assert_true("p2.", e)
def test_unifiable(): assert_false("unifiable(a, b, _).", e) assert_true("unifiable(a, a, X), X == [].", e) assert_true("unifiable(X, X, L), L == [].", e) assert_true("unifiable(X, Y, L), L == [X-Y].", e) assert_true("unifiable(f(a), f(a), L), L == [].", e) assert_true("unifiable([A, B, C], T, X), X == [T-[A, B, C]].", e) assert_true("unifiable([A, B, C], [S|T], X), X == [T-[B, C], A-S].", e) assert_true("unifiable(f(a, b, T), X, L), L == [X-f(a, b, T)].", e) assert_true( "unifiable(f(g(t(Z)), b, x(y(a))), f(g(Q), b, x(y(A))), L), L == [A-a, Q-t(Z)].", e) assert_true( "unifiable([X1, X2, X3], [Y1, Y2, Y3], L), L == [X3-Y3, X2-Y2, X1-Y1].", e)