gpt4 book ai didi

clojure - Clojure 中的目标排序 `core.logic`

转载 作者:行者123 更新时间:2023-12-02 14:50:04 26 4
gpt4 key购买 nike

The following Clojure code使用 core.logic 以两种不同的顺序解决具有相同目标的相同逻辑问题。这种排序选择会导致一个很快完成,另一个则挂起。

(use `clojure.core.logic)

;; Runs quickly. Prints (1 2 3).
(clojure.pprint/pprint (run* [q] (fresh [x] (== x [1,2,3])
(membero q x))))

;; Hangs
(clojure.pprint/pprint (run* [q] (fresh [x] (membero q x)
(== x [1,2,3]))))

是否有通用的解决方案或常见做法来避免此问题?

最佳答案

这是我的理解:

使用core.logic,您希望尽早减少搜索空间。如果您首先放置 membero 约束,则运行将通过搜索 membero 空间开始,并在 == 约束产生的失败时回溯。但 membero 空间是巨大的,因为 qx 都不是统一的或至少是有界的。

但如果你把 == 约束放在前面,你就直接将 x[1 2 3] 统一起来,搜索空间为membero 现在明确绑定(bind)到 x 的元素。

关于clojure - Clojure 中的目标排序 `core.logic`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307187/

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