def assert_true(query, e=None): if e is None: e = Engine() terms, vars = e.parse(query) term, = terms e.run(term) return dict([(name, var.dereference(e.heap)) for name, var in vars.iteritems()])
def assert_true(query, e=None): if e is None: e = Engine() terms, vars = e.parse(query) term, = terms e.run(term) return dict([(name, var.dereference(e.heap)) for name, var in vars.iteritems()])
def test_run(): e = Engine() e.add_rule(Term("f", [Atom.newatom("a"), Atom.newatom("b")])) X = Var() Y = Var() e.add_rule(Term("f", [X, X])) e.add_rule(Term(":-", [Term("f", [X, Y]), Term("f", [Y, X])])) X = e.heap.newvar() e.run(Term("f", [Atom.newatom("b"), X])) assert X.dereference(e.heap).name == "b" e.run(Term("f", [Atom.newatom("b"), Atom.newatom("a")]))
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)