Лекция: Showpos( P).
% Показать позицию на доске
showpos( [S0,S1,S2,S3,S4,S5,S6,S7,S8] ) :-
member( Y, [3,2,1] ), % Последовательность координат Y
nl, member( X, [1,2,3] ), % Последовательность координат х
member( Tile-X/Y, % Фишка в клетке X/Y
[' '-S0,1-S1,2-S2,3-S3,4-S4,5-S5, 6-S6,7-S7, 8-S8 ] ),
Write( Tile),
fail; % Выполнить перебор с возвратом к следующей клетке
true. % Обработка всех клеток закончена
% Начальные позиции для некоторых задач
start1([2/2,1/3,3/2,2/3,3/3,3/1,2/1,1/1,1/2] ). % Требует 4 хода
start2( [2/1,1/2,1/3,3/3,3/2,3/1,2/2,1/1,2/3] ). % Требует 5 ходов
start3( [2/2,2/3,1/3,3/1,1/2,2/1,3/3,1/1,3/2] ). % Требует 19 ходов
% Пример запроса: ?- start1( Pos), bestfirst(Pos, Sol), showsol(Sol).
%-----Поиск по заданному критерию
evrpoisk(Start,Solve):-
max_f(Fmax), % Fmax > любой f-оценки
propag([],l(Start,0/0),Fmax,_,yes,Solve).
propag(P,l(B,_),_,_,yes,[B|P]):-
goal(B). % рассматриваемый лист – цель поиска.
propag(P,l(B,F/G),Extr,Tree1,Is_solv,Solve):-
F=<Extr, % получение дерева из приемников листа
bagof(B1/C,(s(B,B1,C),not(member(B1,P))),Successers),
!,suc_list(G,Successers,TT), %after -s
Opt_f(TT,F1),
propag(P,tr(B,F1/G,TT),Extr,Tree1,Is_solv,Solve).
propag(P,l(B,F/G),Extr,Tree1,never,Solve):-
F=<Extr. % Нет приемников – тупик
propag(P,tr(B,F/G,[T|TT]),Extr,Tree1,Is_solv,Solve):-
F=<Extr, % Продолжить дерево
Opt_f(TT,OF),
Min(Extr,OF,Extr1),
propag([B|P],T,Extr1,T1,Is_solv1,Solve),
continue(P,tr(B,F/G,[T1,TT]),Extr,Tree1,Is_solv1,Is_solv,Solve).
propag(_,tr(_,_,[]),_,_,never,_):-!.. % Тупиковое дерево — нет решений
propag(_,Tree,Extr,Tree,no,_):-
f(Tree,F),F>Extr. % Рост остановлен
Continue(_,_,_,_,yes,yes,Solve).
continue(P,tr(B,F/G,[T1,TT]),Extr,Tree1,no,Is_solv,Solve):-