Wyszukiwanie wszystkich możliwych ruchów psów

%------------------ Funkcja moliwych ruchw ------------------%
move( Listawej, Listawyj ) :-
	findIdJaguar( Listawej, IdJaguar ),
	canTokenMove(Listawej, IdJaguar, Listawyj).

%------------------ Funkcje moliwego ruchu w danych kierunkach z moliwym biciem ------------------%
	%%%%%% Ujemne
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 6,
	IdJaguar3 is IdJaguar - 12,
	tokenMove(IdJaguar,1,_,_,_,_,_,_,_),
	tokenMove(IdJaguar2,1,_,_,_,_,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 6,
	tokenMove(IdJaguar,1,_,_,_,_,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 5,
	IdJaguar3 is IdJaguar - 10,
	tokenMove(IdJaguar,_,1,_,_,_,_,_,_),
	tokenMove(IdJaguar2,_,1,_,_,_,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 5,
	tokenMove(IdJaguar,_,1,_,_,_,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 4,
	IdJaguar3 is IdJaguar - 8,
	tokenMove(IdJaguar,_,_,1,_,_,_,_,_),
	tokenMove(IdJaguar2,_,_,1,_,_,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 4,
	tokenMove(IdJaguar,_,_,1,_,_,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 1,
	IdJaguar3 is IdJaguar - 2,
	tokenMove(IdJaguar,_,_,_,1,_,_,_,_),
	tokenMove(IdJaguar2,_,_,_,1,_,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 1,
	tokenMove(IdJaguar,_,_,_,1,_,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

%%%%%%%%% dodatnie
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 1,
	IdJaguar3 is IdJaguar + 2,
	tokenMove(IdJaguar,_,_,_,_,1,_,_,_),
	tokenMove(IdJaguar2,_,_,_,_,1,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 1,
	tokenMove(IdJaguar,_,_,_,_,1,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 4,
	IdJaguar3 is IdJaguar + 8,
	tokenMove(IdJaguar,_,_,_,_,_,1,_,_),
	tokenMove(IdJaguar2,_,_,_,_,_,1,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 4,
	tokenMove(IdJaguar,_,_,_,_,_,1,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 5,
	IdJaguar3 is IdJaguar + 10,
	tokenMove(IdJaguar,_,_,_,_,_,_,1,_),
	tokenMove(IdJaguar2,_,_,_,_,_,_,1,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 5,
	tokenMove(IdJaguar,_,_,_,_,_,_,1,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 6,
	IdJaguar3 is IdJaguar + 12,
	tokenMove(IdJaguar,_,_,_,_,_,_,_,1),
	tokenMove(IdJaguar2,_,_,_,_,_,_,_,1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 6,
	tokenMove(IdJaguar,_,_,_,_,_,_,_,1),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

%%%%%%%%% specjalne
canTokenMove(Listawej, 30, Listawyj):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 30, -1, IdJaguar2, Listawyj).
canTokenMove(Listawej, 32, Listawyj):-
	IdJaguar2 is 34,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).
canTokenMove(Listawej, 34, Listawyj):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 34, -1, IdJaguar2, Listawyj).
canTokenMove(Listawej, 32, Listawyj):-
	IdJaguar2 is 30,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, 30, Listawyj):-
	IdJaguar2 is 32,
	IdJaguar3 is 34,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, 30, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, 34, Listawyj):-
	IdJaguar2 is 32,
	IdJaguar3 is 30,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, 34, IdJaguar2, IdJaguar3, Listawyj).

%------------------ Ograniczenia planszy ------------------%
%%%%%%%%%%% 1 2 3 4 5 6 7 8
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).

%%%%%%%%%%%# 1 2 3 4 5 6 7 8
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):-  % sprawdza czy mona wykona ruch, zwraca prawd jeli pole jest puste
	nth0(Id, Lista,0).
findIdJaguar( Lista, Id ):- % zwraca aktualne id jaguara w licie
	nth0(Id, Lista, 2),
	!.
add_tail([],X,[X]).
add_tail([H|T],X,[H|L]):-
	add_tail(T,X,L).

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

replace([], _, _, _, _, Exit, Exit):-
	!.
replace([H|T], Pos, Id2, Id3, Pos, Listawyj,V):-
	add_tail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Pos, Id2, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Pos, Id3, Pos, Listawyj,V):-
	add_tail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Pos, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Pos, Pos, Listawyj,V):-
	add_tail(Listawyj, 2, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Pos, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Id3, Pos, Listawyj,V):-
	add_tail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Id3, Pos1, Listawyj1,V),!.

allDogs(Listawej,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).

%dogMove(Listawej,35,Listawyj):- !.
singleDog(Listawej,Iter,Listawyj):-
	nth0(Iter, Listawej, 1),
	moveDog(Listawej,Iter,Listawyj).
	%Iter1 is Iter+1,
	%dogMove(Listawej,Iter1,Listawyj).

moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 6,
	tokenMove(IdPies,1,_,_,_,_,_,_,_),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 5,
	tokenMove(IdPies,_,1,_,_,_,_,_,_),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 4,
	tokenMove(IdPies,_,_,1,_,_,_,_,_),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies - 1,
	tokenMove(IdPies,_,_,_,1,_,_,_,_),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 1,
	tokenMove(IdPies,_,_,_,_,1,_,_,_),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 4,
	tokenMove(IdPies,_,_,_,_,_,1,_,_),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 5,
	tokenMove(IdPies,_,_,_,_,_,_,1,_),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).
moveDog(Listawej, IdPies, Listawyj):-
	IdPies2 is IdPies + 6,
	tokenMove(IdPies,_,_,_,_,_,_,_,1),
	isEmpty( IdPies2, Listawej ),
	replacePies(Listawej, IdPies, IdPies2, Listawyj).

%%%%% specjalne
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([], _, _, _, Exit, Exit):-
	!.
replacePies([H|T], Pos, Id2, Pos, Listawyj,V):-
	add_tail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Pos, Id2, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Pos, Pos, Listawyj,V):-
	add_tail(Listawyj, 1, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Pos, Pos1, Listawyj1,V),!.
replacePies([H|T], Id1, Id2, Pos, Listawyj,V):-
	add_tail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replacePies(T, Id1, Id2, Pos1, Listawyj1,V),!.

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

%------------------ Funkcja moliwych ruchw ------------------%
move( Listawej, Listawyj ) :-
	findIdJaguar( Listawej, IdJaguar ),
	canTokenMove(Listawej, IdJaguar, Listawyj).

%------------------ Funkcje moliwego ruchu w danych kierunkach z moliwym biciem ------------------%
	%%%%%% Ujemne
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 6,
	IdJaguar3 is IdJaguar - 12,
	tokenMove(IdJaguar,1,_,_,_,_,_,_,_),
	tokenMove(IdJaguar2,1,_,_,_,_,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 6,
	tokenMove(IdJaguar,1,_,_,_,_,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 5,
	IdJaguar3 is IdJaguar - 10,
	tokenMove(IdJaguar,_,1,_,_,_,_,_,_),
	tokenMove(IdJaguar2,_,1,_,_,_,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 5,
	tokenMove(IdJaguar,_,1,_,_,_,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 4,
	IdJaguar3 is IdJaguar - 8,
	tokenMove(IdJaguar,_,_,1,_,_,_,_,_),
	tokenMove(IdJaguar2,_,_,1,_,_,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 4,
	tokenMove(IdJaguar,_,_,1,_,_,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 1,
	IdJaguar3 is IdJaguar - 2,
	tokenMove(IdJaguar,_,_,_,1,_,_,_,_),
	tokenMove(IdJaguar2,_,_,_,1,_,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar - 1,
	tokenMove(IdJaguar,_,_,_,1,_,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

%%%%%%%%% dodatnie
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 1,
	IdJaguar3 is IdJaguar + 2,
	tokenMove(IdJaguar,_,_,_,_,1,_,_,_),
	tokenMove(IdJaguar2,_,_,_,_,1,_,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 1,
	tokenMove(IdJaguar,_,_,_,_,1,_,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 4,
	IdJaguar3 is IdJaguar + 8,
	tokenMove(IdJaguar,_,_,_,_,_,1,_,_),
	tokenMove(IdJaguar2,_,_,_,_,_,1,_,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 4,
	tokenMove(IdJaguar,_,_,_,_,_,1,_,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 5,
	IdJaguar3 is IdJaguar + 10,
	tokenMove(IdJaguar,_,_,_,_,_,_,1,_),
	tokenMove(IdJaguar2,_,_,_,_,_,_,1,_),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 5,
	tokenMove(IdJaguar,_,_,_,_,_,_,1,_),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 6,
	IdJaguar3 is IdJaguar + 12,
	tokenMove(IdJaguar,_,_,_,_,_,_,_,1),
	tokenMove(IdJaguar2,_,_,_,_,_,_,_,1),
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, IdJaguar, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, IdJaguar, Listawyj):-
	IdJaguar2 is IdJaguar + 6,
	tokenMove(IdJaguar,_,_,_,_,_,_,_,1),
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, IdJaguar, -1, IdJaguar2, Listawyj).

%%%%%%%%% specjalne
canTokenMove(Listawej, 30, Listawyj):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 30, -1, IdJaguar2, Listawyj).
canTokenMove(Listawej, 32, Listawyj):-
	IdJaguar2 is 34,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).
canTokenMove(Listawej, 34, Listawyj):-
	IdJaguar2 is 32,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 34, -1, IdJaguar2, Listawyj).
canTokenMove(Listawej, 32, Listawyj):-
	IdJaguar2 is 30,
	isEmpty( IdJaguar2, Listawej ),
	replace(Listawej, 32, -1, IdJaguar2, Listawyj).

canTokenMove(Listawej, 30, Listawyj):-
	IdJaguar2 is 32,
	IdJaguar3 is 34,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, 30, IdJaguar2, IdJaguar3, Listawyj).
canTokenMove(Listawej, 34, Listawyj):-
	IdJaguar2 is 32,
	IdJaguar3 is 30,
	isEmpty( IdJaguar3, Listawej ),
	nth0(IdJaguar2, Listawej, 1),
	replace(Listawej, 34, IdJaguar2, IdJaguar3, Listawyj).

%------------------ Ograniczenia planszy ------------------%
%%%%%%%%%%% 1 2 3 4 5 6 7 8
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).

%%%%%%%%%%%# 1 2 3 4 5 6 7 8
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):-  % sprawdza czy mona wykona ruch, zwraca prawd jeli pole jest puste
	nth0(Id, Lista,0).
findIdJaguar( Lista, Id ):- % zwraca aktualne id jaguara w licie
	nth0(Id, Lista, 2),
	!.
add_tail([],X,[X]).
add_tail([H|T],X,[H|L]):-
	add_tail(T,X,L).

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

replace([], _, _, _, _, Exit, Exit):-
	!.
replace([H|T], Pos, Id2, Id3, Pos, Listawyj,V):-
	add_tail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Pos, Id2, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Pos, Id3, Pos, Listawyj,V):-
	add_tail(Listawyj, 0, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Pos, Id3, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Pos, Pos, Listawyj,V):-
	add_tail(Listawyj, 2, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Pos, Pos1, Listawyj1,V),!.
replace([H|T], Id1, Id2, Id3, Pos, Listawyj,V):-
	add_tail(Listawyj, H, Listawyj1),
	Pos1 is Pos +1,
	replace(T, Id1, Id2, Id3, Pos1, Listawyj1,V),!.

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


Wolf, sheep, and cabbage problem

Wolf, sheep, and cabbage problem

%% Wof, sheep, and cabbage problem
%  and Graph theory
%  ------------------------------

next(wc, wsc).
next(w, wc).
next(c, wc).
next(ws, w).
next(sc, c).
next(s, ws).
next(s, sc).
next(wsc, s).

%  ?- consult('wolf-sheep-cabbage/in-prolog/wsc.prolog').
%: true.
%
%  ?- solve(wsc,R).
%: wsc -> s
%: s -> ws
%: ws -> w
%: w -> wc
%: R = wsc ;
%: s -> sc
%: sc -> c
%: c -> wc
%: R = wsc.
%
solve(wsc, Result) :-
    solve(wsc, wsc, Result).

solve(Src, Via, Result) :-
    next(Via, R1),
    (
        Src == R1,
        !,
        Result = R1;

        format("~p -> ~p~n", [Via, R1]),
        solve(Src, R1, Result)
    ).

%% Wof, sheep, and cabbage problem
%  and Graph theory
%  ------------------------------

next(wc, wsc).
next(w, wc).
next(c, wc).
next(ws, w).
next(sc, c).
next(s, ws).
next(s, sc).
next(wsc, s).

solve(wsc, Result) :-
    solve(wsc, wsc, Result).

solve(Src, Via, Result) :-
    next(Via, R1),
    (
        Src == R1,
        !,
        Result = R1;

        format("~p -> ~p~n", [Via, R1]),
        solve(Src, R1, Result)
    ).


Updated TODO

Updated TODO

TODO for integration of YAP and SWI I/O systems

Conclusions:

    * Make Prolog I/O library from
	- pl-stream.c
	- pl-file.c
	- pl-utf8.c
	- pl-text.c (minus conversion text<->Prolog)
	- pl-option.c
	- pl-error.c

    * Take some bits from pl-os.c
	- initEncoding()

    * Needs state structures for engine and global state
    	- IO_local_data
	- IO_global_data

TODO:

    * Abstract some interfaces
	- read_pending_input/3
    * Define generic interfaces
	- Memory allocation
	- Hash-table management (just renaming?)
    * Cleanup foreign flag interface (naming)

TODO for integration of YAP and SWI I/O systems

Conclusions:

    * Make Prolog I/O library from
	- pl-stream.c
	- pl-file.c
	- pl-utf8.c
	- pl-text.c (minus conversion text<->Prolog)
	- pl-option.c
	- pl-error.c

    * Take some bits from pl-os.c
	- initEncoding()

    * Needs state structures for engine and global state
    	- IO_local_data
	- IO_global_data

TODO:

    * Abstract some interfaces
	- read_pending_input/3
    * Define generic interfaces
	- Have all predicates using the PRED_IMPL interface (document)
	- Memory allocation
	- Hash-table management (just renaming?)
    * Cleanup foreign flag interface (naming)


Update taskdb2.prolog

Update taskdb2.prolog

% Author: Landon Soriano
% Date: 02/02/2015
%% Data base for the list of people who can work, follows the
%% following format:
%%
%% 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, [a,b], 20).
person(p2, [b,c], 10).
person(p3, [a,c], 15).
person(p4, [c], 30).

%% Data base for tasks that are available to be done.
%% Follows the following format:
%%
%% 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

%% Data base for the list of people who can work, follows the
%% following format:
%%
%% 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, [a,b], 20).
person(p2, [b,c], 10).
person(p3, [a,c], 15).
person(p4, [c], 30).

%% Data base for tasks that are available to be done.
%% Follows the following format:
%%
%% 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).


Remove flatten method that got replaced by the builtin append.

use_module(library(clpfd)).

diag([], [], _).
diag([Row|Rows], [V|T], D) :-
    D1 is D + 1,
    nth1(D, Row, V),
    diag(Rows, T, D1).

diag(Rows, Diag) :-
    diag(Rows, Diag, 1).

rdiag([], [], _).
rdiag([Row|Rows], [V|T], D) :-
    D1 is D - 1,
    nth1(D, Row, V),
    rdiag(Rows, T, D1).

rdiag(Rows, Diag) :-
    length(Rows, L),
    rdiag(Rows, Diag, L).

mysum(Value, Operator, List) :-
    sum(List, Operator, Value).

magic_box(Sum, Size, Domain, Box) :-
    length(Box, Size),
    maplist(same_length(Box), Box),
    append(Box, Vars),
    Vars ins Domain,
    all_distinct(Vars),
    transpose(Box, Cols),
    diag(Box, Diag),
    rdiag(Box, RDiag),
    maplist(mysum(Sum, #=), Box),
    maplist(mysum(Sum, #=), Cols),
    sum(Diag, #=, Sum),
    sum(RDiag, #=, Sum).

% time(findall(Box, (magic_box(21, 3, 3..11, Box), append(Box, Vars), labeling([ff], Vars)), Bag)).

use_module(library(clpfd)).

flatten([], [], 0, _) :- !.
flatten([X|T], Flat, H, W) :-
    length(X, W),
    append(X, Rest, Flat),
    flatten(T, Rest, H0, W),
    H is H0 + 1.

flatten(X, Y) :- flatten(X, Y, _, _).

diag([], [], _).
diag([Row|Rows], [V|T], D) :-
    D1 is D + 1,
    nth1(D, Row, V),
    diag(Rows, T, D1).

diag(Rows, Diag) :-
    diag(Rows, Diag, 1).

rdiag([], [], _).
rdiag([Row|Rows], [V|T], D) :-
    D1 is D - 1,
    nth1(D, Row, V),
    rdiag(Rows, T, D1).

rdiag(Rows, Diag) :-
    length(Rows, L),
    rdiag(Rows, Diag, L).

mysum(Value, Operator, List) :-
    sum(List, Operator, Value).

magic_box(Sum, Size, Domain, Box) :-
    length(Box, Size),
    maplist(same_length(Box), Box),
    append(Box, Vars),
    Vars ins Domain,
    all_distinct(Vars),
    transpose(Box, Cols),
    diag(Box, Diag),
    rdiag(Box, RDiag),
    maplist(mysum(Sum, #=), Box),
    maplist(mysum(Sum, #=), Cols),
    sum(Diag, #=, Sum),
    sum(RDiag, #=, Sum).

% time(findall(Box, (magic_box(21, 3, 3..11, Box), append(Box, Vars), labeling([ff], Vars)), Bag)).


autorski nth0

autorski nth0

co by żyło się lepiej

#nieśpimyKodzimy!

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),!.

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),!.


coś  prolog nie działa jak ma

coś  prolog nie działa jak ma


Bez minusów

Bez minusów


Update schedule.prolog

Update schedule.prolog

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

%%  recurses throughout the list to find possible matches.
%% follows the people, task, result format)
%% will look for empty parts of list and see if it is possible
%% to add a task with that person.

schedule([], X, Y).
schedule([Elem | Rest], X, [Elem | Result]) :-
	schedule(Rest, X, Result).

%% nth(Index,  % the index number, starts from 0
%     List,   % the list
%     Elem)   % the element of List at index position
% nth is true if Elem is the Index th element of List

%% stopping condition as we are entering an empty list
%% so we wil stop.

nth(0, [FirstElement | RestOfList], FirstElement).
nth(N, [_ | RestOfList], Elem) :-
	N > 0,
	M is N-1,
	nth(M, RestOfList, Elem).

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

%%  recurses throughout the list to find possible matches.
%% follows the people, task, result format)
%% will look for empty parts of list and see if it is possible
%% to add a task with that person.

schedule([], X, Y).
schedule([Elem | Rest], X, [Elem | Result]) :-
	schedule(Rest, X, Result).

%% nth(Index,  % the index number, starts from 0
%     List,   % the list
%     Elem)   % the element of List at index position
% nth is true if Elem is the Index th element of List

%% stopping condition as we are entering an empty list
%% so we wil stop.

nth(0, [FirstElement | RestOfList], FirstElement).
nth(N, [_ | RestOfList], Elem) :-
	N > 0,
	M is N-1,
	nth(M, RestOfList, Elem).


Added factorial in Prolog.

Added factorial in Prolog.

factorial(0, 1).
factorial(1, 1).

factorial(A, B) :-
    A > 1, C is A-1, factorial(C, Y), B is A * Y.

error: pathspec 'Factorial/Prolog/jcla1/factorial.prolog' did not match any file(s) known to git


Added Sudoku solver in Prolog, from 7l7w.

error: pathspec 'Sudoku/Prolog/jcla1/sudoku.prolog' did not match any file(s) known to git


Add test

Add test

error: pathspec 'Test.prolog' did not match any file(s) known to git


modified:   ex1.prolog

modified:   ex1.prolog

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/KevinHivert/Analyseur-Prolog.git/'


ajout arbres 3 branches

ajout arbres 3 branches


added mergesort in prolog

added mergesort in prolog

first([H|_], H).

split(A, B, C) :-
    append(B, C, A), length(B, L1), length(C, L2), L1 = L2.
split(A, B, C) :-
    append(B, C, A), length(B, L1), length(C, L2), L3 is L2+1, L1 = L3.

merge([], R, R).
merge(L, [], L).

merge([L1|L2], R, B) :-
    first(R, R1), L1 =< R1, merge(L2, R, C), append([L1], C, B).
merge(L, [R1|R2], B) :-
    first(L, L1), R1 < L1, merge(R2, L, C), append([R1], C, B).

mergesort([H|[]], [H]).

mergesort(A, B) :-
    length(A, Len), Len > 1,
    split(A, L, R),
    mergesort(L, SL), mergesort(R, SR),
    merge(SL, SR, B).

error: pathspec 'Merge_Sort/Prolog/jcla1_mergesort.prolog' did not match any file(s) known to git


can infer inherited types

can infer inherited types

error: pathspec 'Assignment' did not match any file(s) known to git
error: pathspec '4/typecheck.prolog' did not match any file(s) known to git


personnes

personnes


Bientôt torcher la partie 2

Bientôt torcher la partie 2

fatal: unable to access 'https://github.com/KevinHivert/Analyseur-Prolog.git/': The requested URL returned error: 403


pre merge	modified:   ex1.prolog

pre merge	modified:   ex1.prolog


retest

retest

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/josd/etc.git/'


Wolf, sheep, and cabbage problem

Wolf, sheep, and cabbage problem

fatal: unable to access 'https://github.com/YauHsien/puzzles.git/': The requested URL returned error: 403


ready for submission

ready for submission


nice-io added

nice-io added

/** Format-less I/O for Prolog (nice-io.prolog)

  This file includes a series of predicates, so that you can
  read and write without worring about the full-stop thing
  (presumes that the keyboard is buffered). Won't work with
  Arity Prolog.

  @author "AresAndy"
  @license BSD

  ## Legend ##
  EOL = End Of Line
  *aux = auxiliary (for instance used for tail recursion)
*/

:- module(nice-io, [read_str/1,
		    read_atom/1,
		    read_num/1,
                    write_str/1]).

% =========================
% read_str and read_str_aux
%
% Reads a string until an EOL is reached.
% read_str_aux is an auxiliary predicate, shouldn't be used
% on its own.

read_str_aux(-1, []) :- !. % invalid char
read_str_aux(10, []) :- !. % UNIX EOL
read_str_aux(13, []) :- !. % M$ EOL
read_str_aux(Char, [Char|Rest]) :- read_str(Rest).

read_str(String) :-
	get0(Char),
	read_str_aux(Char,String).

% =========================
% read_atom
%
% Reads a string and converts it into an atom.
% Not quite fault-tollerant (bad atom syntax might fail on this
% one).

read_atom(Atom) :-
	read_str(String),
	name(Atom, String).

% =========================
% read_num
%
% Reads a string and converts it into a number.
% Not quite fault-tollerant (bad number syntax might fail on this
% one).

read_num(Num) :-
	read_str(String),
	name(Num, String).

% =========================
% write_str
%
% I believe this one is self-explanatory.

write_str([]).
write_str([Char|Rest]) :-
	put(Char),
	write_str(Rest).

error: pathspec 'nice-io.prolog' did not match any file(s) known to git


Added fibonacci in Prolog.

Added fibonacci in Prolog.

error: pathspec 'Fibonacci_series/Prolog/jcla1/fibonacci.prolog' did not match any file(s) known to git


add some sample predicates that can be imported from Pg

:- module(example, [bar/2, baz/2, prolog_length/2]).

bar(X, Z) :-
        Z is X * 2 .

baz(_, 'bingo!').

break_chars(String, Char) :-
        atom_chars(String, Chars),
        member(Char, Chars).

prolog_length(X, L) :-
        atom_chars(X, A),
        length(A, L).

error: pathspec 'example.prolog' did not match any file(s) known to git


geometry (if we might say so :D) added

geometry (if we might say so :D) added

/** 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).

error: pathspec 'geometry.prolog' did not match any file(s) known to git


Verif des groupes verbaux

Verif des groupes verbaux


much better inference

much better inference