Search 序言错误:超出本地堆栈
我目前正试图完成这项任务,但我不明白为什么我的终止协议没有结束。我已经为一个迷宫做了(或接近)广度优先搜索算法,跟踪发生的移动Search 序言错误:超出本地堆栈,search,prolog,Search,Prolog,我目前正试图完成这项任务,但我不明白为什么我的终止协议没有结束。我已经为一个迷宫做了(或接近)广度优先搜索算法,跟踪发生的移动 fewestRotationsSingle(Maze, Moves):- search([Maze], [[]], Moves). search([], [], []). search(Mazes, [PH|PT], R):- length(PH, M), (M > 5 -> search([], [], R) ;
fewestRotationsSingle(Maze, Moves):-
search([Maze], [[]], Moves).
search([], [], []).
search(Mazes, [PH|PT], R):-
length(PH, M),
(M > 5 ->
search([], [], R) ;
append([PH], PT, Paths),
(possible(Mazes, Paths, Mazes1, Paths1),
checkIfDone(Mazes1, Paths1, Solutions),
length(Solutions, N),
(N > 0 ->
member(R, Solutions);
search(Mazes1, Paths1, R)
)
)
).
possible([], [], [], []).
possible([MH|MT], [PH|PT], Ms, Ps):-
helpers:oneMove(MH, 180, M1),
helpers:oneMove(MH, c, M2),
helpers:oneMove(MH, cc, M3),
possible(MT, PT, MS, PS),
append([M1, M2, M3], MS, Ms),
append(PH, [180], P1),
append(PH, [c], P2),
append(PH, [cc], P3),
append([P1, P2, P3], PS, Ps).
checkIfDone([], [], []).
checkIfDone([M|Ms], [P|Ps], R):-
helpers:checkIfGoal(M, G),
(G = 1 ->
checkIfDone(Ms, Ps, R) ;
(checkIfDone(Ms, Ps, S),
append([P], S, R))
).
当我测试时,我使用:
Y = [[x,x,x,x],[x,-,g,x],[x,1,-,x],[x,x,x,x]],
fewestRotationsSingle(Y, Moves).
这给了我:
Moves = [180, cc] ;
Moves = [c, c];
ERROR: Out of local stack
我哪里做错了
use_module(library(clpfd), []).
trans([], []).
trans([H|T], R):-
nodebug,
length(H, N),
emptyLists(N, E),
append([H], T, M),
transRec(M, E, R).
emptyLists(0, []).
emptyLists(N, R):-
L is N - 1,
emptyLists(L, S),
append(S, [[]], R).
transRec([], A, A).
transRec([Row|Rows], Cols, Result):-
transposeRow(Row, Cols, S),
transRec(Rows, S, Result).
transposeRow([], [], []).
transposeRow([RH|RT], [CH|CT], Result):-
transposeRow(RT, CT, S),
append(CH, [RH], R),
append([R], S, Result).
oneMove(M, 180, R):-
move180(M, M1),
dropPlayers(M1, R).
oneMove(M, c, R):-
movec(M, M1),
dropPlayers(M1, R).
oneMove(M, cc, R):-
movecc(M, M1),
dropPlayers(M1, R).
movec(Maze, R):-
trans(Maze, S),
maplist(reverse, S, R).
movecc(Maze, R):-
trans(Maze, S),
reverse(S, R).
move180(Maze, R):-
reverse(Maze, S),
maplist(reverse, S, R).
dropPlayers(M, R):-
trans(M, S1),
dropRows(S1, S2),
trans(S2, R).
dropRows([], []).
dropRows([H|T], R):-
dropRow(H, Q),
dropRows(T, S),
append([Q], S, R).
dropRow([], []).
dropRow([H|T], R):-
numlist(1,4,NL),
(member(H, NL) ->
(append([H], T, S), dropPlayer(S, R));
(dropRow(T, S),
append([H], S, R))
).
dropPlayer([], []).
dropPlayer([H1|[H2|T]], R):-
(H2 = - ->
(append([H1], T, S1),
dropPlayer(S1, S2),
append([H2], S2, R)) ;
(H2 = x ->
(dropRow(T, S1),
append([[H1],[H2],S1], R)) ;
(H2 = g ->
(dropRow(T, S1),
append([[-],[H1],S1], R)) ;
(append([H2], T, S1),
dropPlayer(S1, S2),
append([H1], S2, S3),
dropPlayer2(S3, R))
)
)
).
dropPlayer2([H1|[H2|T]], R):-
(H2 = - ->
(append([H1], T, S1),
dropPlayer2(S1, S2),
append([H2], S2, R)) ;
(dropRow(T, S1),
append([[H1], [H2], S1], R))
).
checkIfGoal([], 0).
checkIfGoal([H|T], R):-
findall(X, (member(X, H), X = g), L),
length(L,N),
checkIfGoal(T, S),
R is N + S.
你能给我们介绍一下你的代码吗?我知道这需要做很多工作,但至少告诉我们您打算实现什么程序。此外,您还可以从
助手调用一些谓词:
我们没有访问(afaik)的权限。当然,这应该可以。给我一分钟。这应该是一个广度优先的搜索算法。首先,fewestRotationsSingle是直接进入搜索的入口点。搜索的任务是找到给定路径长度的所有解(如果有的话)。如果有解决方案,则返回它们;如果没有,则使用可能谓词搜索下一个状态空间,以查找下一个可能的状态。checkIfDone是一个谓词,它在获得所有可能的结果后检查列表,并返回所有已解决的迷宫。helpers基本上是边缘点,返回新的迷宫状态。因此helpers:oneMove谓词接受移入,然后根据给定的移动输出三个不同迷宫中的一个。迷宫本质上是一个矩形框,其中x代表墙,而-,代表空间。迷宫中还有1到4名玩家,他们在旋转(180度、顺时针或逆时针)后根据重力下落。最后,还有一个代表目标的g点。