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_equivalent_with_quotes(): e = get_engine(""" g('a', X). g('b', 'c'). """) e.run(parse_query_term("g(a, b).")) e.run(parse_query_term("g(b, c)."))
def test_and(self): e = get_engine(""" h(X) :- f(X). h(a). b(a). a(a). f(X) :- b(X), a(X). f(X) :- fail. """) X = e.heap.newvar() def main(n): e.heap.reset() if n == 0: e.call(term.Term("h", [X])) return isinstance(X.dereference(e.heap), term.Atom) else: return False res = main(0) assert res == True res = self.timeshift_from_portal(main, portal.PORTAL, [0], policy=POLICY, backendoptimize=True, inline=0.0) assert res == True
def test_trivial(): e = get_engine(""" f(a). """) t, vars = get_query_and_vars("f(X).") e.run(t) assert vars['X'].dereference(e.heap).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_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_numeral(): e = get_engine(""" num(0). num(succ(X)) :- num(X). add(X, 0, X). add(X, succ(Y), Z) :- add(succ(X), Y, Z). mul(X, 0, 0). mul(X, succ(0), X). mul(X, succ(Y), Z) :- mul(X, Y, A), add(A, X, Z). factorial(0, succ(0)). factorial(succ(X), Y) :- factorial(X, Z), mul(Z, succ(X), Y). """) def nstr(n): if n == 0: return "0" return "succ(%s)" % nstr(n - 1) e.run(parse_query_term("num(0).")) e.run(parse_query_term("num(succ(0)).")) t, vars = get_query_and_vars("num(X).") e.run(t) assert vars['X'].dereference(e.heap).num == 0 e.run(parse_query_term("add(0, 0, 0).")) py.test.raises(UnificationFailed, e.run, parse_query_term(""" add(0, 0, succ(0)).""")) e.run(parse_query_term("add(succ(0), succ(0), succ(succ(0))).")) e.run(parse_query_term("mul(succ(0), 0, 0).")) e.run(parse_query_term("mul(succ(succ(0)), succ(0), succ(succ(0))).")) e.run(parse_query_term("mul(succ(succ(0)), succ(succ(0)), succ(succ(succ(succ(0))))).")) e.run(parse_query_term("factorial(0, succ(0)).")) e.run(parse_query_term("factorial(succ(0), succ(0)).")) e.run(parse_query_term("factorial(%s, %s)." % (nstr(5), nstr(120))))
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_loop(self): e = get_engine(""" f(X) :- h(X, _). f(50). h(0, _). h(X, Y) :- Y is X - 1, h(Y, _). """) num = term.Number(50) def main(n): e.heap.reset() if n == 0: e.call(term.Term("f", [num])) return True else: return False res = main(0) assert res res = self.timeshift_from_portal(main, portal.PORTAL, [0], policy=POLICY, backendoptimize=True, inline=0.0) assert res
def test_append(self): e = get_engine(""" append([], L, L). append([X|Y], L, [X|Z]) :- append(Y, L, Z). """) t = parse_query_term("append([a, b, c], [d, f, g], X).") X = e.heap.newvar() def main(n): if n == 0: e.call(t) return isinstance(X.dereference(e.heap), term.Term) else: return False res = main(0) assert res == True e.heap.reset() res = self.timeshift_from_portal(main, portal.PORTAL, [0], policy=POLICY, backendoptimize=True, inline=0.0) assert res == True
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_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_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_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_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_or(): e = get_engine(""" g(a, b). g(b, a). f(X, Y) :- g(X, b); g(a, Y). """) e.run(parse_query_term("f(a, c).")) e.run(parse_query_term("f(d, b).")) prolog_raises("ERROR", "foo(X); X = 1")
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_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_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_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_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_lists(): e = get_engine(""" nrev([],[]). nrev([X|Y],Z) :- nrev(Y,Z1), append(Z1,[X],Z). append([],L,L). append([X|Y],L,[X|Z]) :- append(Y,L,Z). """) e.run(parse_query_term("nrev(%s, X)." % (range(15), ))) e.run(parse_query_term("nrev(%s, %s)." % (range(8), range(7, -1, -1))))
def test_and(): e = get_engine(""" g(a, a). g(a, b). g(b, c). f(X, Z) :- g(X, Y), g(Y, Z). """) e.run(parse_query_term("f(a, c).")) t, vars = get_query_and_vars("f(X, c).") e.run(t) assert vars['X'].dereference(e.heap).name == "a"
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_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_indexing(): # this test is quite a lot faster if indexing works properly. hrmrm e = get_engine("g(a, b, c, d, e, f, g, h, i, j, k, l). " + "".join(["f(%s, g(%s)) :- g(A, B, C, D, E, F, G, H, I ,J, K, l). " % (chr(i), chr(i + 1)) for i in range(97, 122)])) t = parse_query_term("f(x, g(y)).") for i in range(200): e.run(t) t = parse_query_term("f(x, g(y, a)).") for i in range(200): py.test.raises(UnificationFailed, e.run, t)
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_indexing(): # this test is quite a lot faster if indexing works properly. hrmrm e = get_engine("g(a, b, c, d, e, f, g, h, i, j, k, l). " + "".join([ "f(%s, g(%s)) :- g(A, B, C, D, E, F, G, H, I ,J, K, l). " % (chr(i), chr(i + 1)) for i in range(97, 122) ])) t = parse_query_term("f(x, g(y)).") for i in range(200): e.run(t) t = parse_query_term("f(x, g(y, a)).") for i in range(200): py.test.raises(UnificationFailed, e.run, t)
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_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_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_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)