def sibling(person1, person2): common_parent = var() return lall( neq(person1, person2), parent(common_parent, person1), parent(common_parent, person2), )
def cousin(person1, person2): parent1 = var() parent2 = var() return lall( parent(parent1, person1), parent(parent2, person2), sibling(parent1, parent2), )
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)), )
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) ], ), )
def son(a_child, an_adult): return lall(child(a_child, an_adult), man(a_child))
def uncle(an_adult, a_child): return lall(sibling_of_parent(an_adult, a_child), man(an_adult))
def aunt(an_adult, a_child): return lall(sibling_of_parent(an_adult, a_child), woman(an_adult))
def nephew(a_child, an_adult): return lall(child_of_sibling(a_child, an_adult), man(a_child))
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)))
def father(an_adult, a_child): return lall(parent(an_adult, a_child), man(an_adult))
def mother(an_adult, a_child): return lall(parent(an_adult, a_child), woman(an_adult))
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)))
def granddaughter(a_child, an_adult): return lall(grandchild(a_child, an_adult), woman(a_child))
def grandson(a_child, an_adult): return lall(grandchild(a_child, an_adult), man(a_child))
def daughter(a_child, an_adult): return lall(child(a_child, an_adult), woman(a_child))
def grandparent(an_adult, a_child): common_relative = var() return lall( parent(an_adult, common_relative), parent(common_relative, a_child), )
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), )
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), )
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)
def grandmother(an_adult, a_child): return lall( grandparent(an_adult, a_child), woman(an_adult), )