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
   194   195   196   197   198   199   200   201   202   203   204