列出具有 core.logic 的唯一 DAG 父项



这是一个(希望)简单的逻辑程序,我已经坚持了一段时间。

我在 core.logic 中有一个由边缘关系表示的 DAG,在生成父节点列表时,当我在图形中有"菱形"时,我会得到重复项(我在这里不是在谈论周期)。

在这种情况下,有没有办法生成一个不同的父母列表(通过重写 parento 或类似)?

(defrel edge a b)
(fact edge :a :b)
(fact edge :a :c)
(fact edge :b :d)
(fact edge :c :d)
(defne parento [x y]
  ([x y] (edge y x))   
  ([x y] (fresh [z]
           (edge z x)
           (parento z y))))
(run* [q] (parento :d q))
;; => (:b :c :a :a)

我想得到 (:b :c :a) 并且我想在 run* 语句中执行此操作(即将结果包装在一个集合中不是我的目标)。

此外,在parento中添加"^:tabled"似乎可以解决问题,但我不希望tabled引入的记忆。

如果您像

以前一样为边缘定义单个事实,则无法在不离开关系编程的情况下做到这一点。一种解决方案是简单地将整个结果列表传递给 Clojure 的集合构造函数。另一种选择是在逻辑程序中一次性处理所有节点。

查看此问题的现有Prolog解决方案并翻译您发现的内容可能会有所帮助。

最新更新