prolog - Clojure core.logic 的简单序言

标签 prolog clojure-core.logic minikanren

我最近一直在玩 Prolog,并开始思考如何表示我想用它完成的一些任务,这些任务主要是关于拥有一个事实数据库并对其进行简单查询,将多个事实连接在一起。

但我想在我编写 Clojure 的上下文中使用它。看起来像core.logic应该做我想做的。

但我天真地发现很难看到如何将基本的 Prolog 谓词放入 core.logic。

例如,我应该如何在 core.logic 中表示像这样简单的东西:

person(phil).
person(mike).
food(cheese).
food(apple).
likes(phil,apple).
likes(phil,cheese).

还有一个类似的查询

food(F),person(P),likes(P,F)

我能找到的大多数介绍都侧重于逻辑编程,而不是数据表示。

最佳答案

正如Guy Coder所说,core.logic下的PLDB包正好解决了这类问题:

(db-rel person p)
(db-rel food f)
(db-rel likes p f)

(def facts (db
  [person 'phil]
  [person 'mike]
  [food 'cheese]
  [food 'apple]
  [likes 'phil 'apple]
  [likes 'phil 'cheese]))

(with-db facts (run* [p f] (food f) (person p) (likes p f)))

=> ([phil cheese] [phil apple])    p=phil,f=cheese   or   p=phil,f=apple

关于prolog - Clojure core.logic 的简单序言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59763327/

相关文章:

recursion - 用递归调用替换序言基本情况

prolog - 事实、谓词和规则

clojure - 使用 clojure 的 core.logic/minikanren 查找相似集

list - 在序言中列出连续对

prolog - 在 Prolog 中计算时差

clojure - 在 Clojure 中是否有更好的方法来访问嵌套映射和向量?

clojure - 在理解自定义 core.logic 约束时需要澄清

clojure - Clojure 中的目标排序 `core.logic`

scheme - miniKanren:如何定义#s和#u?

Clojure.logic 与 The Reasoned Schemer 的区别