繁体   English   中英

使用core.logic列出唯一的DAG父级

[英]Listing unique DAG parents with core.logic

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

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

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

(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介绍的memoization。

如果你像你一样为边缘定义个别事实,那么如果不离开关系编程,就没有办法做到这一点。 一种解决方案是简单地将整个结果列表传递给Clojure的set构造函数。 另一种选择是在逻辑程序中的一次传递中处理所有节点。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM