/*%%%% SKAKANI KONEM (pouziva soubor qsortspe.pro) */ :-([qsortspe]). go(X,Y) :-skoky([X/Y],63). skoky([_/_|Z],0) :-write(Z). skoky([X/Y|Z],J) :- findall(X1/Y1,gen(X1,Y1,X,Y,Z),L), min(L,XM,YM,Z), [X/Y|Z]=Z1, I is J-1, skoky([XM/YM|Z1],I). gen(X1,Y1,X,Y,Z) :-((X1 is X+2,Y1 is Y+1,X1=<8,Y1=<8); (X1 is X+2,Y1 is Y-1,X1=<8,Y1>0); (X1 is X-2,Y1 is Y+1,X1>0,Y1=<8); (X1 is X-2,Y1 is Y-1,X1>0,Y1>0); (X1 is X+1,Y1 is Y+2,X1=<8,Y1=<8); (X1 is X-1,Y1 is Y+2,X1>0,Y1=<8); (X1 is X+1,Y1 is Y-2,X1=<8,Y1>0); (X1 is X-1,Y1 is Y-2,X1>0,Y1>0)), not(member(X1/Y1,Z)). min(L,XM,YM,Z) :- member(X/Y,L), findall(X1/Y1,gen(X1,Y1,X,Y,Z),L1), length(L1,N), asserta(uloz(X/Y/N)), fail. min(L,XM,YM,Z) :- sdruz([],M),!, qsort(M,M1), member(XM/YM/_,M1). sdruz(U,V) :- dalsi(X),!,sdruz([X|U],V). sdruz(U,U). dalsi(X/Y/N) :- retract(uloz(X/Y/N)),!. member(X,[X|_]). member(X,[_|Y]) :- member(X,Y). length([],0). length([H|T],X) :- length(T,Y), X is Y +1.