Я решаю 8-головоломку, используя BFS, но я новичок в Прологе, и мне трудно получить рекурсию на работу.Мы должны настроить его так, как показано:
breadthFirstSearch(Initial, Solution) :- retractall(closed(_)), breadthFirstSearch_aux(Initial, Solution).
breadthFirstSearch_aux(Initial, [Initial]) :- goal8(Initial), !.
breadthFirstSearch_aux(Initial, Solution) :- (not(closed(Initial)) -> succ8(Initial, Neighbours), extractSuccessors(Neighbours, L),
assert(closed(Initial)), append([Initial], Solution2, Solution), nth0(0, L, Queuehead), breadthFirstSearch_aux(Queuehead, Solution2);
append([Initial], Solution2, Solution), nth0(0, L, Queuehead), breadthFirstSearch_aux(Queuehead, Solution2)).
extractSuccessors(X, Y) :- X = [].
extractSuccessors([(_,First)|Rest], X) :- append([X], [First], NewQ), extractSuccessors(Rest, NewQ).
Первая проблема, с которой я столкнулся, связана с моей функцией extractSuccessors, я хочу, чтобы она возвращала список состояний, но она просто возвращает true.Например:
?- extractSuccessors( [(1, [1, 2, 3, 4, 5, 6, 7|...]), (1, [1, 2, 3, 0, 5,
6|...])], Y).
true.
[trace] ?- extractSuccessors( [(1, [1, 2, 3, 4, 5, 6, 7|...]), (1, [1, 2,
3, 0, 5, 6|...])], Y).
Call: (8) extractSuccessors([(1, [1, 2, 3, 4, 5, 6|...]), (1, [1, 2, 3,
0, 5|...])], _3088) ? creep
Call: (9) lists:append([_3088], [[1, 2, 3, 4, 5, 6|...]], _3440) ? creep
Exit: (9) lists:append([_3088], [[1, 2, 3, 4, 5, 6|...]], [_3088, [1, 2,
3, 4, 5|...]]) ? creep
Call: (9) extractSuccessors([(1, [1, 2, 3, 0, 5, 6|...])], [_3088, [1, 2,
3, 4, 5, 6|...]]) ? creep
Call: (10) lists:append([[_3088, [1, 2, 3, 4|...]]], [[1, 2, 3, 0, 5,
6|...]], _3458) ? creep
Exit: (10) lists:append([[_3088, [1, 2, 3, 4|...]]], [[1, 2, 3, 0, 5,
6|...]], [[_3088, [1, 2, 3, 4|...]], [1, 2, 3, 0, 5|...]]) ? creep
Call: (10) extractSuccessors([], [[_3088, [1, 2, 3, 4, 5|...]], [1, 2, 3,
0, 5, 6|...]]) ? creep
Exit: (10) extractSuccessors([], [[_3088, [1, 2, 3, 4, 5|...]], [1, 2, 3,
0, 5, 6|...]]) ? creep
Exit: (9) extractSuccessors([(1, [1, 2, 3, 0, 5, 6|...])], [_3088, [1, 2,
3, 4, 5, 6|...]]) ? creep
Exit: (8) extractSuccessors([(1, [1, 2, 3, 4, 5, 6|...]), (1, [1, 2, 3,
0, 5|...])], _3088) ? creep
true.
Почему он не вернет список Y?Я понимаю, что реализация остальной части еще не полностью настроена.