Exemple #1
0
def sibling(person1, person2):
    common_parent = var()
    return lall(
        neq(person1, person2),
        parent(common_parent, person1),
        parent(common_parent, person2),
    )
Exemple #2
0
def cousin(person1, person2):
    parent1 = var()
    parent2 = var()
    return lall(
        parent(parent1, person1),
        parent(parent2, person2),
        sibling(parent1, parent2),
    )
Exemple #3
0
def test_walko_misc():
    q_lv = var(prefix="q")

    expr = etuple(add, etuple(mul, 2, 1), etuple(add, 1, 1))
    res = run(0, q_lv, walko(eq, expr, expr))
    # TODO: Remove duplicates
    assert len(res) == 162

    expr2 = etuple(add, etuple(mul, 2, 1), etuple(add, 2, 1))
    res = run(0, q_lv, walko(eq, expr, expr2))
    assert len(res) == 0

    def one_to_threeo(x, y):
        return conde([eq(x, 1), eq(y, 3)])

    res = run(
        1,
        q_lv,
        walko(
            one_to_threeo,
            [1, [1, 2, 4], 2, [[4, 1, 1]], 1],
            q_lv,
        ),
    )
    assert res == ([3, [3, 2, 4], 2, [[4, 3, 3]], 3], )

    assert run(2, q_lv, walko(eq, q_lv, q_lv, null_type=ExpressionTuple)) == (
        q_lv,
        etuple(),
    )

    res = run(
        1,
        q_lv,
        walko(
            one_to_threeo,
            etuple(
                add,
                1,
                etuple(mul, etuple(add, 1, 2), 1),
                etuple(add, etuple(add, 1, 2), 2),
            ),
            q_lv,
            # Only descend into `add` terms
            rator_goal=lambda x, y: lall(eq(x, add), eq(y, add)),
        ),
    )

    assert res == (etuple(add, 3, etuple(mul, etuple(add, 1, 2), 1),
                          etuple(add, etuple(add, 3, 2), 2)), )
Exemple #4
0
def single_math_reduceo(expanded_term, reduced_term):
    """Construct a goal for some simple math reductions."""
    x_lv = var()
    return lall(
        isinstanceo(x_lv, Real),
        isinstanceo(x_lv, ExpressionTuple),
        conde(
            [
                eq(expanded_term, etuple(add, x_lv, x_lv)),
                eq(reduced_term, etuple(mul, 2, x_lv)),
            ],
            [
                eq(expanded_term, etuple(log, etuple(exp, x_lv))),
                eq(reduced_term, x_lv)
            ],
        ),
    )
Exemple #5
0
def son(a_child, an_adult):
    return lall(child(a_child, an_adult), man(a_child))
Exemple #6
0
def uncle(an_adult, a_child):
    return lall(sibling_of_parent(an_adult, a_child), man(an_adult))
Exemple #7
0
def aunt(an_adult, a_child):
    return lall(sibling_of_parent(an_adult, a_child), woman(an_adult))
Exemple #8
0
def nephew(a_child, an_adult):
    return lall(child_of_sibling(a_child, an_adult), man(a_child))
Exemple #9
0
def grandfather(person1, person2):
    return lall(
        grandparent(person1, person2),
        man(person1),
    )
 def walk_rel(x, y):
     return lall(eq(x, mt(1)), eq(y, mt(3)))
Exemple #11
0
def father(an_adult, a_child):
    return lall(parent(an_adult, a_child), man(an_adult))
Exemple #12
0
def mother(an_adult, a_child):
    return lall(parent(an_adult, a_child), woman(an_adult))
Exemple #13
0
def ancestor(an_adult, a_child):
    parent_of_child = var()
    return lall(
        parent(parent_of_child, a_child),
        lany(eq(an_adult, parent_of_child),
             Zzz(ancestor, an_adult, parent_of_child)))
Exemple #14
0
def granddaughter(a_child, an_adult):
    return lall(grandchild(a_child, an_adult), woman(a_child))
Exemple #15
0
def grandson(a_child, an_adult):
    return lall(grandchild(a_child, an_adult), man(a_child))
Exemple #16
0
def daughter(a_child, an_adult):
    return lall(child(a_child, an_adult), woman(a_child))
Exemple #17
0
def grandparent(an_adult, a_child):
    common_relative = var()
    return lall(
        parent(an_adult, common_relative),
        parent(common_relative, a_child),
    )
Exemple #18
0
def sibling_of_parent(a_person, a_child):
    parent_of_child = var()
    return lall(
        parent(parent_of_child, a_child),
        sibling(a_person, parent_of_child),
    )
Exemple #19
0
def child_of_sibling(a_child, an_adult):
    parent_of_child = var()
    return lall(
        parent(parent_of_child, a_child),
        sibling(an_adult, parent_of_child),
    )
Exemple #20
0
def niece(a_child, an_adult):
    return lall(child_of_sibling(a_child, an_adult), woman(a_child))
from kanren import var, lall, lany, membero, eq, run
people = var()
rules = lall(
    # There are 3 people: Giovanni, Berto, Laura
    (eq, (var(), var(), var()), people),
    # Giovanni's house is Splendor or Majestic
    lany(
        (membero, ("Giovanni", "Splendor", var()), people),
        (membero, ("Giovanni", "Majestic", var()), people),
    ),
    # Room 305 is in Splendor house
    (membero, (var(), "Splendor", "305"), people),
    # Berto's house is Beatiful
    (membero, ("Berto", "Beatiful", var()), people),
    # Laura lives in room 406
    (membero, ("Laura", var(), "406"), people),
    # Who lives in house Majestic?
    (membero, (var(), "Majestic", var()), people),
    # Who lives in room 204?
    (membero, (var(), var(), "204"), people),
)
solutions = run(0, people, rules)
solution = list({tuple(sorted(s)) for s in solutions})[0]
for s in solution:
    print(*s)
Exemple #22
0
def grandmother(an_adult, a_child):
    return lall(
        grandparent(an_adult, a_child),
        woman(an_adult),
    )