Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
 def unify(self, other, env, occurs_check=False):
   return unify(self.value, other, env, occurs_check)