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_numeral(): from pypy.lang.prolog.interpreter.term import Term, Atom, Var from pypy.lang.prolog.interpreter.engine import Engine t = parse_file(""" numeral(null). % end of line comment numeral(succ(X)) :- numeral(X). % another one add_numeral(X, null, X). add_numeral(X, succ(Y), Z) :- add_numeral(succ(X), Y, Z). greater_than(succ(null), null). greater_than(succ(X), null) :- greater_than(X, null). greater_than(succ(X), succ(Y)) :- greater_than(X, Y). """) builder = TermBuilder() facts = builder.build(t) e = Engine() for fact in facts: print fact e.add_rule(fact) assert e.signature2function["add_numeral/3"].rulechain.rule.head.args[1].name == "null" four = Term("succ", [Term("succ", [Term("succ", [Term("succ", [Atom("null")])])])]) e.run(parse_query_term("numeral(succ(succ(null))).")) term = parse_query_term( """add_numeral(succ(succ(null)), succ(succ(null)), X).""") e.run(term) var = Var(0).getvalue(e.heap) print var, e.heap # does not raise var.unify(four, e.heap) term = parse_query_term( """greater_than(succ(succ(succ(null))), succ(succ(null))).""") e.run(term)
def test_list(): f = formatting.TermFormatter(Engine(), quoted=False, ignore_ops=False) t = parse_query_term("[1, 2, 3, 4, 5 | X].") assert f.format(t) == "[1, 2, 3, 4, 5|_G0]" t = parse_query_term("[a, b, 'A$%%$$'|[]].") assert f.format(t) == "[a, b, A$%%$$]" t = parse_query_term("'.'(a, b, c).") assert f.format(t) == ".(a, b, c)"
def test_op_formatting(): f = formatting.TermFormatter(Engine(), quoted=False, ignore_ops=False) t = parse_query_term("'+'(1, 2).") assert f.format(t) == "1+2" t = parse_query_term("'+'(1, *(3, 2)).") assert f.format(t) == "1+3*2" t = parse_query_term("'*'(1, *(3, 2)).") assert f.format(t) == "1*(3*2)"
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_atom_formatting(): f = formatting.TermFormatter(Engine(), quoted=False, ignore_ops=False) t = parse_query_term("'abc def'.") assert f.format(t) == "abc def" f = formatting.TermFormatter(Engine(), quoted=True, ignore_ops=False) t = parse_query_term("'abc def'.") assert f.format(t) == "'abc def'" t = parse_query_term("abc.") assert f.format(t) == "abc"
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_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_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_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_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_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_numbers(): e = get_engine(""" g(1, 2). g(X, Y) :- g(1, X), g(1, Y). """) e.run(parse_query_term("g(2, 2)."))
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_repeat(): assert_true("repeat, true.") py.test.raises(UnificationFailed, Engine().run, parse_query_term("repeat, !, fail."))