Exemple #1
0
def occur_check(var, obj):
    """Return true if var occurs anywhere in obj."""
    if var == obj:
        return True
    elif isinstance(obj, Expr):
        return var.op == obj.op or occur_check(var, obj.args)
    elif not isterm(obj) and utils.is_sequence(obj):
        for xi in obj:
            if occur_check(var, xi):
                return True
    return False
Exemple #2
0
def occur_check(var, obj):
  """Return true if var occurs anywhere in obj."""
  if var == obj:
    return True
  elif isinstance(obj, Expr):
    return var.op == obj.op or occur_check(var, obj.args)
  elif not isterm(obj) and utils.is_sequence(obj):
    for xi in obj:
      if occur_check(var, xi):
        return True
  return False
Exemple #3
0
def unify(x, y, s):
    """Unify expressions x,y with substitution s; return a substitution that
  would make x,y equal, or None if x,y can not unify. x and y can be
  variables (e.g. Expr('x')), constants, lists, or Exprs. [Fig. 9.1]
  >>> unify(x + y, y + C, {})
  {y: C, x: y}
  """
    if s is None:
        return None
    elif x == y:
        return s
    elif is_variable(x):
        return unify_var(x, y, s)
    elif is_variable(y):
        return unify_var(y, x, s)
    elif isinstance(x, Expr) and isinstance(y, Expr):
        return unify(x.args, y.args, unify(x.op, y.op, s))
    elif isterm(x) or isterm(y) or not x or not y:
        return utils.if_(x == y, s, None)
    elif utils.is_sequence(x) and utils.is_sequence(y) and len(x) == len(y):
        return unify(x[1:], y[1:], unify(x[0], y[0], s))
    else:
        return None
Exemple #4
0
def unify(x, y, s):
  """Unify expressions x,y with substitution s; return a substitution that
  would make x,y equal, or None if x,y can not unify. x and y can be
  variables (e.g. Expr('x')), constants, lists, or Exprs. [Fig. 9.1]
  >>> unify(x + y, y + C, {})
  {y: C, x: y}
  """
  if s is None:
    return None
  elif x == y:
    return s
  elif is_variable(x):
    return unify_var(x, y, s)
  elif is_variable(y):
    return unify_var(y, x, s)
  elif isinstance(x, Expr) and isinstance(y, Expr):
    return unify(x.args, y.args, unify(x.op, y.op, s))
  elif isterm(x) or isterm(y) or not x or not y:
    return utils.if_(x == y, s, None)
  elif utils.is_sequence(x) and utils.is_sequence(y) and len(x) == len(y):
    return unify(x[1:], y[1:], unify(x[0], y[0], s))
  else:
    return None
Exemple #5
0
 def test_is_sequence(self):
   """Test is_sequence."""
   self.assertTrue(utils.is_sequence({}))
   self.assertTrue(utils.is_sequence([]))
   self.assertFalse(utils.is_sequence(5))
   self.assertFalse(utils.is_sequence(self))
Exemple #6
0
 def test_is_sequence(self):
     """Test is_sequence."""
     self.assertTrue(utils.is_sequence({}))
     self.assertTrue(utils.is_sequence([]))
     self.assertFalse(utils.is_sequence(5))
     self.assertFalse(utils.is_sequence(self))