0

我正在与 kanren 合作进行逻辑编程,这对我来说是全新的。我已经了解如何建立关系,但我想与多个特征建立关系,例如适合这个描述:

  • 定义关系食物并规划这些事实:鳄梨、胡萝卜、番茄和西兰花是食物。
  • 定义关系颜色并对这些事实进行编程:胡萝卜是橙色的,鳄梨是绿色的,西兰花是绿色的,番茄是红色的。
  • 定义一个喜欢的关系并对这些事实进行编程:Jeff 喜欢胡萝卜、鳄梨和棒球,Bill 喜欢鳄梨和棒球,Steve 喜欢番茄和棒球,Mary 喜欢花椰菜,而 Peter 喜欢棒球。

第一部分非常简单,这是我到目前为止所拥有的,我相信这是正确的。

food = Relation()
color = Relation()
likes = Relation()

fact(food, "avocado")
fact(food, "carrot")
fact(food, "tomato")
fact(food, "broccoli")

第二部分是令人困惑的地方,但我认为当我查看可以在文档中找到的父示例时它应该是正确的。

fact(color, ("green", "avocado"))
fact(color, ("carrot", "orange"))
fact(color, ("broccoli", "green"))
fact(color, ("tomato", "red"))

第三部分是我完全迷失的地方,我认为这是不正确的,因为我尝试查询它。这是我到目前为止所拥有的:

fact(likes, ("Jeff", "avocado", "carrot", "baseball"))
fact(likes, ("Bill", "avocado", "baseball"))
fact(likes, ("Steve", "tomato", "baseball"))
fact(likes, ("Mary", "broccoli"))
fact(likes, ("Peter", "baseball"))

关于如何做第三部分的任何建议?

4

1 回答 1

0
from kanren import Relation, fact, run, var

food = Relation()
color = Relation()
likes = Relation()

fact(food, "avocado")
fact(food, "carrot")
fact(food, "tomato")
fact(food, "broccoli")

fact(color, "avocado",  "green")
fact(color, "carrot",   "orange")
fact(color, "broccoli", "green")
fact(color, "tomato",   "red")

fact(likes, "Jeff",  "avocado")
fact(likes, "Jeff",  "carrot")
fact(likes, "Jeff",  "baseball")
fact(likes, "Bill",  "avocado")
fact(likes, "Bill",  "baseball")
fact(likes, "Steve", "tomato")
fact(likes, "Steve", "baseball")
fact(likes, "Mary",  "broccoli")
fact(likes, "Peter", "baseball")

一个示例查询:

杰夫喜欢一些食物,它的颜色是绿色的。

>>> x = var()
>>> run(2, x, likes("Jeff", x), color(x, "green"))
('avocado',)
于 2022-02-26T20:40:40.380 回答