使用有限域声明下降/上升坐标的谓词

nae*_*aeg 28 logic clojure prolog clojure-core.logic

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

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

descending(B, A) :-
  B = [B1,B2],
  A = [A1,A2],
  B1 is A1 + 1,
  B2 is A2 + 1.
Run Code Online (Sandbox Code Playgroud)

我没有在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)))
Run Code Online (Sandbox Code Playgroud)

大多数人在运行它们时只返回任何内容:

(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])
Run Code Online (Sandbox Code Playgroud)

我觉得在使用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])
Run Code Online (Sandbox Code Playgroud)

我不确定是否domain意味着要在矢量上使用,所以这可能不是一种解决方法,而是实际的解决方案.

nae*_*aeg 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])
Run Code Online (Sandbox Code Playgroud)

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