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
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
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))