def impl_arg(engine, first, second, third, continuation): if isinstance(second, term.Var): error.throw_instantiation_error() if isinstance(second, term.Atom): raise error.UnificationFailed() if not isinstance(second, term.Term): error.throw_type_error("compound", second) if isinstance(first, term.Var): for i in range(len(second.args)): arg = second.args[i] oldstate = engine.heap.branch() try: third.unify(arg, engine.heap) first.unify(term.Number(i + 1), engine.heap) return continuation.call(engine, choice_point=True) except error.UnificationFailed: engine.heap.revert(oldstate) raise error.UnificationFailed() elif isinstance(first, term.Number): num = first.num if num == 0: raise error.UnificationFailed if num < 0: error.throw_domain_error("not_less_than_zero", first) if num > len(second.args): raise error.UnificationFailed() arg = second.args[num - 1] third.unify(arg, engine.heap) else: error.throw_type_error("integer", first) return continuation.call(engine, choice_point=False)
def impl_arg(engine, first, second, third, continuation): if isinstance(second, term.Var): error.throw_instantiation_error() if isinstance(second, term.Atom): raise error.UnificationFailed() if not isinstance(second, term.Term): error.throw_type_error("compound", second) if isinstance(first, term.Var): for i in range(len(second.args)): arg = second.args[i] oldstate = engine.heap.branch() try: third.unify(arg, engine.heap) first.unify(term.Number(i + 1), engine.heap) return continuation.call(engine, choice_point=True) except error.UnificationFailed: engine.heap.revert(oldstate) raise error.UnificationFailed() elif isinstance(first, term.Number): num = first.num if num == 0: raise error.UnificationFailed if num < 0: error.throw_domain_error("not_less_than_zero", first) if num > len(second.args): raise error.UnificationFailed() arg = second.args[num - 1] third.unify(arg, engine.heap) else: error.throw_type_error("integer", first) return continuation.call(engine, choice_point=False)
def impl_abolish(engine, predicate): from pypy.lang.prolog.builtin import builtins name, arity = helper.unwrap_predicate_indicator(predicate) if arity < 0: error.throw_domain_error("not_less_than_zero", term.Number(arity)) signature = name + "/" + str(arity) if signature in builtins: error.throw_permission_error("modify", "static_procedure", predicate) if signature in engine.signature2function: del engine.signature2function[signature]
def impl_abolish(engine, predicate): from pypy.lang.prolog.builtin import builtins name, arity = helper.unwrap_predicate_indicator(predicate) if arity < 0: error.throw_domain_error("not_less_than_zero", term.Number(arity)) signature = name + "/" + str(arity) if signature in builtins: error.throw_permission_error("modify", "static_procedure", predicate) if signature in engine.signature2function: del engine.signature2function[signature]
def impl_functor(engine, t, functor, arity): if helper.is_atomic(t): functor.unify(t, engine.heap) arity.unify(term.Number(0), engine.heap) elif isinstance(t, term.Term): functor.unify(term.Atom(t.name), engine.heap) arity.unify(term.Number(len(t.args)), engine.heap) elif isinstance(t, term.Var): if isinstance(functor, term.Var): error.throw_instantiation_error() a = helper.unwrap_int(arity) if a < 0: error.throw_domain_error("not_less_than_zero", arity) else: functor = helper.ensure_atomic(functor) if a == 0: t.unify(helper.ensure_atomic(functor), engine.heap) else: name = helper.unwrap_atom(functor) t.unify(term.Term(name, [term.Var() for i in range(a)]), engine.heap)
def impl_functor(engine, t, functor, arity): if helper.is_atomic(t): functor.unify(t, engine.heap) arity.unify(term.Number(0), engine.heap) elif isinstance(t, term.Term): functor.unify(term.Atom(t.name), engine.heap) arity.unify(term.Number(len(t.args)), engine.heap) elif isinstance(t, term.Var): if isinstance(functor, term.Var): error.throw_instantiation_error() a = helper.unwrap_int(arity) if a < 0: error.throw_domain_error("not_less_than_zero", arity) else: functor = helper.ensure_atomic(functor) if a == 0: t.unify(helper.ensure_atomic(functor), engine.heap) else: name = helper.unwrap_atom(functor) t.unify( term.Term(name, [term.Var() for i in range(a)]), engine.heap)
def from_option_list(engine, options): # XXX add numbervars support quoted = False max_depth = 0 ignore_ops = False number_vars = False for option in options: if (not isinstance(option, Term) or len(option.args) != 1): error.throw_domain_error('write_option', option) arg = option.args[0] if option.name == "max_depth": try: max_depth = helper.unwrap_int(arg) except error.CatchableError: error.throw_domain_error('write_option', option) elif (not isinstance(arg, Atom) or (arg.name != "true" and arg.name != "false")): error.throw_domain_error('write_option', option) assert 0, "unreachable" elif option.name == "quoted": quoted = arg.name == "true" elif option.name == "ignore_ops": ignore_ops = arg.name == "true" return TermFormatter(engine, quoted, max_depth, ignore_ops)
def from_option_list(engine, options): # XXX add numbervars support quoted = False max_depth = 0 ignore_ops = False number_vars = False for option in options: if (not isinstance(option, Term) or len(option.args) != 1): error.throw_domain_error('write_option', option) arg = option.args[0] if option.name == "max_depth": try: max_depth = helper.unwrap_int(arg) except error.CatchableError: error.throw_domain_error('write_option', option) elif (not isinstance(arg, Atom) or (arg.name != "true" and arg.name != "false")): error.throw_domain_error('write_option', option) assert 0, "unreachable" elif option.name == "quoted": quoted = arg.name == "true" elif option.name == "ignore_ops": ignore_ops = arg.name == "true" return TermFormatter(engine, quoted, max_depth, ignore_ops)