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_cut(): e = get_engine(""" f(0). f(X) :- Y is X - 1, !, f(Y). f(X) :- Y is X - 2, !, f(Y). """) assert_true("f(20).", e)
def test_standard_comparison(): assert_true("X = Y, f(X, Y, X, Y) == f(X, X, Y, Y).") assert_true("X = Y, f(X, Y, X, Z) \\== f(X, X, Y, Y).") assert_true("""X \\== Y, ((X @< Y, X @=< X, X @=< Y, Y @> X); (X @> Y, X @>= X, X @>= Y, Y @< X)).""") assert_true("'\\\\=='(f(X, Y), 12).") assert_true("X = f(a), Y = f(b), Y @> X.")
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_runstring(): e = get_engine("foo(a, c).") e.runstring(""" :- op(450, xfy, foo). a foo b. b foo X :- a foo X. """) assert_true("foo(a, b).", e)
def test_atom_concat(): assert_true("atom_concat(ab, cdef, abcdef).") assert_true("atom_concat(ab, cdef, X), X = abcdef.") assert_true("atom_concat(ab, X, abcdef), X = cdef.") assert_true("atom_concat(X, cdef, abcdef), X = ab.") assert_true("atom_concat(1, Y, '1def'), Y = def.") heaps = collect_all(Engine(), "atom_concat(X, Y, abcd), atom(X), atom(Y).") assert len(heaps) == 5
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_backtrack_to_same_choice_point(): e = get_engine(""" a(a). b(b). start(Z) :- Z = X, f(X, b), X == b, Z == b. f(X, Y) :- a(Y). f(X, Y) :- X = a, a(Y). f(X, Y) :- X = b, b(Y). """) assert_true("start(Z).", e)
def test_atom_concat(): assert_true("atom_concat(ab, cdef, abcdef).") assert_true("atom_concat(ab, cdef, X), X = abcdef.") assert_true("atom_concat(ab, X, abcdef), X = cdef.") assert_true("atom_concat(X, cdef, abcdef), X = ab.") assert_true("atom_concat(1, Y, '1def'), Y = def.") heaps = collect_all( Engine(), "atom_concat(X, Y, abcd), atom(X), atom(Y).") assert len(heaps) == 5
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_consult(): p = py.test.ensuretemp("prolog") f = p.join("test.pl") f.write("g(a, a). g(a, b).") e = get_engine("g(c, c).") assert_true("g(c, c).", e) assert_true("consult('%s')." % (f, ), e) assert_true("g(c, c).", e) assert_true("g(a, a).", e) assert_true("g(a, b).", e) py.test.raises(error.CatchableError, assert_true, "consult('/hopefully/does/not/exist').")
def test_cut(): e = get_engine(""" g(a). g(b). a(a). b(b). f(X) :- g(X),!,b(X). f(x). f(y). """) heaps = collect_all(e, "f(X).") assert len(heaps) == 0 assert_true("!.")
def test_consult(): p = py.test.ensuretemp("prolog") f = p.join("test.pl") f.write("g(a, a). g(a, b).") e = get_engine("g(c, c).") assert_true("g(c, c).", e) assert_true("consult('%s')." % (f, ), e) assert_true("g(c, c).", e) assert_true("g(a, a).", e) assert_true("g(a, b).", e) py.test.raises( error.CatchableError, assert_true, "consult('/hopefully/does/not/exist').")
def test_cut3(): e = get_engine(""" member(H, [H | _]). member(H, [_ | T]) :- member(H, T). s(a, L) :- !, fail. s(b, L). s(X, L) :- member(Y, L), L = [_| S], s(Y, S). """) # import pdb; pdb.set_trace() assert_true("s(d, [a, b]).", 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_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_exception_handling(): assert_true("catch(f, E, true).") assert_true("catch(throw(error), E, true).") py.test.raises(error.CatchableError, assert_true, "catch(true, E, fail), f.") py.test.raises(error.CatchableError, assert_true, "catch(throw(error), failure, fail).") assert_true("catch(catch(throw(error), failure, fail), error, true).")
def test_call(): e = get_engine("g(b, b).") assert_true("call(g(X, X)).", e) assert_true("X =.. [g, b, b], call(X).", e) e = get_engine(""" g(X) :- call(f(X)). g(a). g(b). f(X) :- !, h(X). f(a). f(b). h(X) :- fail. withcut(X) :- call(!), fail. withcut(a). """) heaps = collect_all(e, "g(X).") assert len(heaps) == 2 assert_true("withcut(a).", e) assert_true("call((!, true)).")
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_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_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_atom_length(): assert_true("atom_length('abc', 3).") assert_true("atom_length('\\\\', 1).") assert_true("atom_length('abc', X), X = 3.")
def test_common(self): assert_false('fail.') assert_true('true.')
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_once(): assert_true("once(repeat).")
def test_findall(): assert_true("findall(X, (X = a; X = b; X = c), L), L = [a, b, c].") assert_true("findall(X + Y, (X = 1), L), L = [1+_].")
def test_repeat(): assert_true("repeat, true.") py.test.raises(UnificationFailed, Engine().run, parse_query_term("repeat, !, fail."))
def DONOTtest_cut(self): assert_true('!.')
def test_parser_access(): assert_true("current_op(200, xfx, **).") f = collect_all(Engine(), "current_op(200, Form, X).") assert len(f) == 2 e = get_engine(""" foo(a, b). """) assert_true("op(450, xfy, foo).", e) assert_true("a foo b.", e) assert_true("op(0, xfy, foo).", e) # XXX really a ParseError py.test.raises(Exception, assert_false, "a foo b.", e) # change precedence of + for funny results :-) assert_true("14 is 2 + 3 * 4.", e) assert_true("op(350, xfy, +).", e) assert_true("20 is 2 + 3 * 4.", e) assert_true("op(500, xfy, +).", 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_true("1.1 > 1.") assert_false("1 =\\= 1.0.") assert_true("1 =\\= 32.")
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_is(): assert_true("5 is 1 + 1 + 1 + 1 + 1.")
def test_functor(): assert_true("functor(f(a, b, c), f, 3).") assert_true("functor(f(a, b, c), X, Y), X=f, Y=3.") assert_true("functor(f, X, Y), X=f, Y=0.") assert_true("functor(1, X, Y), X=1, Y=0.") assert_true("functor(F, a, 0), F=a.") assert_true("functor(F, 12, 0), F=12.") assert_true("functor(F, 12.5, 0), F=12.5.") assert_true("functor(F, f, 4), F=f(1, 2, 3, 4).") assert_true("functor(F, g, 1), F=g(asdf).") assert_true("functor(F, g, 3), F=g(X, Y, 1), X = 12, Y = 34, ground(F).")
def test_call_atom(): e = get_engine(""" test(a). test :- test(_). """) assert_true("test.", e)
def test_or_and_call_with_cut(): assert_false("(!, fail); true.") assert_true("(call(!), fail); true.")