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点。