3

以下代码导致无限循环,最终出现“Out of Local Stack”错误。基本上,我将 GX 的值递减,直到它与 MX 相同。样本输入 [[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.

因为它是一个 2d 数组,所以 append 将其转换为 1d 并且 NextCell 中的算术采用一行的长度并找到相邻单元格的坐标并返回该单元格的值。如果单元格是“w”或“b”,则幽灵不能朝那个方向移动。你可以假设地图是方形的!

4

1 回答 1

1

(我假设你的问题是你的程序为什么会循环。)

为了确定您的程序未终止的原因,我已false在您的程序中插入了目标。由于剩余程序(故障片)不会终止,因此您的原始程序也不会终止。您需要修复剩余可见部分中的某些内容。或者,换种说法:只要当前的fragment不变,问题就会一直存在!作为一个小评论,最好避免print/1像你这样的纯程序中的目标。

有关更多信息,请参阅标签

?- ghostPathing([[m,g,b],[w,w,w]],Path), false项目('f'):-项目('p'):-。
项目('m')。
项目('u'):-项目('6'):-项目('r'):-。
项目('g')。

anyCell(Cell) :- false ,
     wallBlock(Cell)。
任何细胞(细胞): -
    项目(单元格)。

ghostPathing(地图,路径):-
    附加(地图,新地图),
    长度(地图,N),
    findGhost(NewMap, N, GX, GY),
    findPacman(NewMap, N, MX, MY),
    moveGhost(NewMap, N, MX, MY, GX, GY, 路径), false。

/*找到幽灵的坐标 W=row X=column*/
findGhost(NewMap, N, X, Y) :-
    findGhostSpot(NewMap, S),
    X是地板(S / N)+ 1,
    Y 是 (S mod N) +1 。

findGhostSpot(['g'|_], 0) :-
    print('发现幽灵。').
findGhostSpot(['r'|_], 0) :- false ,
     print('Found Ghost.')findGhostSpot(['6'|_], 0) :- false ,
     print('Found Ghost.')。
findGhostSpot([_|尾巴], S) :-
    findGhostSpot(尾巴,S1),
    S 是 S1+1 。

/*找到幽灵的坐标 W=row X=column*/
findPacman(NewMap, N, X, Y) :-
    findPacmanSpot(NewMap, S),
    X是地板(S / N)+ 1,
    Y 是 (S mod N) + 1。

findPacmanSpot(['m'|_], 0) :-
    print('找到吃豆子。').
findPacmanSpot([_|Tail], S) :- false ,
     findPacmanSpot(Tail, S1) ,
     S 是 S1+1。

/* 基本情况,Ghost 在 Pacman*/
moveGhost(_, _, X, Y, X, Y, []) :- false。

/*如果吃豆人和幽灵在同一列*/
moveGhost(NewMap, N, MX, Y, GX, Y, ['u'|Rest]) :- false ,
     itemNext(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]) :-   false ,
     itemNext(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),
    项目(Z),
    moveGhost(NewMap, N, X, MY, X, Y, Rest), false ,
     GY 是 Y + 1 ,
     MY < GY ,
     CN 是 ((X * N) + Y)moveGhost(NewMap, N, X, MY, X, GY, ['r'|Rest]) :- false ,
     itemNext(NewMap, CN, Z) ,
     item(Z) ,
     moveGhost(NewMap, N, X, MY, X, Y, Rest) ,
     GY 是 Y - 1 ,
     MY > GY ,
     CN 是 ((X * N) + Y)。

itemNext([单元格|_], 0, 单元格) :-
    项目(单元格)。
itemNext([First|Rest], CN, Cell) :-
    anyCell(第一个),
    itemNext(休息,N,细胞),
    CN 是 N + 1。
于 2012-12-03T12:57:10.953 回答