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_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_false("1 =\\= 1.0.") assert_true("1 =\\= 32.")
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
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_not_with_cut(): 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_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_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_construction(): assert_true("g(a, b, c) =.. [G, A, B, C].") assert_true("g(a, b, c) =.. [g, a, b, c].") assert_true("X =.. [g, a, b, c], X = g(a, b, c).") assert_true("arg(1, g(a, b, c), a).") assert_true("arg(2, g(a, b, c), b).") assert_true("arg(3, g(a, b, c), c).") assert_false("arg(3, g(a, b, c), d).") assert_false("arg(0, g(a, b, c), X).") assert_false("arg(10, g(a, b, c), X).") assert_true("arg(1, g(a, b, c), X), X = a.") assert_true("arg(2, f(a, b, c), X), X = b.") assert_true("arg(3, h(a, b, c), X), X = c.") e = get_engine(""" f(1, a). f(2, b). f(3, c). """) heaps = collect_all(e, "arg(X, g(a, b, c), A), f(X, A).") assert len(heaps) == 3 assert_true("arg(X, h(a, b, c), b), X = 2.") assert_true("arg(X, h(a, b, g(X, b)), g(3, B)), X = 3, B = b.") assert_true("copy_term(X, Y), X = 1, Y = 2.") assert_true("copy_term(a, a).") assert_false("copy_term(f(X), g(X)).") assert_true("copy_term(f(X), f(a)), X = b.")
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_assert_logical_update_view(): e = get_engine(""" g(a). g(c) :- assertz(g(d)). g(b). """) heaps = collect_all(e, "g(X).") assert len(heaps) == 3 e = get_engine(""" p :- assertz(p), fail. p :- fail. """) assert_false("p.", e) e = get_engine(""" q :- fail. q :- assertz(q), fail. """) assert_false("q.", e)
def test_not(): e = get_engine(""" g(a, a). g(b, a). g(b, b). m(o, a). m(o, b). m(o, c). same(X, X). sibling(X, Y) :- m(Z, X), m(Z, Y), \\+same(X, Y). """) assert_true("not((!, fail)).", e) assert_true("not(g(b, c)).", e) assert_false("not(g(a, a)).", e) assert_true("\\+(g(b, c)).", e) assert_false("\\+(g(a, a)).", e) assert_false("not(!).", e) heaps = collect_all(e, "sibling(a, X).") assert len(heaps) == 2
def test_ifthenelse(): e = get_engine("f(x). f(y). f(z).") assert_false("f(c) -> true.", e) assert_true("f(X) -> X \\= x; f(z).", e) assert_false("true -> fail.", e)
def test_sub_atom(): assert_true("sub_atom(abc, B, L, A, bc), B=1, L=2, A=0.") assert_false("sub_atom(abc, B, 1, A, bc).") assert_true("sub_atom(abcabcabc, 3, 3, A, abc), A=3.") assert_true("sub_atom(abcabcabc, B, L, 3, abc), B=3, L=3.")
def test_unify(): assert_true("g(b, B) = g(b, b).") assert_true("X = Y.") assert_true("X = f(X).") assert_false("g(b, B) \\= g(b, b).") assert_false("X \\= Y.") assert_false("X \\= f(X).") assert_true("x \\= y.") assert_true("f(X, b) \\= f(a, c), X = c.") assert_true("unify_with_occurs_check(X, Y).") assert_true("unify_with_occurs_check(X, X).") assert_false("unify_with_occurs_check(X, f(X)).") assert_false("unify_with_occurs_check(X, f(g(h(a, b, c, d(X, e), e)))).") assert_false("unify_with_occurs_check(g(X), X).") assert_false("X = Y, unify_with_occurs_check(X, f(d(Y), Y)).")
def test_type_checks(): assert_true("integer(123).") assert_false("integer(a).") assert_false("integer(X).") assert_true("float(123.12).") assert_false("float(a).") assert_false("float(12).") assert_true("number(123).") assert_true("number(42.42).") assert_false("number(abc).") assert_false("integer(a).") assert_false("integer(X).") assert_true("var(X).") assert_false("X = a, var(X).") assert_true("compound(g(a)).") assert_false("compound(gxx).") assert_false("compound(123).") assert_false("compound([]).") assert_false("compound(X).") assert_true("atom(a).") assert_true("atom('asdf').") assert_false("atom(12).") assert_false("atom(X).") assert_true("atomic('asdf').") assert_true("atomic(12.5).") assert_false("atomic(f(1, 2, 3)).") assert_false("atomic(X).") assert_false("callable(X).") assert_false("callable(1).") assert_true("callable(asdf).") assert_true("callable(asdf(a, b, c, d, e, f)).") assert_true("ground(a).") assert_true("ground(t(a, b, f(a, b, g(a, b)))).") assert_false("ground(t(a, b, f(a, b, g(a, X)))).") assert_true("X = 13, ground(t(a, b, f(a, b, g(a, X)))).") assert_false("ground(X).")
def test_simple(): assert_true("X is 1 + 2, X = 3.") assert_true("X is 1.2 + 2.8, X = 4.") assert_false("X is 1.1 + 2.8, X = 4.0.") assert_true("X is 1 - 2, X = -1.") assert_true("X is 1.2 - 1.2, X = 0.") assert_true("X is 2 * -2, X = -4.") assert_true("X is 2 * -2.1, X = -4.2.") assert_true("X is 2 + -2, X = 0.") assert_true("X is 2 // -2, X = -1.") assert_true("X is 1 << 4, X = 16.") assert_true("X is 128 >> 7, X = 1.") assert_true("X is 12 \\/ 10, X = 14.") assert_true("X is 12 /\\ 10, X = 8.") assert_true("X is 12 xor 10, X = 6.") assert_true("X is max(12, 13), X = 13.") assert_true("X is min(12, 13), X = 12.") assert_true("X is max(12, 13.9), X = 13.9.") assert_true("X is min(12.1, 13), X = 12.1.") assert_true("X is abs(42), X = 42.") assert_true("X is abs(-42), X = 42.") assert_true("X is abs(42.42), X = 42.42.") assert_true("X is abs(-42.42), X = 42.42.") assert_true("X is round(0), X = 0.") assert_true("X is round(0.3), X = 0.") assert_true("X is round(0.4), X = 0.") assert_true("X is round(0.5), X = 1.") assert_true("X is round(0.6), X = 1.") assert_true("X is round(1), X = 1.") assert_true("X is round(-0.3), X = 0.") assert_true("X is round(-0.4), X = 0.") assert_true("X is round(-0.5), X = 0.") #assert_true("X is round(-0.6), X = -1.") #XXX fix round #assert_true("X is round(-1), X = -1.") assert_true("X is ceiling(0), X = 0.") assert_true("X is ceiling(0.3), X = 1.") assert_true("X is ceiling(0.4), X = 1.") assert_true("X is ceiling(0.5), X = 1.") assert_true("X is ceiling(0.6), X = 1.") assert_true("X is ceiling(1), X = 1.") assert_true("X is ceiling(-0.3), X = 0.") assert_true("X is ceiling(-0.4), X = 0.") assert_true("X is ceiling(-0.5), X = 0.") assert_true("X is ceiling(-0.6), X = 0.") assert_true("X is ceiling(-1), X = -1.") assert_true("X is floor(0), X = 0.") assert_true("X is floor(0.3), X = 0.") assert_true("X is floor(0.4), X = 0.") assert_true("X is floor(0.5), X = 0.") assert_true("X is floor(0.6), X = 0.") assert_true("X is floor(1), X = 1.") assert_true("X is floor(-0.3), X = -1.") assert_true("X is floor(-0.4), X = -1.") assert_true("X is floor(-0.5), X = -1.") assert_true("X is floor(-0.6), X = -1.") assert_true("X is floor(-1), X = -1.") assert_true("X is float_integer_part(0), X = 0.") assert_true("X is float_integer_part(0.3), X = 0.") assert_true("X is float_integer_part(0.4), X = 0.") assert_true("X is float_integer_part(0.5), X = 0.") assert_true("X is float_integer_part(0.6), X = 0.") assert_true("X is float_integer_part(1), X = 1.") assert_true("X is float_integer_part(-0.3), X = 0.") assert_true("X is float_integer_part(-0.4), X = 0.") assert_true("X is float_integer_part(-0.5), X = 0.") assert_true("X is float_integer_part(-0.6), X = 0.") assert_true("X is float_integer_part(-1), X = -1.") assert_true("X is float_fractional_part(1), X = 0.") assert_true("X is float_fractional_part(2), X = 0.") assert_true("X is float_fractional_part(-1), X = 0.") assert_true("X is float_fractional_part(1.2), Y is 1.2 - 1, X = Y.") assert_true("X is float_fractional_part(1.4), Y is 1.4 - 1, X = Y.") assert_true("X is float_fractional_part(1.6), Y is 1.6 - 1, X = Y.") assert_true("X is float_fractional_part(-1.2), X is -1.2 + 1, X = Y.") assert_true("X is float_fractional_part(-1.4), X is -1.4 + 1, X = Y.") assert_true("X is float_fractional_part(-1.6), X is -1.6 + 1, X = Y.") assert_true("X is 2 ** 4, X = 16.")
def test_or_and_call_with_cut(): assert_false("(!, fail); true.") assert_true("(call(!), fail); true.")
def test_or_with_cut(): assert_false("((X = 1, !); X = 2), X = 2.") assert_true("((X = 1, !); X = 2), X = 1.")
def test_common(self): assert_false("fail.") assert_true("true.")
def test_and(): assert_false("fail, X.") prolog_raises("type_error(callable, 1)", "(fail, 1)")
def test_common(self): assert_false('fail.') assert_true('true.')