

def assocunify(u, v, s, eq=core.eq, n=None):
    ' Associative Unification\n\n    See Also:\n        eq_assoccomm\n    '
    (uop, uargs) = op_args(u)
    (vop, vargs) = op_args(v)
    if ((not uop) and (not vop)):
        res = unify(u, v, s)
        if (res is not False):
            return (res,)
    if (uop and vop):
        s = unify(uop, vop, s)
        if (s is False):
            raise StopIteration()
        op = walk(uop, s)
        (sm, lg) = ((uargs, vargs) if (len(uargs) <= len(vargs)) else (vargs, uargs))
        ops = assocsized(op, lg, len(sm))
        goal = condeseq(([(eq, a, b) for (a, b) in zip(sm, lg2)] for lg2 in ops))
        return goaleval(goal)(s)
    if uop:
        (op, tail) = (uop, uargs)
        b = v
    if vop:
        (op, tail) = (vop, vargs)
        b = u
    ns = ([n] if n else range(2, (len(tail) + 1)))
    knowns = (build(op, x) for n in ns for x in assocsized(op, tail, n))
    goal = condeseq(([(core.eq, b, k)] for k in knowns))
    return goaleval(goal)(s)

dataset/ETHPy150Open logpy/logpy/logpy/assoccomm.py assocunify/original