Пролог 8-пазл - BFS - PullRequest
       5

Пролог 8-пазл - BFS

0 голосов
/ 23 сентября 2018

Я решаю 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?Я понимаю, что реализация остальной части еще не полностью настроена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...