67
solve (sit, sit, sits, sits)
% определяет путь для решения задачи
member (list, sit)
% первый предикат ищет список в списке списков
member1(sit, sits)
% второй предикат ищет список списков в списке списков списков
writesp(sits)
% распечатывает путь
clauses
member(X, [X|_]):-!.
member(X,[_|T]):-member(X,T).
member1(X, [X|_]):-!.
member1(X,[_|T]):-member1(X,T).
after([St11,St12,St13],S):-St13=[H3|T3],S=[St11,[H3|St12],T3].
after([St11,St12,St13],S):-St13=[H3|T3],S=[[H3|St11],St12,T3].
after([St11,St12,St13],S):-St12=[H2|T2],S=[[H2|St11],T2,St13].
after([St11,St12,St13],S):-St12=[H2|T2],S=[St11,T2,[H2|St13]].
after([St11,St12,St13],S):-St11=[H1|T1],S=[T1,[H1|St12],St13].
after([St11,St12,St13],S):-St11=[H1|T1],S=[T1,St12,[H1|St13]].
solve(S,S1,Sp,[S1|Sp]):-after(S,S1), member([a,b,c],S1).
solve(S,S2,Sp,Sp2):-after(S,S1), not(member([a,b,c],S1)),
not(member1(S1,Sp)),solve(S1,S2,[S1|Sp],Sp2).
writesp([]).
writesp([H|T]):-writesp(T),write(H),nl.
goal
solve([[c,a,b],[],[]],S,[[c,a,b],[],[]],Sp),writesp(Sp).
В данном примере реализован усовершенствованный алгоритм поиска
в глубину, в котором добавлен алгоритм обнаружения циклов. Предикат
solve включает очередную вершину в решающий путь только в том случае,
если она еще не встречалась раньше.
3.2.2 Поиск в ширину
В противоположность поиску в глубину стратегия поиска в ширину
предусматривает переход в первую очередь к вершинам, ближайшим к
начальной вершине. На следующем рисунке показан пример, который
иллюстрирует работу алгоритма поиска
в ширину.