[pypy-svn] r44065 - in pypy/branch/prolog-bytecode/pypy/lang/prolog: builtin interpreter

cfbolz at codespeak.net cfbolz at codespeak.net
Thu Jun 7 01:18:42 CEST 2007


Author: cfbolz
Date: Thu Jun  7 01:18:42 2007
New Revision: 44065

Modified:
   pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/__init__.py
   pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/register.py
   pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/type.py
   pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/engine.py
   pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/helper.py
   pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/term.py
Log:
small changes here and there: give Rules access to the engine. introduce an
is_ground helper.


Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/__init__.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/__init__.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/__init__.py	Thu Jun  7 01:18:42 2007
@@ -1,6 +1,7 @@
 # all builtins
 builtins = {}
 builtins_list = []
+builtins_index = {}
 
 # imports to register builtins
 import pypy.lang.prolog.builtin.allsolution

Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/register.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/register.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/register.py	Thu Jun  7 01:18:42 2007
@@ -1,7 +1,7 @@
 import py
 from pypy.lang.prolog.interpreter.parsing import parse_file, TermBuilder
 from pypy.lang.prolog.interpreter import engine, helper, term, error
-from pypy.lang.prolog.builtin import builtins, builtins_list
+from pypy.lang.prolog.builtin import builtins, builtins_list, builtins_index
 
 from pypy.rlib.objectmodel import we_are_translated
 
@@ -90,7 +90,5 @@
         b = Builtin(miniglobals[funcname], funcname, len(unwrap_spec),
                     signature)
         builtins[signature] = b
-        if signature in [",/2", "is/2"]:
-            builtins_list.insert(0, (signature, b))
-        else:
-            builtins_list.append((signature, b))
+        builtins_index[signature] = len(builtins_list)
+        builtins_list.append((signature, b))

Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/type.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/type.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/type.py	Thu Jun  7 01:18:42 2007
@@ -54,11 +54,8 @@
 expose_builtin(impl_callable, "callable", unwrap_spec=["obj"])
 
 def impl_ground(engine, var):
-    if isinstance(var, term.Var):
+    if not helper.is_ground(var, engine):
         raise error.UnificationFailed()
-    if isinstance(var, term.Term):
-        for arg in var.args:
-            impl_ground(engine, arg)
 expose_builtin(impl_ground, "ground", unwrap_spec=["concrete"])
 
 

Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/engine.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/engine.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/engine.py	Thu Jun  7 01:18:42 2007
@@ -61,10 +61,6 @@
     def discard(self, state):
         pass #XXX for now
 
-    def maxvar(self):
-        XXX
-        return self.needed_vars
-
     def newvar(self):
         result = Var(self)
         return result
@@ -109,7 +105,6 @@
         return "LinkedRules(%r, %r)" % (self.rule, self.next)
 
 
-
 class Function(object):
     def __init__(self, firstrule=None):
         if firstrule is None:
@@ -149,12 +144,12 @@
             debug_print("add_rule", rule)
         if isinstance(rule, Term):
             if rule.name == ":-":
-                rule = Rule(rule.args[0], rule.args[1])
+                rule = Rule(rule.args[0], rule.args[1], self)
             else:
-                rule = Rule(rule, None)
+                rule = Rule(rule, None, self)
             signature = rule.signature
         elif isinstance(rule, Atom):
-            rule = Rule(rule, None)
+            rule = Rule(rule, None, self)
             signature = rule.signature
         else:
             error.throw_type_error("callable", rule)
@@ -317,7 +312,10 @@
             return self.main_loop(TRY_RULE, query, continuation, rule)
         #if _is_early_constant(rule):
         #    rule = hint(rule, promote=True)
-        #    return self.portal_try_rule(rule, query, continuation, choice_point)
+        #    #force right colors
+        #    query = hint(query, variable=True)
+        #    continuation = hint(continuation, variable=True)
+        #    return self.portal_try_rule(rule, query, continuation, True)
         return self._opaque_try_rule(rule, query, continuation, choice_point)
 
     def _opaque_try_rule(self, rule, query, continuation, choice_point):
@@ -366,7 +364,7 @@
                 continuation = e.continuation
 
     def parse(self, s):
-        from pypy.lang.prolog.interpreter.parsing import parse_file, TermBuilder, lexer
+        from pypy.lang.prolog.interpreter.parsing import parse_file, TermBuilder
         builder = TermBuilder()
         trees = parse_file(s, self.parser)
         terms = builder.build_many(trees)
@@ -378,6 +376,3 @@
             return default_operations
         return self.operations
 
-
-
-

Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/helper.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/helper.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/helper.py	Thu Jun  7 01:18:42 2007
@@ -27,6 +27,18 @@
     return isinstance(var, term.Callable)
 is_callable._look_inside_me_ = True
 
+def is_ground(obj, engine):
+    stack = [obj]
+    while stack:
+        obj = stack.pop().dereference(engine.heap)
+        if isinstance(obj, term.Var):
+            return False
+        if isinstance(obj, term.Term):
+            for arg in obj.args:
+                stack.append(arg)
+    return True
+
+
 def ensure_callable(var):
     if isinstance(var, term.Var):
         error.throw_instantiation_error()

Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/term.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/term.py	(original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/term.py	Thu Jun  7 01:18:42 2007
@@ -504,7 +504,7 @@
 class Rule(object):
     _immutable_ = True
     unify_hash = []
-    def __init__(self, head, body):
+    def __init__(self, head, body, engine):
         from pypy.lang.prolog.interpreter import helper
         assert isinstance(head, Callable)
         self.head = head


More information about the pypy-svn mailing list