3

次のコードは、最終的に「Out of Local Stack」エラーを伴う無限ループを引き起こします。基本的に、MX と同じになるまで GX の値を減らします。サンプル入力 [[m,g,b],[w,w,w]],パス

wallBlock('w').
wallBlock('b').
item('f').
item('p').
item('m').
item('u').
item('6').
item('r').
item('g').
anyCell(Cell) :- 
    wallBlock(Cell).
anyCell(Cell) :-
    item(Cell).


ghostPathing(Maps, Path) :-
    append(Maps, NewMap), 
    length(Maps, N), 
    findGhost(NewMap, N, GX, GY), 
    findPacman(NewMap, N, MX, MY),
    moveGhost(NewMap, N, MX, MY, GX, GY, Path).

/*FINDS THE COORDINATES OF THE GHOST W=row X=column*/
findGhost(NewMap, N, X, Y) :-
    findGhostSpot(NewMap, S),
    X is floor(S / N) + 1,
    Y is (S mod N) +1 .

findGhostSpot(['g'|_], 0) :-
    print('Found Ghost. ').
findGhostSpot(['r'|_], 0) :-
    print('Found Ghost. ').
findGhostSpot(['6'|_], 0) :-
    print('Found Ghost. ').
findGhostSpot([_|Tail], S) :-
    findGhostSpot(Tail, S1),
    S is S1+1 .

/*FINDS THE COORDINATES OF THE GHOST W=row X=column*/
findPacman(NewMap, N, X, Y) :-
    findPacmanSpot(NewMap, S),
    X is floor(S / N) + 1,
    Y is (S mod N) + 1.

findPacmanSpot(['m'|_], 0) :-
    print('Found Pacman. ').
findPacmanSpot([_|Tail], S) :-
    findPacmanSpot(Tail, S1),
    S is S1+1 .

/* Base Case, Ghost is on the Pacman*/
moveGhost(_, _, X, Y, X, Y, []).

/*IF PACMAN AND THE GHOST ARE IN THE SAME COLUMN*/
moveGhost(NewMap, N, MX, Y, GX, Y, ['u'|Rest]) :-
    itemNext(NewMap, CN, Z),
    item(Z),
    moveGhost(NewMap, N, MX, Y, X, Y, Rest),
    GX is X + 1,
    MX < GX,
    CN is ((X * N) + Y).
moveGhost(NewMap, N, MX, Y, GX, Y, ['d'|Rest]) :-
    itemNext(NewMap, CN, Z),
    item(Z),
    moveGhost(NewMap, N, MX, Y, X, Y, Rest),
    GX is X - 1,
    MX > GX,
    CN is ((X * N) + Y).

/*IF PACMAN AND THE GHOST ARE IN THE SAME ROW*/
moveGhost(NewMap, N, X, MY, X, GY, ['l'|Rest]) :-
    itemNext(NewMap, CN, Z),
    item(Z),
    moveGhost(NewMap, N, X, MY, X, Y, Rest),
    GY is Y + 1,
    MY < GY,
    CN is ((X * N) + Y).
moveGhost(NewMap, N, X, MY, X, GY, ['r'|Rest]) :-
    itemNext(NewMap, CN, Z),
    item(Z),
    moveGhost(NewMap, N, X, MY, X, Y, Rest),
    GY is Y - 1,
    MY > GY,
    CN is ((X * N) + Y).

itemNext([Cell|_], 0, Cell) :-
    item(Cell). 
itemNext([First|Rest], CN, Cell) :-
    anyCell(First),
    itemNext(Rest, N, Cell),
    CN is N + 1.

これは 2 次元配列であるため、追加により 1 次元に変換され、NextCell の算術演算は行の長さを取り、隣接するセルの座標を見つけて、そのセルの値を返します。セルが「w」または「b」の場合、ゴーストはその方​​向に移動できません。マップは正方形であると想定できます。

4

1 に答える 1

