main :-
	statistics(runtime, _),
	knight5_all,
	statistics(runtime, [_,T]),
	write('CPU time = '), write(T), write(' msec'), nl.

knight5_all :-
	knight5(Tour),
%	write(Tour), nl,
	fail.
knight5_all.	

knight5(Tour) :-
	Vs = [(1,1), (1,2), (1,3), (1,4), (1,5),
	      (2,1), (2,2), (2,3), (2,4), (2,5),
	      (3,1), (3,2), (3,3), (3,4), (3,5),
	      (4,1), (4,2), (4,3), (4,4), (4,5),
	      (5,1), (5,2), (5,3), (5,4), (5,5) ],
	tour(Vs, Tour).

tour(Vs0, Tour) :-
	select((1,1), Vs0, Vs),
	tour(1, 1, Vs, Tour).

tour(I, J, [], [(I,J)]).
tour(I, J, Vs0, [(I,J)|Tour]) :-
	next(I, J, I1, J1),
	select((I1,J1), Vs0, Vs),
	tour(I1, J1, Vs, Tour).

next(I, J, I1, J1) :- I1 is I-2, J1 is J-1.
next(I, J, I1, J1) :- I1 is I-2, J1 is J+1.
next(I, J, I1, J1) :- I1 is I-1, J1 is J-2.
next(I, J, I1, J1) :- I1 is I-1, J1 is J+2.
next(I, J, I1, J1) :- I1 is I+1, J1 is J-2.
next(I, J, I1, J1) :- I1 is I+1, J1 is J+2.
next(I, J, I1, J1) :- I1 is I+2, J1 is J-1.
next(I, J, I1, J1) :- I1 is I+2, J1 is J+1.

select(X, [X|Zs], Zs).
select(X, [Y|Ys], [Y|Zs]) :- select(X, Ys, Zs).

