在prolog离开本地堆栈

时间:2015-05-08 06:35:25

标签: prolog transitive-closure

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).

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

e.g:

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

1 个答案:

答案 0 :(得分: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
   ).