home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / b / binprolog / !BinPro330 / progs / fknight < prev    next >
Encoding:
Text File  |  1994-12-21  |  1.1 KB  |  67 lines

  1. p:-compile('fknight.pl').
  2.  
  3. /* 
  4.    adapted by Paul Tarau from (partial) KnightTour benchmark originally
  5.    written by Evan Tick 
  6. */
  7.  
  8. go:-go(5).
  9.  
  10. go(N):-
  11.     time(_),
  12.     make_board(N,Board,NbMoves),
  13.     knight(NbMoves,1,1,N,Board),!,
  14.     time(T),
  15.     write(time=T),nl,statistics,show(N,Board).
  16.  
  17. make_board(N,Board,M):-
  18.     M is N*N,
  19.     functor(Line,line,N),
  20.     findall(Line,range(_,1,N),LBoard),
  21.     Board=..[board|LBoard].
  22.  
  23. val(I,J,Val,N,Board):-
  24.     I>0,I=<N,J>0,J=<N,
  25.     arg(I,Board,Line),
  26.     arg(J,Line,Val).
  27.  
  28. knight(0,_,_,_,_) :- !.
  29. knight(K,A,B,N,Board) :-
  30.         K1 is K-1,
  31.         val(A,B,K,N,Board),
  32.         move(Dx,Dy),
  33.         step(K1,A,B,Dx,Dy,N,Board).
  34.  
  35. step(K1,A,B,Dx,Dy,N,Board):-
  36.     C is A + Dx,
  37.     D is B + Dy,
  38.     knight(K1,C,D,N,Board).
  39.  
  40. range(Min,Min,Max):-Min=<Max.
  41. range(I,Min,Max):-
  42.         Min<Max,
  43.         Min1 is Min+1,
  44.         range(I,Min1,Max).
  45.  
  46. show(N,Board):-
  47.     range(I,1,N),
  48.         range(J,1,N),
  49.             val(I,J,V,N,Board),
  50.             write(' '),X is 1-V//10,tab(X),write(V),
  51.             (J=N->nl;true),
  52.     fail.
  53. show(_,_):-nl.
  54.  
  55. move( 2, 1).
  56. move( 2,-1).
  57. move(-2, 1).
  58. move(-2,-1).
  59. move( 1, 2).
  60. move(-1, 2).
  61. move( 1,-2).
  62. move(-1,-2).
  63.  
  64.  
  65. time(T) :- statistics(runtime,[_,T]).
  66.  
  67.