List Prolog中的列表移位

List Prolog中的列表移位,list,prolog,failure-slice,List,Prolog,Failure Slice,下面的代码会导致一个无限循环,最终会出现“本地堆栈外”错误。基本上,我正在递减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) :- it

下面的代码会导致一个无限循环,最终会出现“本地堆栈外”错误。基本上,我正在递减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.
wallBlock('w')。
墙砖('b')。
项目('f')。
项目(‘p’)。
项目('m')。
项目(“u”)。
项目(“6”)。
项目('r')。
项目(‘g’)。
任何单元格(单元格):-
墙砖(单元)。
任意单元格(单元格):-
项目(单元格)。
重影路径(贴图、路径):-
附加(地图、新地图),
长度(地图,N),
FindHost(NewMap,N,GX,GY),
findPacman(NewMap,N,MX,MY),
moveGhost(NewMap、N、MX、MY、GX、GY、Path)。
/*查找重影W=行X=列的坐标*/
FindHost(新映射,N,X,Y):-
FindHostSpot(新图,S),
X为楼层(序号)+1,
Y是(S模N)+1。
FindHostSpot(['g'|],0):-
打印('找到幽灵')。
FindHostSpot(['r'|],0):-
打印('找到幽灵')。
FindHostSpot(['6'|],0):-
打印('找到幽灵')。
FindHostSpot([| Tail],S):-
FindHostSpot(尾部,S1),
S是S1+1。
/*查找重影W=行X=列的坐标*/
findPacman(新地图,N,X,Y):-
findPacmanSpot(新图,S),
X为楼层(序号)+1,
Y是(S模N)+1。
findPacmanSpot(['m'|],0):-
打印('找到吃豆人')。
findPacmanSpot([| Tail],S):-
findPacmanSpot(尾部,S1),
S是S1+1。
/*基本情况下,幽灵在吃豆人身上*/
moveGhost(u,u,X,Y,X,Y,[])。
/*如果PACMAN和鬼魂在同一列*/
moveGhost(NewMap,N,MX,Y,GX,Y,[u'| Rest]):-
itemNext(新地图、CN、Z),
项目(Z),
moveGhost(NewMap,N,MX,Y,X,Y,Rest),
GX是X+1,
MXGX,
CN是((X*N)+Y)。
/*如果吃豆人和鬼在同一排*/
moveGhost(NewMap,N,X,MY,X,GY,[l'| Rest]):-
itemNext(新地图、CN、Z),
项目(Z),
moveGhost(NewMap,N,X,MY,X,Y,Rest),
GY是Y+1,
我的朋友们,
CN是((X*N)+Y)。
moveGhost(NewMap,N,X,MY,X,GY,[r'| Rest]):-
itemNext(新地图、CN、Z),
项目(Z),
moveGhost(NewMap,N,X,MY,X,Y,Rest),
GY是Y-1,
我的天啊,
CN是((X*N)+Y)。
itemNext([Cell |],0,Cell):-
项目(单元格)。
itemNext([第一个|剩余],CN,单元格):-
任何单元格(第一个),
itemNext(剩余、N、单元格),
CN是N+1。
因为它是一个2d数组,所以append会将其转换为1d,NextCell中的算法会获取一行的长度,并找到相邻单元格的坐标,然后返回该单元格的值。如果单元为“w”或“b”,则重影无法向该方向移动。你可以假设地图是正方形的

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

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

有关更多信息,请参见标记

-重影路径([[m,g,b],[w,w,w]],路径),错误。 项目('f'):-false。 项目('p'):-false。 项目('m')。 项目('u'):-false。 项目('6'):-false。 项目('r'):-false。 项目(‘g’)。 anyCell(Cell):-false, 墙砖(单元)。 任意单元格(单元格):- 项目(单元格)。 重影路径(贴图、路径):- 附加(地图、新地图), 长度(地图,N), FindHost(NewMap,N,GX,GY), findPacman(NewMap,N,MX,MY), moveGhost(NewMap,N,MX,MY,GX,GY,Path),false。 /*查找重影W=行X=列的坐标*/ FindHost(新映射,N,X,Y):- FindHostSpot(新图,S), X为楼层(序号)+1, Y是(S模N)+1。 FindHostSpot(['g'|],0):- 打印('找到幽灵')。 FindHostSpot(['r'|],0):-false, 打印('找到幽灵')。 FindHostSpot(['6'|],0):-false, 打印('找到幽灵')。 FindHostSpot([| Tail],S):- FindHostSpot(尾部,S1), S是S1+1。 /*查找重影W=行X=列的坐标*/ findPacman(新地图,N,X,Y):- findPacmanSpot(新图,S), X为楼层(序号)+1, Y是(S模N)+1。 findPacmanSpot(['m'|],0):- 打印('找到吃豆人')。 findPacmanSpot([[u124; Tail],S):-false, findPacmanSpot(尾部,S1), S是S1+1。 /*基本情况下,幽灵在吃豆人身上*/ moveGhost(u,u,X,Y,X,Y,[]):-false。 /*如果PACMAN和鬼魂在同一列*/ moveGhost(NewMap,N,MX,Y,GX,Y,[u'| Rest]):-false, itemNext(新地图、CN、Z), 项目(Z), moveGhost(NewMap,N,MX,Y,X,Y,Rest), GX是X+1, MXGX, CN是((X*N)+Y)。 /*如果吃豆人和鬼在同一排*/ moveGhost(NewMap,N,X,MY,X,GY,[l'| Rest]):- itemNext(新地图、CN、Z), 项目(Z), moveGhost(NewMap,N,X,MY,X,Y,Rest),false, GY是Y+1, 我的朋友们, CN是((X*N)+Y)。 moveGhost(NewMap,N,X,MY,X,GY,['r'| Rest]):-false, itemNext(新地图、CN、Z), 项目(Z), moveGhost(NewMap,N,X,MY,X,Y,Rest), GY是Y-1, 我的天啊, CN是((X*N)+Y)。 itemNext([Cell |],0,Cell):- 项目(单元格)。 itemNext([第一个|剩余],CN,单元格):- 任何单元格(第一个), itemNext(剩余、N、单元格), CN是N+1。
如果GX是一个自由变量,您会收到“false. item('f') :- false. item('p') :- false. item('m'). item('u') :- false. item('6') :- false. item('r') :- false. item('g'). anyCell(Cell) :- false, 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), false. /*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) :- false, print('Found Ghost. '). findGhostSpot(['6'|_], 0) :- false, 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) :- false, findPacmanSpot(Tail, S1), S is S1+1 . /* Base Case, Ghost is on the Pacman*/ moveGhost(_, _, X, Y, X, Y, []) :- false. /*IF PACMAN AND THE GHOST ARE IN THE SAME COLUMN*/ 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 is X + 1, MX < GX, CN is ((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 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), false, GY is Y + 1, MY < GY, CN is ((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 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.