def unify(self, other, env, occurs_check=False): if isinstance(other, Var): for x in other.unify(self, env, occurs_check): yield True else: if self.__class__!=other.__class__: return for x in unify(self.head, other.head, env, occurs_check): for y in unify(self.tail, other.tail, env, occurs_check): yield True
def run(self, solver, cont, values): signatures = rule_head_signatures(values) if solver.parse_state is None or not self.memorable: for c, v in self.apply(solver, cont, values, signatures): yield c, v return sign_state = ((self, signatures), hash_parse_state(solver.parse_state)) sign_state2cont = solver.sign_state2cont.setdefault(sign_state, []) # TODO: greedy, nongreedy, lazy mode # lazy : reverse the order of sign_state2cont memo = False i = 0 for path, c in sign_state2cont: if cont==sign_state2cont: memo = True break if len(solver.call_path)<=path: # lazy: > i += 1 continue for x, y in zip(path, solver.call_path): if x!=y: break else: break i += 1 if not memo: sign_state2cont.insert(i, (solver.call_path, cont)) memo_results = solver.sign_state2results.get(sign_state) env = solver.env if memo_results is not None: for _, c in sign_state2cont: if c.cont_order>cont.cont_order: continue for result_head, reached_parse_state, value in memo_results: solver.env = env.extend() for _ in unify(values, result_head, solver.env): solver.parse_state = reached_parse_state yield c, value solver.env = env @mycont(cont) def memo_result_cont(value, solver): result_head = getvalue(values, solver.env) result = result_head, solver.parse_state, value solver.sign_state2results.setdefault(sign_state, []).append(result) # TODO: prevent backtracking for greedy for _, c in sign_state2cont: yield c, value if len(sign_state2cont)==1: for c, v in self.apply(solver, memo_result_cont, values, signatures): yield c, v
def unify(self, other, env, occurs_check=False): self = self.deref(env) other = deref(other, env) if isinstance(self, Var): if isinstance(other, Var) and other is self: yield True return if occurs_check and contain_var(other, self):return self.setvalue(other, env) yield True try: del env.bindings[self] # for DummyVar except: pass elif isinstance(other, Var): if occurs_check and contain_var(self, other): return other.setvalue(self, env) yield True try: del env.bindings[other] # for DummyVar except: pass else: for result in unify(self, other, env, occurs_check): yield True
def unify(self, other, env, occurs_check=False): return unify(self.value, other, env, occurs_check)