这是一个(希望如此)简单的逻辑程序,我已经坚持了一段时间。
我有一个由 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* 语句中执行它(即将结果包装在一个集合中不是我的目标)。
此外,将“^:tabled”添加到 parento 似乎可以解决问题,但我不想要 tabled 引入的记忆。