szklanka(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]).