door_between(bed_room, hidden_chamber).
door_between(hidden_chamber, basement).
rev(L,R) :- my_reverse(L,[],R).
my_reverse([H|T],A,R) :- my_reverse(T,[H|A],R).
my_reverse([],A,A).
path_from(Src,Dest,Path) :-
path_from(Src,Dest,[],Path),
rev(Path,Z),
append(Src,Z,Z).
path_from(S,S,P,P).
path_from(S,D,P,NV) :-
(door_between(S,A) ; door_between(A,S)),
\+ member(A,P),
path_from(A, D, [A|P], NV).
Это мой код для поиска пути в неориентированном графе комнат.Кажется, чтобы получить правильный результат во время рекурсии, но вызывает * Повторить в точке, и я не понимаю, почему, вот трассировка.
path_from(bed_room,basement,X).
* Call: (8) path_from(bed_room, basement, _12282) ? creep
* Call: (9) path_from(bed_room, basement, [], _12282) ? creep
Call: (10) door_between(bed_room, _12624) ? creep
Exit: (10) door_between(bed_room, hidden_chamber) ? creep
Call: (10) lists:member(hidden_chamber, []) ? creep
Fail: (10) lists:member(hidden_chamber, []) ? creep
* Redo: (9) path_from(bed_room, basement, [], _12282) ? creep
* Call: (10) path_from(hidden_chamber, basement, [hidden_chamber], _12282) ? creep
Call: (11) door_between(hidden_chamber, _12630) ? creep
Exit: (11) door_between(hidden_chamber, basement) ? creep
Call: (11) lists:member(basement, [hidden_chamber]) ? creep
Fail: (11) lists:member(basement, [hidden_chamber]) ? creep
* Redo: (10) path_from(hidden_chamber, basement, [hidden_chamber], _12282) ? creep
* Call: (11) path_from(basement, basement, [basement, hidden_chamber], _12282) ? creep
* Exit: (11) path_from(basement, basement, [basement, hidden_chamber], [basement, hidden_chamber]) ? creep
* Exit: (10) path_from(hidden_chamber, basement, [hidden_chamber], [basement, hidden_chamber]) ? creep
* Exit: (9) path_from(bed_room, basement, [], [basement, hidden_chamber]) ? creep
Call: (9) rev([basement, hidden_chamber], _12636) ? creep
Call: (10) my_reverse([basement, hidden_chamber], [], _12638) ? creep
Call: (11) my_reverse([hidden_chamber], [basement], _12644) ? creep
Call: (12) my_reverse([], [hidden_chamber, basement], _12650) ? creep
Exit: (12) my_reverse([], [hidden_chamber, basement], [hidden_chamber, basement]) ? creep
Exit: (11) my_reverse([hidden_chamber], [basement], [hidden_chamber, basement]) ? creep
Exit: (10) my_reverse([basement, hidden_chamber], [], [hidden_chamber, basement]) ? creep
Exit: (9) rev([basement, hidden_chamber], [hidden_chamber, basement]) ? creep
Вызов: (9) списки: append (спальня, [скрытая камера, подвал], [скрытая камера, подвал])?creep
* Redo: (11) path_from(basement, basement, [basement, hidden_chamber], _12282) ? creep
Call: (12) door_between(basement, _12636) ?
(выделенная жирным шрифтом строка, которая разбивает кодовый блок, является строкой, о которой я беспокоюсь, и она вызывается добавлением (Src, Z, Z) в path_from / 3.) В Вызов: (9) для добавления, этот результирующий список - это ответ, который я хочу получить для этого конкретного тестового случая. Я предполагаю, что append вернет [bed_room, hidden_chamber, basement], но следующая вещьa * Повторите, и я действительно запутался, почему, я просто запутался в концепции рекурсии?Я думаю, что мне просто нужно немного подтолкнуть, и я могу обернуть голову вокруг него.