1

(あなたの質問はなぜあなたのプログラムがループするのかということだと思います。)

あなたのプログラムが終了しない理由を特定するために、私はあなたのプログラムに目標falseを挿入しました。残りのプログラム(失敗スライス)は終了しないため、元のプログラムも終了しません。残りの表示部分を修正する必要があります。または、言い換えると、現在のフラグメントが変更されていない限り、問題は解決しません。そして、マイナーな発言として、print/1あなたのように純粋なプログラムでの目標を避ける方が良いです。

詳細については、タグ

?-ghostPathing([[m、g、b]、[w、w、w]]、Path)、falseitem('f'):- falseitem('p'):- false。
item('m')。
item('u'):- falseitem( '6'):- falseitem('r'):- false。
item('g')。

anyCell(Cell):- falsewallBlock(Cell)。
anyCell(Cell):-
    item(セル)。

ghostPathing(マップ、パス):-
    append(Maps、NewMap)、
    長さ(マップ、N)、
    findGhost(NewMap、N、GX、GY)、
    findPacman(NewMap、N、MX、MY)、
    moveGhost(NewMap、N、MX、MY、GX、GY、Path)、false。

/*ゴーストの座標を見つけるW=行X=列*/
findGhost(NewMap、N、X、Y):-
    findGhostSpot(NewMap、S)、
    Xはfloor(S / N)+1です
    Yは(S mod N)+1です。

findGhostSpot(['g' | _]、0):-
    print('Found Ghost。')。
findGhostSpot(['r' | _]、0):- falseprint('Found Ghost。')findGhostSpot(['6' | _]、0):- falseprint('Found Ghost。')。
findGhostSpot([_ | Tail]、S):-
    findGhostSpot(Tail、S1)、
    SはS1+1です。

/*ゴーストの座標を見つけるW=行X=列*/
findPacman(NewMap、N、X、Y):-
    findPacmanSpot(NewMap、S)、
    Xはfloor(S / N)+1です
    Yは(S mod N)+1です。

findPacmanSpot(['m' | _]、0):-
    print('Pacmanが見つかりました。')。
findPacmanSpot([_ | Tail]、S):- falsefindPacmanSpot(Tail、S1)SはS1+1です。

/ *ベースケース、ゴーストはパックマンにあります* /
moveGhost(_、_、X、Y、X、Y、[]):- false。

/*パックマンとゴーストが同じ列にいる場合*/
moveGhost(NewMap、N、MX、Y、GX、Y、['u' | Rest]):- falseitemNext(NewMap、CN、Z)item(Z)moveGhost(NewMap、N、MX、Y、 X、Y、Rest)GXはX + 1MX <GXCNは((X * N)+ Y)です。
moveGhost(NewMap、N、MX、Y、GX、Y、['d' | Rest]):-   falseitemNext(NewMap、CN、Z)item(Z)moveGhost(NewMap、N、MX、Y、 X、Y、Rest)GXはX-1MX> GXCNは((X * N)+ Y)です。

/*パックマンとゴーストが同じ列にいる場合*/
moveGhost(NewMap、N、X、MY、X、GY、['l' | Rest]):-
    itemNext(NewMap、CN、Z)、
    item(Z)、
    moveGhost(NewMap、N、X、MY、X、Y、Rest)、falseGYはY + 1MY <GYCNは((X * N)+ Y)です。
moveGhost(NewMap、N、X、MY、X、GY、['r' | Rest]):- falseitemNext(NewMap、CN、Z)item(Z)moveGhost(NewMap、N、X、MY、 X、Y、Rest)GYはY-1MY> GYCNは((X * N)+ Y)です。

itemNext([セル| _]、0、セル):-
    item(セル)。
itemNext([First | Rest]、CN、Cell):-
    anyCell(First)、
    itemNext(Rest、N、Cell)、
    CNはN+1です。
于 2012-12-03T12:57:10.953 に答える