def __init__(self, head, body, module, next = None): from prolog.interpreter import helper head = head.dereference(None) assert isinstance(head, Callable) memo = EnumerationMemo() self.head = h = head.enumerate_vars(memo) if h.argument_count() > 0: self.headargs = h.arguments() else: self.headargs = None if body is not None: body = body.dereference(None) body = helper.ensure_callable(body) self.body = body.enumerate_vars(memo) else: self.body = None self.size_env = memo.size() self.signature = head.signature() self.module = module self.next = next self.file_name = "<unknown>" self.line_range = None self.source = None self._does_contain_cut()
def impl_retract(engine, heap, module, pattern): modname = None if pattern.signature().eq(prefixsig): modname, pattern = unpack_modname_and_predicate(pattern) assert isinstance(pattern, term.Callable) if helper.is_term(pattern) and pattern.signature().eq(implsig): head = helper.ensure_callable(pattern.argument_at(0)) body = helper.ensure_callable(pattern.argument_at(1)) else: head = pattern body = None assert isinstance(head, term.Callable) if head.signature().get_extra("builtin"): error.throw_permission_error("modify", "static_procedure", head.get_prolog_signature()) if modname is None: function = module.lookup(head.signature()) else: function = engine.modulewrapper.get_module(modname, pattern).lookup(head.signature()) if function.rulechain is None: raise error.UnificationFailed rulechain = function.rulechain oldstate = heap.branch() while rulechain: rule = rulechain # standardizing apart try: deleted_body = rule.clone_and_unify_head(heap, head) if body is not None: body.unify(deleted_body, heap) except error.UnificationFailed: oldstate.revert_upto(heap) else: if function.rulechain is rulechain: function.rulechain = rulechain.next else: function.remove(rulechain) break rulechain = rulechain.next else: raise error.UnificationFailed()
def impl_retract(engine, heap, module, pattern): modname = None if pattern.signature().eq(prefixsig): modname, pattern = unpack_modname_and_predicate(pattern) assert isinstance(pattern, term.Callable) if helper.is_term(pattern) and pattern.signature().eq(implsig): head = helper.ensure_callable(pattern.argument_at(0)) body = helper.ensure_callable(pattern.argument_at(1)) else: head = pattern body = None assert isinstance(head, term.Callable) if head.signature().get_extra("builtin"): error.throw_permission_error("modify", "static_procedure", head.get_prolog_signature()) if modname is None: function = module.lookup(head.signature()) else: function = engine.modulewrapper.get_module(modname, pattern).lookup( head.signature()) if function.rulechain is None: raise error.UnificationFailed rulechain = function.rulechain oldstate = heap.branch() while rulechain: rule = rulechain # standardizing apart try: deleted_body = rule.clone_and_unify_head(heap, head) if body is not None: body.unify(deleted_body, heap) except error.UnificationFailed: oldstate.revert_upto(heap) else: if function.rulechain is rulechain: function.rulechain = rulechain.next else: function.remove(rulechain) break rulechain = rulechain.next else: raise error.UnificationFailed()
def __init__(self, head, body, module, next=None): from prolog.interpreter import helper head = head.dereference(None) assert isinstance(head, Callable) memo = EnumerationMemo() self.head = h = head.enumerate_vars(memo) memo.in_head = False if h.argument_count() > 0: self.headargs = h.arguments() # an argument is ground if enumeration left it unchanged, because # that means it contains no variables self.groundargs = [ h.argument_at(i) is head.argument_at(i) for i in range(h.argument_count()) ] else: self.headargs = None self.groundargs = None if body is not None: body = body.dereference(None) body = helper.ensure_callable(body) self.body = body.enumerate_vars(memo) else: self.body = None memo.assign_numbers() self.env_size_body = memo.nbody self.env_size_head = memo.nhead self.env_size_shared = memo.nshared self.signature = head.signature() self.module = module self.next = next self.file_name = "<unknown>" self.line_range = None self.source = None self.scores = None self.expanded = False self._does_contain_cut()