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_call_cut(): py.test.skip("cuts don't work properly in the presence of calls right now") e = get_engine(""" f(X) :- call(X). f(!). """) heaps = collect_all(e, "f(!).") assert len(heaps) == 1
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_fail(): e = get_engine(""" g(a). f(X) :- g(X), fail. f(a). """) heaps = collect_all(e, "f(X).") assert len(heaps) == 1
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_and_long(): e = get_engine(""" f(x). f(y). f(z). g(a). g(b). g(c). h(d). h(e). h(f). f(X, Y, Z) :- f(X), g(Y), h(Z). """) heaps = collect_all(e, "f(X, Y, Z).") assert len(heaps) == 27
def test_rule_with_cut_calling_rule_with_cut(): e = get_engine(""" f(b) :- !. f(c). g(X) :- f(X), !. g(a). """) heaps = collect_all(e, "g(X).") assert len(heaps) == 1
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_cut2(): e = get_engine(""" g(a). g(b). h(a, x). h(a, y). f(X, Y) :- g(X), !, !, !, !, !, h(X, Y). """) heaps = collect_all(e, "f(X, Y).") assert len(heaps) == 2
def test_indexing2(): e = get_engine(""" mother(o, j). mother(o, m). mother(o, b). sibling(X, Y) :- mother(Z, X), mother(Z, Y). """) heaps = collect_all(e, "sibling(m, X).") assert len(heaps) == 3
def test_collect_all(): e = get_engine(""" g(a). g(b). g(c). """) heaps = collect_all(e, "g(X).") assert len(heaps) == 3 assert heaps[0]['X'].name == "a" assert heaps[1]['X'].name == "b" assert heaps[2]['X'].name == "c"
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_or_backtrack(): e = get_engine(""" a(a). b(b). g(a, b). g(a, a). f(X, Y, Z) :- (g(X, Z); g(X, Z); g(Z, Y)), a(Z). """) t, vars = get_query_and_vars("f(a, b, Z).") e.run(t) assert vars['Z'].dereference(e.heap).name == "a" f = collect_all(e, "X = 1; X = 2.") assert len(f) == 2
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_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_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