我在 Clojure 的 core.logic 中表示一个简单的数据库。
有两个谓词:page(p) 和 link(p,q)。
page(p) 表示在名为 p 的 wiki 中存在页面
link(p,q) 表示页面 p 包含到页面 q 的链接。
我现在正在尝试查询此数据库以查找
- a) 断开的链接(即页面 p 中的链接,没有页面 q),以及
- b) 孤立页面(没有链接的页面)
我的这些查询代码是这样的:
(defn broken-links []
(pldb/with-db @facts
(logic/run* [p q]
(link p q)
(logic/nafc page q)
)))
(defn orphans []
(pldb/with-db @facts
(logic/run* [p q]
(logic/nafc link p q)
(page q)
)))
断开的链接按预期工作,但孤儿给了我一个 :- 符号列表。
我假设这与 nafc 的限制有关。根据文档:
实验:否定作为失败约束。目标 c 的所有论据都必须有依据。如果某些论点不成立,则此约束的执行将被延迟。
这些是“延迟的”,因为它们不是“地面”。
有人可以解释一下 ground 的真正含义吗?我知道它“没有自由变量”,但我仍然不明白在这种情况下这意味着什么。
其次,我应该如何编写这个孤儿查询?