prolog - Clojure core.logic 的简单 Prolog
问题描述
我最近一直在玩 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
推荐阅读
- transparency - Gimp 2.8.22:更改颜色并保持透明度
- css - 如何实现 Angular 6+ Bootstrap 标签集右对齐标签?
- recursion - 以递归方式使用机器学习预测时间范围
- kotlin - Kotlin 类应该有一个无参数构造函数
- daml - 如何在 DAML 中提取元组的组件?
- php - 从数组或对象在 php 中生成 CSV
- c++ - 如何在 matlab 上修复(使用 mexOpenCV 时出错)?
- amazon-web-services - 如何启动具有从列表中选择的多个 SG 的实例
- yocto - yocto krogoth 上的 hostapd
- elasticsearch - Elasticsearch计数数组中的元素,用于具有值的属性