gpt4 book ai didi

clojure - 使用有限域声明降序/升序坐标的谓词

转载 作者:行者123 更新时间:2023-12-01 19:52:38 25 4
gpt4 key购买 nike

我想写一个谓词,descendo,它声明第一个给定的坐标 [y, x] 下降到第二个给定的坐标(想象一下在左上角有 [0, 0] 的板)。

Prolog 中的一个非常简单的实现可能如下所示:

descending(B, A) :-
B = [B1,B2],
A = [A1,A2],
B1 is A1 + 1,
B2 is A2 + 1.

虽然我没有在 core.logic 中实现这个。我已经尝试了很多不同的东西(==/=fd/conso/appendo 和 +fd/+)。我尝试过的一件事:
(defn descendo
[b a]
(l/fresh [b1 b2 a1 a2]
(l/== b [b1 b2])
(l/== a [a1 a2])
(l/+fd b1 1 a1)
(l/+fd b2 1 a2)))

当像这样运行它们时,它们中的大多数只是不返回任何内容:
(l/run* [q]
(l/fresh [a]
(l/infd a (l/domain [0 0] [1 0] [0 1] [1 1]))
(descendo a [0 0])
(l/== q a)))

=> () ; expected output: ([1 1])

我有一种感觉,在使用 core.logic 时,在 Prolog 中考虑太多不好……任何提示都值得赞赏。提前致谢。

编辑:找到了一种解决方法,其中desdeso保持不变,但是在运行它时我们不使用域:
(l/run* [q]
(l/fresh [a]
(l/membero a [[0 0] [1 0] [0 1] [1 1]])
(l/membero q [[0 0] [1 0] [0 1] [1 1]])
(descendo a q)))

=> ([1 1])

我不确定是否 domain无论如何都应该用于向量,所以这可能不是一种解决方法,而是实际的解决方案。

最佳答案

找到了一种解决方法,其中desdeso保持不变,但是在运行它时我们不使用域:

(l/run* [q]
(l/fresh [a]
(l/membero a [[0 0] [1 0] [0 1] [1 1]])
(l/membero q [[0 0] [1 0] [0 1] [1 1]])
(descendo a q)))

=> ([1 1])

我不确定域是否打算用于向量,所以这可能不是解决方法,而是实际的解决方案。

关于clojure - 使用有限域声明降序/升序坐标的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355352/

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