gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:36:46 24 4
gpt4 key购买 nike

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

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

在这种情况下有什么方法可以生成不同的 parent 列表(通过重写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 的 set 构造函数。另一种选择是在逻辑程序中一次处理所有节点。

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

关于clojure - 使用 core.logic 列出唯一的 DAG 父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12563351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com