def unify(u, v, s): # no check at the moment """ Find substitution so that u == v while satisfying s >>> from logpy.unify import unify, var >>> x = var('x') >>> unify((1, x), (1, 2), {}) {~x: 2} """ u = walk(u, s) v = walk(v, s) if u == v: return s if isvar(u): return assoc(s, u, v) if isvar(v): return assoc(s, v, u) types = (type(u), type(v)) if types in unify_dispatch: return unify_dispatch[types](u, v, s) for (typu, typv), unify_fn in unify_isinstance_list: if isinstance(u, typu) and isinstance(v, typv): return unify_fn(u, v, s) for typ, fn in seq_registry: action = False if isinstance(u, typ): u = fn(u); action=True if isinstance(v, typ): v = fn(v); action=True if action: return unify(u, v, s) else: return False
def unify(u, v, s): # no check at the moment """ Find substitution so that u == v while satisfying s >>> from logpy.unify import unify, var >>> x = var('x') >>> unify((1, x), (1, 2), {}) {~x: 2} """ u = walk(u, s) v = walk(v, s) if u == v: return s if isvar(u): return assoc(s, u, v) if isvar(v): return assoc(s, v, u) types = (type(u), type(v)) if types in unify_dispatch: return unify_dispatch[types](u, v, s) else: return False
def reify(e, s): """ Replace variables of expression with substitution >>> from logpy.unify import reify, var >>> x, y = var(), var() >>> e = (1, x, (3, y)) >>> s = {x: 2, y: 4} >>> reify(e, s) (1, 2, (3, 4)) >>> e = {1: x, 3: (y, 5)} >>> reify(e, s) {1: 2, 3: (4, 5)} """ if isvar(e): return reify(s[e], s) if e in s else e if type(e) in reify_dispatch: return reify_dispatch[type(e)](e, s) for typ, reify_fn in reify_isinstance_list: if isinstance(e, typ): return reify_fn(e, s) else: return e
def reify_var(v, s): assert isvar(v) return reify(s[v], s) if v in s else v
def test_isvar(): assert not isvar(3) assert isvar(var(3))
def test_context_manager(): with variables(1): assert isvar(1) assert not isvar(1)