Задача о кубиках. Имеются три места и три кубика, расставленных по местам или друг на друга. Необходимо найти план переупорядочивания кубиков: перемещение верхнего в столбике кубика на свободное место или на другой кубик со свободной верхней гранью.
domains
s=symbol
list=s*
l2=list*
l3=l2*
predicates
tgoal(l2)
delete(list,l2,l2)
member(l2,l3)
after(l2,l2)
solve(l2,l3)
in_depth(l3,l2,l3)
write_list(l3)
clauses
tgoal([[a,b,c],[],[]]). /* целевые ситуации */
tgoal([[],[a,b,c],[]]). tgoal([[],[],[a,b,c]]).
after(Stolbs,[Stolb1,[Up1|Stolb2]|Rest]):-
delete([Up1|Stolb1],Stolbs,Stolbs1), delete(Stolb2,Stolbs1,Rest).
delete(X,[X|L],L).
delete(X,[Y|L],[Y|L1]) :- delete(X,L,L1).
member(X,[X|_]).
member(X,[_|Tail]):- member(X,Tail).
solve(Node,Solution) :- in_depth([],Node,Solution).
in_depth(Path,Node,[Node|Path]) :- tgoal(Node).
in_depth(Path,Node,Solution) :-
after(Node,Node1), not(member(Node1,Path)),
in_depth([Node|Path],Node1,Solution).
write_list([X|Rest]):- /* вывод решения на терминал */
write("\n",X),readchar(_), write_list(Rest).
write_list([]).
goal
solve([[c,a,b],[],[]],Solution), write_list(Solution).
|