Działa?

Działa?

start(Listawej,[Ruch1]):-
	H is 3,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 2,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 1,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 0,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.

begin(Listawej, Listawyj1, Listawyj):-
	move([0|Listawej],Listawyj1),
	allDogs(Listawyj1,Listawyj2),
	move(Listawyj2,Listawyj3),
	allDogs(Listawyj3,Listawyj4),
	move(Listawyj4,Listawyj).

move( [H|Listawej], Listawyj ) :-
	findIdJaguar(Listawej, IdJaguar ),
	canTokenMove([H|Listawej], IdJaguar, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	IdJaguar3 is IdJaguar - 12,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	tokenMove(IdJaguar2,1,A1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	IdJaguar3 is IdJaguar - 10,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	IdJaguar3 is IdJaguar - 8,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	IdJaguar3 is IdJaguar - 2,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	IdJaguar3 is IdJaguar + 2,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	IdJaguar3 is IdJaguar + 8,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	IdJaguar3 is IdJaguar + 10,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	IdJaguar3 is IdJaguar + 12,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,G1,1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 30, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 34,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 34, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 34, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 30,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 34,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 30, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], 34, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 30,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 34, IdJaguar2, IdJaguar3, Listawyj).

tokenMove(0,0,0,0,0,1,0,1,1).
tokenMove(1,0,0,0,1,1,0,1,0).
tokenMove(2,0,0,0,1,1,1,1,1).
tokenMove(3,0,0,0,1,1,0,1,0).
tokenMove(4,0,0,0,1,0,1,1,0).

tokenMove(5,0,1,0,0,1,0,1,0).
tokenMove(6,1,1,1,1,1,1,1,1).
tokenMove(7,0,1,0,1,1,0,1,0).
tokenMove(8,1,1,1,1,1,1,1,1).
tokenMove(9,0,1,0,1,0,0,1,0).

tokenMove(10,0,1,1,0,1,0,1,1).
tokenMove(11,0,1,0,1,1,0,1,0).
tokenMove(12,1,1,1,1,1,1,1,1).
tokenMove(13,0,1,0,1,1,0,1,0).
tokenMove(14,1,1,0,1,0,1,1,0).

tokenMove(15,0,1,0,0,1,0,1,0).
tokenMove(16,1,1,1,1,1,1,1,1).
tokenMove(17,0,1,0,1,1,0,1,0).
tokenMove(18,1,1,1,1,1,1,1,1).
tokenMove(19,0,1,0,1,0,0,1,0).

tokenMove(20,0,1,1,0,1,0,0,0).
tokenMove(21,0,1,0,1,1,0,0,0).
tokenMove(22,1,1,1,1,1,1,1,1).
tokenMove(23,0,1,0,1,1,0,0,0).
tokenMove(24,1,1,0,1,0,0,0,0).

tokenMove(25,0,0,0,0,0,0,0,0).
tokenMove(26,0,0,1,0,1,1,0,1).
tokenMove(27,0,1,0,1,1,0,1,0).
tokenMove(28,1,0,0,1,0,1,0,1).
tokenMove(29,0,0,0,0,0,0,0,0).

tokenMove(30,0,0,1,0,0,0,0,0).
tokenMove(31,0,0,0,0,0,0,0,0).
tokenMove(32,0,1,0,0,0,0,0,0).
tokenMove(33,0,0,0,0,0,0,0,0).
tokenMove(34,1,0,0,0,0,0,0,0).

nth0(Id, Lista, Value):-
nth01(0,Lista,Value, Id).

nth01(Iter, [H|T], H, Iter).

nth01(Iter, [H|T], Value, Id):-
Iter1 is Iter +1,
nth01(Iter1, T, Value, Id).

isEmpty( Id, Lista):-
	nth0(Id, Lista,0).
findIdJaguar( Lista, Id ):-
	nth0(Id, Lista, 2),
	!.
addTail([],X,[X]).
addTail([H|T],X,[H|L]):-
	addTail(T,X,L).

replace(List, Id1, Id2, Id3, Exit):-
	replace(List, Id1, Id2, Id3, 0, [], Exit).

replace([], A, B, C, D, Exit, Exit):-
	!.
replace([H|T], Pos, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Pos, Id2, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Pos, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Pos, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 2, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Pos, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Id3, Pos1, Listawyj1,V),!.

allDogs([H|Listawej],[H|Listawyj]):-
	dogMove(Listawej,Listawyj).

dogMove(Listawej,Listawyj):-
	singleDog(Listawej,0,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,1,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,2,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,3,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,4,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,5,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,6,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,7,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,8,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,9,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,10,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,11,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,12,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,13,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,14,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,15,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,16,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,17,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,18,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,19,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,20,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,21,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,22,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,23,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,24,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,25,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,26,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,27,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,28,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,29,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,30,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,32,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,34,Listawyj).

singleDog(Listawej,Iter,Listawyj):-
	nth0(Iter, Listawej, 1),
	moveDog(Listawej,Iter,Listawyj).

moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 6,
	tokenMove(IdPies,1,A,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 5,
	tokenMove(IdPies,A,1,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 4,
	tokenMove(IdPies,A,B,1,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 1,
	tokenMove(IdPies,A,B,C,1,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 1,
	tokenMove(IdPies,A,B,C,D,1,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 4,
	tokenMove(IdPies,A,B,C,D,E,1,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 5,
	tokenMove(IdPies,A,B,C,D,E,F,1,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 6,
	tokenMove(IdPies,A,B,C,D,E,F,G,1),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).

moveDog(Listawej, 30, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 30, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 34,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).
moveDog(Listawej, 34, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 34, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 30,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).

replacePies(List, Id1, Id2, Exit):-
	replacePies(List, Id1, Id2, 0, [], Exit).

replacePies([], A, B, C, Exit, Exit):-
	!.
replacePies([H|T], Pos, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Pos, Id2, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 1, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Pos, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Id2, Pos1, Listawyj1,V),!.

start(Listawej,[Ruch1]):-
	begin(Listawej,[H1|Ruch1],[H|Fin]),
	not(wiecejZbitych(Listawej,Listawyj,H)),!.

wiecejZbitych(Listawej,Listawyj,H):-
	begin(Listawej,[H2|Ruch2],[Hb|Finb]),
	Hb > H.

begin(Listawej, Listawyj1, Listawyj):-
	move([0|Listawej],Listawyj1),
	allDogs(Listawyj1,Listawyj2),
	move(Listawyj2,Listawyj3),
	allDogs(Listawyj3,Listawyj4),
	move(Listawyj4,Listawyj).

move( [H|Listawej], Listawyj ) :-
	findIdJaguar(Listawej, IdJaguar ),
	canTokenMove([H|Listawej], IdJaguar, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	IdJaguar3 is IdJaguar - 12,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	tokenMove(IdJaguar2,1,A1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	IdJaguar3 is IdJaguar - 10,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	IdJaguar3 is IdJaguar - 8,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	IdJaguar3 is IdJaguar - 2,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	IdJaguar3 is IdJaguar + 2,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	IdJaguar3 is IdJaguar + 8,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	IdJaguar3 is IdJaguar + 10,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	IdJaguar3 is IdJaguar + 12,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,G1,1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 30, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 34,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 34, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 34, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 30,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 34,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 30, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], 34, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 30,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 34, IdJaguar2, IdJaguar3, Listawyj).

tokenMove(0,0,0,0,0,1,0,1,1).
tokenMove(1,0,0,0,1,1,0,1,0).
tokenMove(2,0,0,0,1,1,1,1,1).
tokenMove(3,0,0,0,1,1,0,1,0).
tokenMove(4,0,0,0,1,0,1,1,0).

tokenMove(5,0,1,0,0,1,0,1,0).
tokenMove(6,1,1,1,1,1,1,1,1).
tokenMove(7,0,1,0,1,1,0,1,0).
tokenMove(8,1,1,1,1,1,1,1,1).
tokenMove(9,0,1,0,1,0,0,1,0).

tokenMove(10,0,1,1,0,1,0,1,1).
tokenMove(11,0,1,0,1,1,0,1,0).
tokenMove(12,1,1,1,1,1,1,1,1).
tokenMove(13,0,1,0,1,1,0,1,0).
tokenMove(14,1,1,0,1,0,1,1,0).

tokenMove(15,0,1,0,0,1,0,1,0).
tokenMove(16,1,1,1,1,1,1,1,1).
tokenMove(17,0,1,0,1,1,0,1,0).
tokenMove(18,1,1,1,1,1,1,1,1).
tokenMove(19,0,1,0,1,0,0,1,0).

tokenMove(20,0,1,1,0,1,0,0,0).
tokenMove(21,0,1,0,1,1,0,0,0).
tokenMove(22,1,1,1,1,1,1,1,1).
tokenMove(23,0,1,0,1,1,0,0,0).
tokenMove(24,1,1,0,1,0,0,0,0).

tokenMove(25,0,0,0,0,0,0,0,0).
tokenMove(26,0,0,1,0,1,1,0,1).
tokenMove(27,0,1,0,1,1,0,1,0).
tokenMove(28,1,0,0,1,0,1,0,1).
tokenMove(29,0,0,0,0,0,0,0,0).

tokenMove(30,0,0,1,0,0,0,0,0).
tokenMove(31,0,0,0,0,0,0,0,0).
tokenMove(32,0,1,0,0,0,0,0,0).
tokenMove(33,0,0,0,0,0,0,0,0).
tokenMove(34,1,0,0,0,0,0,0,0).

nth0(Id, Lista, Value):-
nth01(0,Lista,Value, Id).

nth01(Iter, [H|T], H, Iter).

nth01(Iter, [H|T], Value, Id):-
Iter1 is Iter +1,
nth01(Iter1, T, Value, Id).

isEmpty( Id, Lista):-
	nth0(Id, Lista,0).
findIdJaguar( Lista, Id ):-
	nth0(Id, Lista, 2),
	!.
addTail([],X,[X]).
addTail([H|T],X,[H|L]):-
	addTail(T,X,L).

replace(List, Id1, Id2, Id3, Exit):-
	replace(List, Id1, Id2, Id3, 0, [], Exit).

replace([], A, B, C, D, Exit, Exit):-
	!.
replace([H|T], Pos, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Pos, Id2, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Pos, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Pos, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 2, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Pos, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Id3, Pos1, Listawyj1,V),!.

allDogs([H|Listawej],[H|Listawyj]):-
	dogMove(Listawej,Listawyj).

dogMove(Listawej,Listawyj):-
	singleDog(Listawej,0,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,1,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,2,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,3,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,4,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,5,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,6,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,7,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,8,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,9,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,10,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,11,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,12,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,13,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,14,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,15,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,16,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,17,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,18,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,19,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,20,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,21,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,22,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,23,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,24,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,25,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,26,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,27,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,28,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,29,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,30,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,32,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,34,Listawyj).

singleDog(Listawej,Iter,Listawyj):-
	nth0(Iter, Listawej, 1),
	moveDog(Listawej,Iter,Listawyj).

moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 6,
	tokenMove(IdPies,1,A,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 5,
	tokenMove(IdPies,A,1,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 4,
	tokenMove(IdPies,A,B,1,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 1,
	tokenMove(IdPies,A,B,C,1,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 1,
	tokenMove(IdPies,A,B,C,D,1,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 4,
	tokenMove(IdPies,A,B,C,D,E,1,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 5,
	tokenMove(IdPies,A,B,C,D,E,F,1,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 6,
	tokenMove(IdPies,A,B,C,D,E,F,G,1),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).

moveDog(Listawej, 30, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 30, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 34,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).
moveDog(Listawej, 34, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 34, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 30,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).

replacePies(List, Id1, Id2, Exit):-
	replacePies(List, Id1, Id2, 0, [], Exit).

replacePies([], A, B, C, Exit, Exit):-
	!.
replacePies([H|T], Pos, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Pos, Id2, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 1, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Pos, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Id2, Pos1, Listawyj1,V),!.


MONDRY JAGUAR

MONDRY JAGUAR

start(Listawej,[Ruch1]):-
	H is 3,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 2,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 1,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 0,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.

begin(Listawej, Listawyj1, Listawyj):-
	move([0|Listawej],Listawyj1),
	allDogs(Listawyj1,Listawyj2),
	move(Listawyj2,Listawyj3),
	allDogs(Listawyj3,Listawyj4),
	move(Listawyj4,Listawyj).

move( [H|Listawej], Listawyj ) :-
	findIdJaguar(Listawej, IdJaguar ),
	canTokenMove([H|Listawej], IdJaguar, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	IdJaguar3 is IdJaguar - 12,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	tokenMove(IdJaguar2,1,A1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	IdJaguar3 is IdJaguar - 10,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	IdJaguar3 is IdJaguar - 8,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	IdJaguar3 is IdJaguar - 2,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	IdJaguar3 is IdJaguar + 2,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	IdJaguar3 is IdJaguar + 8,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	IdJaguar3 is IdJaguar + 10,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	IdJaguar3 is IdJaguar + 12,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,G1,1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], 30, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 30, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 34,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 34, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 34, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 30,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 34,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 30, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], 34, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 30,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 34, IdJaguar2, IdJaguar3, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

tokenMove(0,0,0,0,0,1,0,1,1).
tokenMove(1,0,0,0,1,1,0,1,0).
tokenMove(2,0,0,0,1,1,1,1,1).
tokenMove(3,0,0,0,1,1,0,1,0).
tokenMove(4,0,0,0,1,0,1,1,0).

tokenMove(5,0,1,0,0,1,0,1,0).
tokenMove(6,1,1,1,1,1,1,1,1).
tokenMove(7,0,1,0,1,1,0,1,0).
tokenMove(8,1,1,1,1,1,1,1,1).
tokenMove(9,0,1,0,1,0,0,1,0).

tokenMove(10,0,1,1,0,1,0,1,1).
tokenMove(11,0,1,0,1,1,0,1,0).
tokenMove(12,1,1,1,1,1,1,1,1).
tokenMove(13,0,1,0,1,1,0,1,0).
tokenMove(14,1,1,0,1,0,1,1,0).

tokenMove(15,0,1,0,0,1,0,1,0).
tokenMove(16,1,1,1,1,1,1,1,1).
tokenMove(17,0,1,0,1,1,0,1,0).
tokenMove(18,1,1,1,1,1,1,1,1).
tokenMove(19,0,1,0,1,0,0,1,0).

tokenMove(20,0,1,1,0,1,0,0,0).
tokenMove(21,0,1,0,1,1,0,0,0).
tokenMove(22,1,1,1,1,1,1,1,1).
tokenMove(23,0,1,0,1,1,0,0,0).
tokenMove(24,1,1,0,1,0,0,0,0).

tokenMove(25,0,0,0,0,0,0,0,0).
tokenMove(26,0,0,1,0,1,1,0,1).
tokenMove(27,0,1,0,1,1,0,1,0).
tokenMove(28,1,0,0,1,0,1,0,1).
tokenMove(29,0,0,0,0,0,0,0,0).

tokenMove(30,0,0,1,0,0,0,0,0).
tokenMove(31,0,0,0,0,0,0,0,0).
tokenMove(32,0,1,0,0,0,0,0,0).
tokenMove(33,0,0,0,0,0,0,0,0).
tokenMove(34,1,0,0,0,0,0,0,0).

nth0(Id, Lista, Value):-
nth01(0,Lista,Value, Id).

nth01(Iter, [H|T], H, Iter).

nth01(Iter, [H|T], Value, Id):-
Iter1 is Iter +1,
nth01(Iter1, T, Value, Id).

isEmpty( Id, Lista):-
	nth0(Id, Lista,0).
findIdJaguar( Lista, Id ):-
	nth0(Id, Lista, 2),
	!.
addTail([],X,[X]).
addTail([H|T],X,[H|L]):-
	addTail(T,X,L).

replace(List, Id1, Id2, Id3, Exit):-
	replace(List, Id1, Id2, Id3, 0, [], Exit).

replace([], A, B, C, D, Exit, Exit):-
	!.
replace([H|T], Pos, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Pos, Id2, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Pos, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Pos, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 2, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Pos, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Id3, Pos1, Listawyj1,V),!.

allDogs([H|Listawej],[H|Listawyj]):-
	dogMove(Listawej,Listawyj).

dogMove(Listawej,Listawyj):-
	singleDog(Listawej,0,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,1,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,2,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,3,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,4,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,5,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,6,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,7,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,8,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,9,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,10,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,11,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,12,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,13,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,14,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,15,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,16,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,17,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,18,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,19,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,20,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,21,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,22,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,23,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,24,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,25,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,26,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,27,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,28,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,29,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,30,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,32,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,34,Listawyj).

singleDog(Listawej,Iter,Listawyj):-
	nth0(Iter, Listawej, 1),
	moveDog(Listawej,Iter,Listawyj).

moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 6,
	tokenMove(IdPies,1,A,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 5,
	tokenMove(IdPies,A,1,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 4,
	tokenMove(IdPies,A,B,1,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 1,
	tokenMove(IdPies,A,B,C,1,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 1,
	tokenMove(IdPies,A,B,C,D,1,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 4,
	tokenMove(IdPies,A,B,C,D,E,1,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 5,
	tokenMove(IdPies,A,B,C,D,E,F,1,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 6,
	tokenMove(IdPies,A,B,C,D,E,F,G,1),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).

moveDog(Listawej, 30, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 30, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 34,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).
moveDog(Listawej, 34, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 34, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 30,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).

replacePies(List, Id1, Id2, Exit):-
	replacePies(List, Id1, Id2, 0, [], Exit).

replacePies([], A, B, C, Exit, Exit):-
	!.
replacePies([H|T], Pos, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Pos, Id2, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 1, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Pos, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Id2, Pos1, Listawyj1,V),!.

start(Listawej,[Ruch1]):-
	H is 3,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 2,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 1,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.
start(Listawej,[Ruch1]):-
	H is 0,
	begin(Listawej,[H1|Ruch1],[H|Fin]),!.

begin(Listawej, Listawyj1, Listawyj):-
	move([0|Listawej],Listawyj1),
	allDogs(Listawyj1,Listawyj2),
	move(Listawyj2,Listawyj3),
	allDogs(Listawyj3,Listawyj4),
	move(Listawyj4,Listawyj).

move( [H|Listawej], Listawyj ) :-
	findIdJaguar(Listawej, IdJaguar ),
	canTokenMove([H|Listawej], IdJaguar, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	IdJaguar3 is IdJaguar - 12,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	tokenMove(IdJaguar2,1,A1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	IdJaguar3 is IdJaguar - 10,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	IdJaguar3 is IdJaguar - 8,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	IdJaguar3 is IdJaguar - 2,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	IdJaguar3 is IdJaguar + 2,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	IdJaguar3 is IdJaguar + 8,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	IdJaguar3 is IdJaguar + 10,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	IdJaguar3 is IdJaguar + 12,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,G1,1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 30, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 34,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 34, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 34, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 30,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 34,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 30, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], 34, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 30,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 34, IdJaguar2, IdJaguar3, Listawyj).

tokenMove(0,0,0,0,0,1,0,1,1).
tokenMove(1,0,0,0,1,1,0,1,0).
tokenMove(2,0,0,0,1,1,1,1,1).
tokenMove(3,0,0,0,1,1,0,1,0).
tokenMove(4,0,0,0,1,0,1,1,0).

tokenMove(5,0,1,0,0,1,0,1,0).
tokenMove(6,1,1,1,1,1,1,1,1).
tokenMove(7,0,1,0,1,1,0,1,0).
tokenMove(8,1,1,1,1,1,1,1,1).
tokenMove(9,0,1,0,1,0,0,1,0).

tokenMove(10,0,1,1,0,1,0,1,1).
tokenMove(11,0,1,0,1,1,0,1,0).
tokenMove(12,1,1,1,1,1,1,1,1).
tokenMove(13,0,1,0,1,1,0,1,0).
tokenMove(14,1,1,0,1,0,1,1,0).

tokenMove(15,0,1,0,0,1,0,1,0).
tokenMove(16,1,1,1,1,1,1,1,1).
tokenMove(17,0,1,0,1,1,0,1,0).
tokenMove(18,1,1,1,1,1,1,1,1).
tokenMove(19,0,1,0,1,0,0,1,0).

tokenMove(20,0,1,1,0,1,0,0,0).
tokenMove(21,0,1,0,1,1,0,0,0).
tokenMove(22,1,1,1,1,1,1,1,1).
tokenMove(23,0,1,0,1,1,0,0,0).
tokenMove(24,1,1,0,1,0,0,0,0).

tokenMove(25,0,0,0,0,0,0,0,0).
tokenMove(26,0,0,1,0,1,1,0,1).
tokenMove(27,0,1,0,1,1,0,1,0).
tokenMove(28,1,0,0,1,0,1,0,1).
tokenMove(29,0,0,0,0,0,0,0,0).

tokenMove(30,0,0,1,0,0,0,0,0).
tokenMove(31,0,0,0,0,0,0,0,0).
tokenMove(32,0,1,0,0,0,0,0,0).
tokenMove(33,0,0,0,0,0,0,0,0).
tokenMove(34,1,0,0,0,0,0,0,0).

nth0(Id, Lista, Value):-
nth01(0,Lista,Value, Id).

nth01(Iter, [H|T], H, Iter).

nth01(Iter, [H|T], Value, Id):-
Iter1 is Iter +1,
nth01(Iter1, T, Value, Id).

isEmpty( Id, Lista):-
	nth0(Id, Lista,0).
findIdJaguar( Lista, Id ):-
	nth0(Id, Lista, 2),
	!.
addTail([],X,[X]).
addTail([H|T],X,[H|L]):-
	addTail(T,X,L).

replace(List, Id1, Id2, Id3, Exit):-
	replace(List, Id1, Id2, Id3, 0, [], Exit).

replace([], A, B, C, D, Exit, Exit):-
	!.
replace([H|T], Pos, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Pos, Id2, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Pos, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Pos, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 2, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Pos, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Id3, Pos1, Listawyj1,V),!.

allDogs([H|Listawej],[H|Listawyj]):-
	dogMove(Listawej,Listawyj).

dogMove(Listawej,Listawyj):-
	singleDog(Listawej,0,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,1,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,2,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,3,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,4,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,5,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,6,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,7,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,8,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,9,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,10,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,11,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,12,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,13,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,14,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,15,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,16,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,17,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,18,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,19,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,20,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,21,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,22,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,23,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,24,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,25,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,26,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,27,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,28,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,29,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,30,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,32,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,34,Listawyj).

singleDog(Listawej,Iter,Listawyj):-
	nth0(Iter, Listawej, 1),
	moveDog(Listawej,Iter,Listawyj).

moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 6,
	tokenMove(IdPies,1,A,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 5,
	tokenMove(IdPies,A,1,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 4,
	tokenMove(IdPies,A,B,1,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 1,
	tokenMove(IdPies,A,B,C,1,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 1,
	tokenMove(IdPies,A,B,C,D,1,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 4,
	tokenMove(IdPies,A,B,C,D,E,1,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 5,
	tokenMove(IdPies,A,B,C,D,E,F,1,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 6,
	tokenMove(IdPies,A,B,C,D,E,F,G,1),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).

moveDog(Listawej, 30, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 30, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 34,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).
moveDog(Listawej, 34, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 34, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 30,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).

replacePies(List, Id1, Id2, Exit):-
	replacePies(List, Id1, Id2, 0, [], Exit).

replacePies([], A, B, C, Exit, Exit):-
	!.
replacePies([H|T], Pos, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Pos, Id2, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 1, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Pos, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Id2, Pos1, Listawyj1,V),!.


[Prolog] Logika planszy

[Prolog] Logika planszy

minimax(Pos, BestNextPos, Val) :-                     % Pos ma nastepce
    bagof(NextPos, move(Pos, NextPos), NextPosList),
    best(NextPosList, BestNextPos, Val), !.

minimax(Pos, _, Val) :-                     % Pos nie ma nastepcow
    utility(Pos, Val).

best([Pos], Pos, Val) :-                                % Nie ma juz wiecej pozycji do porownania
    minimax(Pos, _, Val), !.

best([Pos1 | PosList], BestPos, BestVal) :-             % Istnieja pozycje do porownania
    minimax(Pos1, _, Val1),
    best(PosList, Pos2, Val2),
    betterOf(Pos1, Val1, Pos2, Val2, BestPos, BestVal).

betterOf(Pos0, Val0, _, Val1, Pos0, Val0) :-   % Pos0 lepsza Pos1
    min_to_move(Pos0),                         % MIN ma zmienic pozycje na Pos0
    Val0 > Val1, !.                            % MAX preferuje wieksza wartosc

betterOf(Pos0, Val0, _, Val1, Pos0, Val0) :-   % Pos0 lepsza Pos1
    max_to_move(Pos0),                         % MAX ma zmienic pozycje na Pos0
    Val0 < Val1, !.                            % MIN preferuje mniejsza wartosc

betterOf(_, _, Pos1, Val1, Pos1, Val1).        % OW innym przypadku Pos1 lepsza od Pos0

%nalezy zaimplementowac nastepujace metody

%move(+Pos, -NextPos) : mowi o tym ze NextPos jest legalnym ruchem od Pos
%utility(+Pos, -Val) : mowi o tym, ze Pos jest rowna wartosci Val
%min_to_move(+Pos) : mowi o tym ze obecny gracz(w kontekscie minmax) na Pos jest mins
%max_to_move(+Pos) : mowi ze obecny gracz(w kontekscie minmax) na Pos jest max

indexOf([Element|_], Element, 0). % We found the element
indexOf([_|Tail], Element, Index):-
  indexOf(Tail, Element, Index1), % Check in the tail of the list
  Index is Index1+1.  % and increment the resulting index

  % A AA AAA AAAA AAAAA
  % B BB BBB BBBB BBBBB
  % C CC CCC CCCC CCCCC
  % D DD DDD DDDD DDDDD
  % E EE EEE EEEE EEEEE
  %   GG GGG GGGG
  % H HH HHH HHHH HHHHH

  tokenMove(1,0,0,0,1,1,1,0,0,0)
abilityToMove( [wejscie|_] , IndexEl , [] ):-
	tokemMove(A,1,1,1,1,1,1,1,1):-
		isEqual(A,7),
		isEqual(A,9),


Kasuję ilość skasowanych

Kasuję ilość skasowanych

start(Listawej,[Ruch1]):-
	begin(Listawej,[H1|Ruch1],[H|Fin]),
	not(wiecejZbitych(Listawej,Listawyj,H)),!.

wiecejZbitych(Listawej,Listawyj,H):-
	begin(Listawej,[H2|Ruch2],[Hb|Finb]),
	Hb > H.

begin(Listawej, Listawyj1, Listawyj):-
	move([0|Listawej],Listawyj1),
	allDogs(Listawyj1,Listawyj2),
	move(Listawyj2,Listawyj3),
	allDogs(Listawyj3,Listawyj4),
	move(Listawyj4,Listawyj).

move( [H|Listawej], Listawyj ) :-
	findIdJaguar(Listawej, IdJaguar ),
	canTokenMove([H|Listawej], IdJaguar, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	IdJaguar3 is IdJaguar - 12,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	tokenMove(IdJaguar2,1,A1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	IdJaguar3 is IdJaguar - 10,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	IdJaguar3 is IdJaguar - 8,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	IdJaguar3 is IdJaguar - 2,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	IdJaguar3 is IdJaguar + 2,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	IdJaguar3 is IdJaguar + 8,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	IdJaguar3 is IdJaguar + 10,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	IdJaguar3 is IdJaguar + 12,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,G1,1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 30, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 34,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 34, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 34, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 30,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 34,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 30, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], 34, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 30,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 34, IdJaguar2, IdJaguar3, Listawyj).

tokenMove(0,0,0,0,0,1,0,1,1).
tokenMove(1,0,0,0,1,1,0,1,0).
tokenMove(2,0,0,0,1,1,1,1,1).
tokenMove(3,0,0,0,1,1,0,1,0).
tokenMove(4,0,0,0,1,0,1,1,0).

tokenMove(5,0,1,0,0,1,0,1,0).
tokenMove(6,1,1,1,1,1,1,1,1).
tokenMove(7,0,1,0,1,1,0,1,0).
tokenMove(8,1,1,1,1,1,1,1,1).
tokenMove(9,0,1,0,1,0,0,1,0).

tokenMove(10,0,1,1,0,1,0,1,1).
tokenMove(11,0,1,0,1,1,0,1,0).
tokenMove(12,1,1,1,1,1,1,1,1).
tokenMove(13,0,1,0,1,1,0,1,0).
tokenMove(14,1,1,0,1,0,1,1,0).

tokenMove(15,0,1,0,0,1,0,1,0).
tokenMove(16,1,1,1,1,1,1,1,1).
tokenMove(17,0,1,0,1,1,0,1,0).
tokenMove(18,1,1,1,1,1,1,1,1).
tokenMove(19,0,1,0,1,0,0,1,0).

tokenMove(20,0,1,1,0,1,0,0,0).
tokenMove(21,0,1,0,1,1,0,0,0).
tokenMove(22,1,1,1,1,1,1,1,1).
tokenMove(23,0,1,0,1,1,0,0,0).
tokenMove(24,1,1,0,1,0,0,0,0).

tokenMove(25,0,0,0,0,0,0,0,0).
tokenMove(26,0,0,1,0,1,1,0,1).
tokenMove(27,0,1,0,1,1,0,1,0).
tokenMove(28,1,0,0,1,0,1,0,1).
tokenMove(29,0,0,0,0,0,0,0,0).

tokenMove(30,0,0,1,0,0,0,0,0).
tokenMove(31,0,0,0,0,0,0,0,0).
tokenMove(32,0,1,0,0,0,0,0,0).
tokenMove(33,0,0,0,0,0,0,0,0).
tokenMove(34,1,0,0,0,0,0,0,0).

isEmpty( Id, Lista):-
	nth0(Id, Lista,0).
findIdJaguar( Lista, Id ):-
	nth0(Id, Lista, 2),
	!.
addTail([],X,[X]).
addTail([H|T],X,[H|L]):-
	addTail(T,X,L).

replace(List, Id1, Id2, Id3, Exit):-
	replace(List, Id1, Id2, Id3, 0, [], Exit).

replace([], A, B, C, D, Exit, Exit):-
	!.
replace([H|T], Pos, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Pos, Id2, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Pos, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Pos, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 2, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Pos, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Id3, Pos1, Listawyj1,V),!.

allDogs([H|Listawej],[H|Listawyj]):-
	dogMove(Listawej,Listawyj).

dogMove(Listawej,Listawyj):-
	singleDog(Listawej,0,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,1,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,2,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,3,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,4,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,5,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,6,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,7,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,8,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,9,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,10,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,11,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,12,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,13,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,14,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,15,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,16,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,17,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,18,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,19,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,20,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,21,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,22,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,23,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,24,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,25,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,26,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,27,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,28,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,29,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,30,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,32,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,34,Listawyj).

singleDog(Listawej,Iter,Listawyj):-
	nth0(Iter, Listawej, 1),
	moveDog(Listawej,Iter,Listawyj).

moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 6,
	tokenMove(IdPies,1,A,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 5,
	tokenMove(IdPies,A,1,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 4,
	tokenMove(IdPies,A,B,1,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 1,
	tokenMove(IdPies,A,B,C,1,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 1,
	tokenMove(IdPies,A,B,C,D,1,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 4,
	tokenMove(IdPies,A,B,C,D,E,1,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 5,
	tokenMove(IdPies,A,B,C,D,E,F,1,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 6,
	tokenMove(IdPies,A,B,C,D,E,F,G,1),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).

moveDog(Listawej, 30, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 30, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 34,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).
moveDog(Listawej, 34, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 34, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 30,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).

replacePies(List, Id1, Id2, Exit):-
	replacePies(List, Id1, Id2, 0, [], Exit).

replacePies([], A, B, C, Exit, Exit):-
	!.
replacePies([H|T], Pos, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Pos, Id2, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 1, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Pos, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Id2, Pos1, Listawyj1,V),!.

start(Listawej,[H|Ruch1]):-
	begin(Listawej,[H1|Ruch1],[H|Fin]),
	not(wiecejZbitych(Listawej,Listawyj,H)),!.

wiecejZbitych(Listawej,Listawyj,H):-
	begin(Listawej,[H2|Ruch2],[Hb|Finb]),
	Hb > H.

begin(Listawej, Listawyj1, Listawyj):-
	move([0|Listawej],Listawyj1),
	allDogs(Listawyj1,Listawyj2),
	move(Listawyj2,Listawyj3),
	allDogs(Listawyj3,Listawyj4),
	move(Listawyj4,Listawyj).

move( [H|Listawej], Listawyj ) :-
	findIdJaguar(Listawej, IdJaguar ),
	canTokenMove([H|Listawej], IdJaguar, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	IdJaguar3 is IdJaguar - 12,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	tokenMove(IdJaguar2,1,A1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 6,
	tokenMove(IdJaguar,1,A,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	IdJaguar3 is IdJaguar - 10,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,1,B1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 5,
	tokenMove(IdJaguar,A,1,B,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	IdJaguar3 is IdJaguar - 8,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,1,C1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 4,
	tokenMove(IdJaguar,A,B,1,C,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	IdJaguar3 is IdJaguar - 2,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,1,D1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar - 1,
	tokenMove(IdJaguar,A,B,C,1,D,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	IdJaguar3 is IdJaguar + 2,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,1,E1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 1,
	tokenMove(IdJaguar,A,B,C,D,1,E,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	IdJaguar3 is IdJaguar + 8,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,1,F1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 4,
	tokenMove(IdJaguar,A,B,C,D,E,1,F,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	IdJaguar3 is IdJaguar + 10,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,1,G1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 5,
	tokenMove(IdJaguar,A,B,C,D,E,F,1,G),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], IdJaguar, [H1|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	IdJaguar3 is IdJaguar + 12,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	tokenMove(IdJaguar2,A1,B1,C1,D1,E1,F1,G1,1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], IdJaguar, [H|Listawyj]):-
	IdJaguar2 is IdJaguar + 6,
	tokenMove(IdJaguar,A,B,C,D,E,F,G,1),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 30, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 34,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 34, [H|Listawyj]):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 34, -1, IdJaguar2, Listawyj).
canTokenMove([H|Listawej], 32, [H|Listawyj]):-
	IdJaguar2 is 30,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).

canTokenMove([H|Listawej], 30, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 34,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 30, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove([H|Listawej], 34, [H1|Listawyj]):-
	IdJaguar2 is 32,
	IdJaguar3 is 30,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	H1 is H +1,
	replace(Listawej, 34, IdJaguar2, IdJaguar3, Listawyj).

tokenMove(0,0,0,0,0,1,0,1,1).
tokenMove(1,0,0,0,1,1,0,1,0).
tokenMove(2,0,0,0,1,1,1,1,1).
tokenMove(3,0,0,0,1,1,0,1,0).
tokenMove(4,0,0,0,1,0,1,1,0).

tokenMove(5,0,1,0,0,1,0,1,0).
tokenMove(6,1,1,1,1,1,1,1,1).
tokenMove(7,0,1,0,1,1,0,1,0).
tokenMove(8,1,1,1,1,1,1,1,1).
tokenMove(9,0,1,0,1,0,0,1,0).

tokenMove(10,0,1,1,0,1,0,1,1).
tokenMove(11,0,1,0,1,1,0,1,0).
tokenMove(12,1,1,1,1,1,1,1,1).
tokenMove(13,0,1,0,1,1,0,1,0).
tokenMove(14,1,1,0,1,0,1,1,0).

tokenMove(15,0,1,0,0,1,0,1,0).
tokenMove(16,1,1,1,1,1,1,1,1).
tokenMove(17,0,1,0,1,1,0,1,0).
tokenMove(18,1,1,1,1,1,1,1,1).
tokenMove(19,0,1,0,1,0,0,1,0).

tokenMove(20,0,1,1,0,1,0,0,0).
tokenMove(21,0,1,0,1,1,0,0,0).
tokenMove(22,1,1,1,1,1,1,1,1).
tokenMove(23,0,1,0,1,1,0,0,0).
tokenMove(24,1,1,0,1,0,0,0,0).

tokenMove(25,0,0,0,0,0,0,0,0).
tokenMove(26,0,0,1,0,1,1,0,1).
tokenMove(27,0,1,0,1,1,0,1,0).
tokenMove(28,1,0,0,1,0,1,0,1).
tokenMove(29,0,0,0,0,0,0,0,0).

tokenMove(30,0,0,1,0,0,0,0,0).
tokenMove(31,0,0,0,0,0,0,0,0).
tokenMove(32,0,1,0,0,0,0,0,0).
tokenMove(33,0,0,0,0,0,0,0,0).
tokenMove(34,1,0,0,0,0,0,0,0).

isEmpty( Id, Lista):-
	nth0(Id, Lista,0).
findIdJaguar( Lista, Id ):-
	nth0(Id, Lista, 2),
	!.
addTail([],X,[X]).
addTail([H|T],X,[H|L]):-
	addTail(T,X,L).

replace(List, Id1, Id2, Id3, Exit):-
	replace(List, Id1, Id2, Id3, 0, [], Exit).

replace([], A, B, C, D, Exit, Exit):-
	!.
replace([H|T], Pos, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Pos, Id2, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Pos, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Pos, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 2, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Pos, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Id3, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Id3, Pos1, Listawyj1,V),!.

allDogs([H|Listawej],[H|Listawyj]):-
	dogMove(Listawej,Listawyj).

dogMove(Listawej,Listawyj):-
	singleDog(Listawej,0,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,1,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,2,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,3,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,4,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,5,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,6,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,7,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,8,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,9,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,10,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,11,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,12,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,13,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,14,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,15,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,16,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,17,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,18,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,19,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,20,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,21,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,22,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,23,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,24,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,25,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,26,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,27,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,28,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,29,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,30,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,32,Listawyj).
dogMove(Listawej,Listawyj):-
	singleDog(Listawej,34,Listawyj).

singleDog(Listawej,Iter,Listawyj):-
	nth0(Iter, Listawej, 1),
	moveDog(Listawej,Iter,Listawyj).

moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 6,
	tokenMove(IdPies,1,A,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 5,
	tokenMove(IdPies,A,1,B,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 4,
	tokenMove(IdPies,A,B,1,C,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 1,
	tokenMove(IdPies,A,B,C,1,D,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 1,
	tokenMove(IdPies,A,B,C,D,1,E,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 4,
	tokenMove(IdPies,A,B,C,D,E,1,F,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 5,
	tokenMove(IdPies,A,B,C,D,E,F,1,G),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 6,
	tokenMove(IdPies,A,B,C,D,E,F,G,1),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).

moveDog(Listawej, 30, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 30, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 34,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).
moveDog(Listawej, 34, Listawyj):-
	IdPies2 is 32,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 34, IdPies2, Listawyj).
moveDog(Listawej, 32, Listawyj):-
	IdPies2 is 30,
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, 32, IdPies2, Listawyj).

replacePies(List, Id1, Id2, Exit):-
	replacePies(List, Id1, Id2, 0, [], Exit).

replacePies([], A, B, C, Exit, Exit):-
	!.
replacePies([H|T], Pos, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Pos, Id2, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Pos, Pos, Listawyj,V):-
	addTail(Listawyj, 1, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Pos, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Id2, Pos, Listawyj,V):-
	addTail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Id2, Pos1, Listawyj1,V),!.


Update taskdb1.prolog

Update taskdb1.prolog

% Author: Landon Soriano
% Date: 02/02/2015

%%
%% person(ID, TASK_CAPABILITIES, AVAILABLE_HOURS)
%%
%%   How many hours each person has available and what classes of
tasks they
%%   are capable of performing.
%%
person(p1, [c,a], 20).
person(p2, [b], 10).
person(p3, [a,b], 15).
person(p4, [c], 30).
%%
%% task(ID, REQUIRED_HOURS, TASK_CLASS)
%%
%%   How long each task requires and what class it falls under.
%%
task(t1, a, 5).
task(t2, b, 10).
task(t3, c, 15).
task(t4, c, 10).
task(t5, a, 15).
task(t6, b, 10).

% Author: Landon Soriano
% Date: 02/02/2015
% Class: ICS 313

%%
%% person(ID, TASK_CAPABILITIES, AVAILABLE_HOURS)
%%
%%   How many hours each person has available and what classes of
tasks they
%%   are capable of performing.
%%
person(p1, [c,a], 20).
person(p2, [b], 10).
person(p3, [a,b], 15).
person(p4, [c], 30).
%%
%% task(ID, REQUIRED_HOURS, TASK_CLASS)
%%
%%   How long each task requires and what class it falls under.
%%
task(t1, a, 5).
task(t2, b, 10).
task(t3, c, 15).
task(t4, c, 10).
task(t5, a, 15).
task(t6, b, 10).


Eliminar .yap

Eliminar .yap

db4o9'	Y"1Du	Y"1Du	Y"1Du	Y"1Du.
(__;DESKTOP-3C6IGJV15f16eb5f3b0457ccom.db4o.ext.Db4oDatabasei_signaturei_uuid123($
66.5
!'com.db4o.StaticFieldname	value+,-com.db4o.StaticClassname	fields5
java.util.ArrayList#%-com.db4o.typehandlers.IgnoreFieldsTypeHandlerlerdler$3#baloncesto.modelo.Equipoidnombre	anoFundacion
presidente	pabellon	patrocinador		jugadores
R"0Se practica la defensa	Defensivo
	o l"2+,java.util.AbstractList "-com.db4o.typehandlers.IgnoreFieldsTypeHandlerdlerjava.util.AbstractCollection+com.db4o.typehandlers.CollectionTypeHandler
 X*B:&'	Herbalife	Gran Canaria ArenaEnrique MorenoGran Canaria%1 #&'	 #&*0.12 baloncesto.modelo.TipoIncidencia/idtipo	sancion	descripcion	G
RF*Llegar tarde1000Retraso#baloncesto.modelo.TipoEntrenamiento)idtipo	descripcion
P".Se practica la ofensaOfensivo
<"Para cansar	Explosivo
~t
*J#Insultar al jefe o a los compaeros500Insultar
n`*6No venir al entrenamiento10000Falta%^nF	(.?
vjL]
l

!j "S
#c$`%_
&'6()*_+h,d-iR.s/	0
1
i23
M|V
G	05
V
G	01"5
C
5
6()*_+h,d-iR$^nF	(.?
vjL]
l

!j "S
#c$`%_
&'6()*_+h,d-iR.	/
0
1
i2


Update geometry.prolog

Update geometry.prolog

Noticed usage of gradients over radians values

/** Basic 2D geometry (geometry.prolog)
  This is a joke library. Why it is a joke? Well, it's not 100% legit.
  Some predicates are valid, some aren't.. It's up to you to find what's wrong
  and propose a fix. Enjoy.

  @author "AresAndy"
  @license BSD
*/

:- module(geometry, [point/2,
                     segment/2,
		     distance_points/3,
		     segment_lenght/2,
		     angle/3,
                     arc/2,
                     gradient/2,
		     radiant/2,
                     horizontal/1,
                     vertical/1,
		     arc_between_segments/3
		     perpendicular/2
                     parallel/2]).

point(_, _).

segment(point(_, _), point(_, _)).

distance_points(point(X1, Y1), point(X2, Y2), Res) :- Res is sqrt(((X2 - X1) ** 2) + ((Y2 - Y1) ** 2)).

segment_lenght(segment(A, B), Res) :- distance_points(A, B, Res).

angle(point(_, _), _, _).

gradient(Rad, Res) :- Res is (Rad * 180) rdiv pi.

radiant(Gra, Res) :- Res is (Gra * pi) rdiv 180.

arc(angle(_, A, B), Res) :- Res is atan(A rdiv B).

vertical(segment(point(X, _), point(Y, _))) :- X =:= Y;

horizontal(segment(point(_, X), point(_, Y))) :- X =:= Y.

arc_between_segments(X, Y, Res) :-
	segment_lenght(X, Xl),
	segment_lenght(Y, Yl),
	arc(angle(_, Xl, Yl), SubRes),
	gradient(SubRes, Res).

perpendicular(X, Y) :-
	(vertical(Y), horizontal(X));
	(vertical(X), horizontal(Y));
	arc_between_segments(X, Y, SubRes),
        between(89.9998, 90.9998, SubRes).

parallel(X, Y) :-
	(vertical(Y), vertical(X));
	(horizontal(X), horizontal(Y));
	arc_between_segments(X, Y, SubRes),
	between(359.9998, 0.9998, SubRes).

/** Basic 2D geometry (geometry.prolog)
  This is a joke library. Why it is a joke? Well, it's not 100% legit.
  Some predicates are valid, some aren't.. It's up to you to find what's wrong
  and propose a fix. Enjoy.

  @author "AresAndy"
  @license BSD
*/

:- module(geometry, [point/2,
                     segment/2,
		     distance_points/3,
		     segment_lenght/2,
		     angle/3,
                     arc/2,
                     gradient/2,
		     radiant/2,
                     horizontal/1,
                     vertical/1,
		     arc_between_segments/3
		     perpendicular/2
                     parallel/2]).

point(_, _).

segment(point(_, _), point(_, _)).

distance_points(point(X1, Y1), point(X2, Y2), Res) :- Res is sqrt(((X2 - X1) ** 2) + ((Y2 - Y1) ** 2)).

segment_lenght(segment(A, B), Res) :- distance_points(A, B, Res).

angle(point(_, _), _, _).

gradient(Rad, Res) :- Res is (Rad * 180) rdiv pi.

radiant(Gra, Res) :- Res is (Gra * pi) rdiv 180.

arc(angle(_, A, B), Res) :- Res is atan(A rdiv B).

vertical(segment(point(X, _), point(Y, _))) :- X =:= Y;

horizontal(segment(point(_, X), point(_, Y))) :- X =:= Y.

arc_between_segments(X, Y, Res) :-
	segment_lenght(X, Xl),
	segment_lenght(Y, Yl),
	arc(angle(_, Xl, Yl), Res).

perpendicular(X, Y) :-
	(vertical(Y), horizontal(X));
	(vertical(X), horizontal(Y));
	arc_between_segments(X, Y, SubRes),
        between(89.9998, 90.9998, SubRes).

parallel(X, Y) :-
	(vertical(Y), vertical(X));
	(horizontal(X), horizontal(Y));
	arc_between_segments(X, Y, SubRes),
	between(359.9998, 0.9998, SubRes).