Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
def reify_var(v, s):
    assert isvar(v)
    return reify(s[v], s) if v in s else v
Exemple #6
0
def test_isvar():
    assert not isvar(3)
    assert isvar(var(3))
Exemple #7
0
def test_context_manager():
    with variables(1):
        assert isvar(1)
    assert not isvar(1)