Python与Kanren的关系



我正在与kanren合作进行逻辑编程,这对我来说是全新的。我已经了解了如何处理关系,但我想建立具有多种功能的关系,例如符合以下描述的关系:

  • 定义一种关系食物,并对这些事实进行编程:鳄梨、胡萝卜、番茄和西兰花都是食物
  • 定义一个关系颜色,并对这些事实进行编程:胡萝卜是橙色,鳄梨是绿色,西兰花是绿色,番茄是红色
  • 定义一个喜欢的关系并编程这些事实:杰夫喜欢胡萝卜、鳄梨和棒球,比尔喜欢鳄梨和棒球;史蒂夫喜欢番茄和棒球;玛丽喜欢西兰花;彼得喜欢棒球

第一部分非常直接,这是我到目前为止所掌握的,我相信这是正确的。

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"))

关于如何做第三部分有什么建议吗?

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',)

最新更新