def assocunify(u, v, s, eq=core.eq): """ Associative Unification See Also: eq_assoccomm """ res = unify(u, v, s) if res is not False: return (res,) # TODO: iterate through all possibilities if isinstance(u, tuple) and isinstance(v, tuple): uop, u = u[0], u[1:] vop, v = v[0], v[1:] s = unify(uop, vop, s) if s is False: raise StopIteration() op = walk(uop, s) sm, lg = (u, v) if len(u) <= len(v) else (v, u) parts = (groupsizes_to_partition(*gsizes) for gsizes in groupsizes(len(lg), len(sm))) ops = (makeops(op, partition(lg, part)) for part in parts) goal = condeseq([(eq, a, b) for a, b in zip(sm, lg2)] for lg2 in ops) return goaleval(goal)(s) return ()
def test_unify(): assert unify(1, 1, {}) == {} assert unify(1, 2, {}) == False assert unify(var(1), 2, {}) == {var(1): 2} assert unify(2, var(1), {}) == {var(1): 2} assert unify((1, 2), (1, 2), {}) == {} assert unify((1, 2), (1, 2, 3), {}) == False assert unify((1, var(1)), (1, 2), {}) == {var(1): 2} assert unify((1, var(1)), (1, 2), {var(1): 3}) == False
def assocunify(u, v, s, eq=core.eq, n=None): """ Associative Unification See Also: eq_assoccomm """ 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,) # TODO: iterate through all possibilities 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)
def assocunify(u, v, s, eq=core.eq, n=None): """ Associative Unification See Also: eq_assoccomm """ if not isinstance(u, tuple) and not isinstance(v, tuple): res = unify(u, v, s) if res is not False: return (res,) # TODO: iterate through all possibilities if isinstance(u, tuple) and isinstance(v, tuple): uop, u = u[0], u[1:] vop, v = v[0], v[1:] s = unify(uop, vop, s) if s is False: raise StopIteration() op = walk(uop, s) sm, lg = (u, v) if len(u) <= len(v) else (v, u) 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 isinstance(u, tuple): a, b = u, v if isinstance(v, tuple): a, b = v, u op, tail = a[0], a[1:] ns = [n] if n else range(2, len(a)) knowns = (((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)
def unify_assoccomm(u, v, s, ordering=None): u = walk(u, s) v = walk(v, s) res = unify(u, v, s) if res is not False: yield res if isinstance(u, tuple) and isinstance(v, tuple): uop, u = u[0], u[1:] vop, v = v[0], v[1:] s = unify(uop, vop, s) if s is False: raise StopIteration() op = walk(uop, s) sm, lg = (u, v) if len(u) <= len(v) else (v, u) for part in kbins(range(len(lg)), len(sm), ordering): lg2 = makeops(op, partition(lg, part)) # TODO: we use logpy code within python within logpy # There must be a more elegant way for res in conde((eq_assoccomm, a, b) for a, b in zip(sm, lg2))(s): yield res