Prolog のグリッド内の特定の 2 点間にパスを作成する必要があります。私がこれまでに持っているコードは次のとおりです。
createPath(GridSize, BeginPosition, EndPosition, VisitedPoints, Path):-
nextStep(BeginPosition, NextStep, GridSize),
(
NextStep \== EndPosition,
->
nonmember(NextStep, VisitedPoints),
add(NextStep, VisitedPoints, NewVisitedPoints),
add(NextStep, Path, NewPath),
createPath(GridSize, NextStep, EndPosition, NewVisitedPoints, NewPath)
;
???
).
私のコードの少しの説明:
GridSize は単なる整数です。2 の場合、グリッドは 2x2 グリッドです。したがって、すべてのグリッドは正方形です。
BeginPosition と EndPosition は、pos(X,Y) のように表示されます。
関数 nextStep は、指定された位置の有効な隣人を探します。X と Y の値は、1 とグリッド サイズの間でなければなりません。nextStep の 4 つの異なる述語 (X + 1、X - 1、Y + 1、Y - 1) を宣言しました。コードは次のとおりです。
nextStep(pos(X,Y),pos(X1,Y),GridSize):-
X1 is X + 1,
X1 =< GridSize.
nextStep(pos(X,Y),pos(X1,Y),_):-
X1 is X - 1,
X1 >= 1.
nextStep(pos(X,Y),pos(X,Y1),GridSize):-
Y1 is Y + 1,
Y1 =< GridSize.
nextStep(pos(X,Y),pos(X,Y1),_):-
Y1 is Y - 1,
Y1 >= 1.
nonmember は、特定の要素が特定のリストにない場合に true を返します。
add は、指定されたリストに要素を追加し、その要素を含むリストを返します。
VisitedPoints について知っておくべきもう 1 つのこと: 最初は、BeginPosition と EndPosition がそのリストに格納されます。たとえば、2x2 グリッドでパスを検索する必要があり、ポイント pos(2,1) を回避する必要がある場合は、次のように関数を呼び出します。
createPath(2, pos(1,1), pos(2,2), [pos(1,1),pos(2,2),pos(2,1)], X).
私が得るべき結果は次のとおりです。
X = [pos(1,2)]
それが pos(1,1) と pos(2,2) を接続するために必要なポイントだからです。私の質問は、NextStep == EndPosition のときにコードの実行を停止するにはどうすればよいかということです。つまり、'???' の位置に何を入力すればよいのでしょうか。? または、この問題を間違った方法で処理していますか?
私は Prolog にかなり慣れていないので、オブジェクト指向言語からこれに移行するのは非常に困難です。
誰かが私の質問に答えてくれることを願っています。
敬具、
ウォル