Simple Prolog to Clojure core.logic



我最近一直在玩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

最新更新