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 に答える