我想写一个谓词,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中的思考太多了......任何暗示都很赞赏。提前谢谢。
编辑:找到了一种解决方法,其中descendo保持不变,但在运行时我们不使用域名:
(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
是否适用于矢量,所以这可能不是一种解决方法,而是实际解决方案。
答案 0 :(得分:0)
找到一种解决方法,其中descendo保持不变,但在运行时我们不使用域名:
(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])
我不确定域是否意味着要在向量上使用,所以这可能不是一种解决方法,而是实际的解决方案。