Page 199 - 6734
P. 199
Ціль створюється за допомогою конструктора цілі (eq,
membero, conde та інших). Логічна програма виконується
функцією run(n, x, *goals), де n – кількість розв’язків, x –
змінна, *goals – послідовність цілей.
from kanren import *
ne = goals.not_equalo # конструктор цілі "не рівні"
#ne = goalify(lambda x,y: x!=y) # або створити з
функції
#import operator; ne = goalify(operator.ne) # або
створити з оператора
parent = Relation() # відношення між термами
fact(parent, "Іван", "Петро") # факт - Іван батько
Петра
fact(parent, "Іван", "Василь")
fact(parent, "Петро", "Марія")
x,y = var(),var() # логічні змінні
def sibling(x, y): # відношення "рідні" (брат або
сестра)
z = var()
# (z батько x) і (z батько y) і (x,y не рівні)
# conde - конструктор цілі для логічного І та АБО
return conde( (parent(z, x), parent(z, y),
(ne,(x,y),True)) )
for x,y in run(0, (x, y), sibling(x, y)):
print x,y # вивести усі пари рідних
x,y = var(),var()
for x in run(0, x, conde( (parent(x, "Петро"),),
(parent("Петро", x),) )):
print x # вивести усіх батьків або дітей Петра
Петро Василь
Василь Петро
198