0
p(0,0).
p(0,1).
p(0,2).
p(0,3).
p(0,4).
p(1,1).
p(1,2).
p(1,3).
p(1,4).
p(1,0).
p(2,0).
p(2,1).
p(2,2).
p(2,3).
p(2,4).
p(3,0).
p(3,1).
p(3,2).
p(3,3).
p(3,4).
p(4,0).
p(4,1).
p(4,2).
p(4,3).
p(4,4).

adjacent(p(X,Y),p(X,Z)) :-
    p(X,Y),
    p(X,Z),
    Z is Y+1.
adjacent(p(X,Y),p(X,Z)) :-
    p(X,Y),
    p(X,Z),
    Z is Y-1.
adjacent(p(X,Y),p(Z,Y)) :-
    p(X,Y),
    p(X,Z),
    Z is X+1.
adjacent(p(X,Y),p(Z,Y)) :-
    p(X,Y),
    p(X,Z),
    Z is X-1.

adjacentC(X,Y) :-
    adjacent(X,Y).
adjacentC(X,Y) :-
    adjacent(X,Z),
    adjacentC(Z,Y).

我不知道为什么我写的这段代码不起作用。

例如:

?- adjacentC((0,0),(4,4)). ERROR
4

1 回答 1

1

快速回答:以下工作并始终使用closure/3在其他地方定义的终止。

adjacentD(X,Y) :-
   closure(adjacent,X,Y).

但是,由于 的定义效率低下,这种方法非常缓慢adjacent/3。这是一个更好的/哦,算了,这是一个更正确的,首先:

adjacent2(p(X0,Y0),p(X,Y)) :-
   p(X0,Y0),
   (  X0 = X,
      p(X,Y),
      abs(Y0-Y) =:= 1
   ;  Y0 = Y,
      p(X,Y),
      abs(X0-X) =:= 1
   ).
于 2015-05-08T09:51:22.237 回答