Я пытаюсь найти лабиринт в Прологе с помощью возврата.
Моя проблема в том, что когда я запускаю программу, она запускается правильно в первый раз, но после этого она принимает конечную позицию в качестве начальной позиции и продолжает находить пути оттуда, следовательно, идет в бесконечный цикл. Это работает правильно, когда путь не существует между двумя позициями. Я перепробовал много вещей, но, похоже, ничего не работает. Вот мой код:
path(Dest, Dest, _, [], _) :- !.
path([Row0,Col0],[Row1,Col1],M,Path,1) :-
next_move([Row0,Col0],[Rnew,Cnew]),
is_available(Rnew, Cnew,Ret),
write(Rnew),
write(Cnew),
not(member([Rnew, Cnew], M)),
path([Rnew, Cnew], [Row1, Col1], [[Rnew,Cnew]|M], Path, Ret).
path([X0,Y0], [X1,Y1], [[X0,Y0]|M], [[X,Y]|Path], 0) :-
path([X,Y],[X1,Y1],M,Path,1).
Пример вывода:
?- solves([1,1],[1,7],P).
P = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7]] ;
P = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 6], [2, 7], [2|...],
[...|...]|...] ;
P = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 6], [2, 7], [2|...],
[...|...]|...] ;
P = [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 6], [2, 7], [2|...],
[...|...]|...] .
При выполнении программы она должна отображать все пути, если путь существует между двумя позициями. В противном случае он должен вернуть false. Как вы можете видеть выше, мой код идет в бесконечный цикл и продолжает генерировать пути.
Пожалуйста, помогите, поскольку я не очень опытен в Прологе.
Спасибо.