rendered paste bodyszklanka(0). % pozycja: na dol
szklanka(1). % pozycja: w gore
szklanki([A,B,C,D]) :- % +-+-+
szklanka(A), % |A|B|
szklanka(B), % +-+-+
szklanka(C), % |C|D|
szklanka(D). % +-+-+
obrocone([A,B,C,D], [C,A,D,B]).
kolejka1([_,B,C,_], [1,B,C,1]).
kolejka2([1,0,C,D], [1,1,C,D]).
kolejka2([0,1,C,D], [1,1,C,D]).
kolejka2([1,1,C,D], [1,1,C,D]).
kolejka3([0,B,C,1], [1,B,C,1]).
kolejka3([1,B,C,0], [1,B,C,1]).
kolejka3([1,B,C,1], [0,B,C,1]).
kolejka4([0,0,C,D], [1,1,C,D]).
kolejka4([0,1,C,D], [1,0,C,D]).
kolejka4([1,0,C,D], [0,1,C,D]).
kolejka4([1,1,C,D], [0,0,C,D]).
kolejka5([0,B,C,0], [1,B,C,1]).
kolejka5([0,B,C,1], [1,B,C,0]).
kolejka5([1,B,C,0], [0,B,C,1]).
kolejka5([1,B,C,1], [0,B,C,0]).
algorytm(Algorytm) :-
forall(szklanki(Szklanki), % dla wszystkich konfiguracyj szklanek...
zastosuj(Algorytm, 0, Szklanki)). % sprawdzamy czy algorytm sie zakonczy
zastosuj(_, _, [0,0,0,0]) :- !.
zastosuj(_, _, [1,1,1,1]) :- !.
zastosuj([Kolejka|Kolejki], N, Szklanki0) :-
naglowek(Kolejka,N),
formatuj(Szklanki0),
call(Kolejka, Szklanki0, Szklanki1),
formatuj(Szklanki1), nl,
M is N+1,
obrocone(Szklanki1, Szklanki2),
obrocone(Szklanki2, Szklanki3),
obrocone(Szklanki3, Szklanki4),
zastosuj(Kolejki,M, Szklanki1),
zastosuj(Kolejki,M, Szklanki2),
zastosuj(Kolejki,M, Szklanki3),
zastosuj(Kolejki,M, Szklanki4).
naglowek(Algorytm0, Poziom) :-
writef('%t', [Algorytm0]),
writef(' ', []),
writef('%r', [' ', Poziom]).
formatuj(Szklanki) :-
writef('[%t%t/%t%t] ', Szklanki).
testwiki :- algorytm([kolejka1, kolejka2, kolejka3, kolejka4, kolejka5]).