home *** CD-ROM | disk | FTP | other *** search
/ Programmer Plus 2007 / Programmer-Plus-2007.iso / Programming / Borland Plateform / Turbo Prolog 2 / HANOI.PRO < prev    next >
Encoding:
Prolog Source  |  1986-04-25  |  2.3 KB  |  82 lines

  1.   /****************************************************************/
  2.   /*            TOWERS OF HANOI                  */
  3.   /*            ===============                  */
  4.   /*           this hanoi is slowed down              */          
  5.   /* Call the predicate hanoi with the number of slices, you want.*/
  6.   /* Example:  Hanoi(6).                                          */
  7.   /****************************************************************/
  8. DOMAINS
  9.   TIME, ROW, COL, NUMBER = INTEGER
  10.  
  11. PREDICATES
  12.   hanoi( NUMBER )
  13.   move(  NUMBER, NUMBER, ROW, ROW, ROW, COL, COL, COL )
  14.   inform(  NUMBER, NUMBER, ROW, ROW, COL, COL )
  15.   makepole( NUMBER, NUMBER, COL)
  16.   delay()  dd(TIME)
  17.   move_vert(COL,NUMBER,ROW,ROW)
  18.   move_horizon(ROW,NUMBER,COL,COL)
  19.  
  20. CLAUSES
  21.   delay :- dd(100).
  22.   dd(0):-!.
  23.   dd(N):-N1=N-1,dd(N1).
  24.  
  25.   hanoi(N) :-   
  26.       N<=13,!,
  27.       VB=2+6*N,VH=3+N,CV=N, CM=3*N, CH=5*N,
  28.       STCOL=(79-6*N)/2, STROW=(25-VH)/2,
  29.     makewindow(1,7,7,"Hanoi",STROW,STCOL,VH,VB),
  30.     makepole(N,N,CV),
  31.     move(N,N,0,0,0,CV,CM,CH),
  32.     cursor(0,0), write("Press any key"),readchar(_).
  33.  
  34.   hanoi(_):- write("maximum 13 disc's\n").
  35.  
  36.   move(H,1,HA,_,HC,CA,_,CH):-!,inform(H,1,HA,HC,CA,CH).
  37.   move(H,N,HA,HB,HC,CA,CB,CC):-
  38.         N1=N-1,
  39.         HA1=HA+1,
  40.         move(H,N1,HA1,HC,HB,CA,CC,CB),
  41.         inform(H,N,HA,HC,CA,CC),
  42.         HC1=HC+1,
  43.         move(H,N1,HB,HA,HC1,CB,CA,CC).
  44.  
  45.  inform( H, N, H1, H2, C1, C2 ) :-
  46.     C11=C1-N, C22=C2-N, NN=2*N,
  47.     H11=H-H1, H22=H-H2,
  48.     move_vert(C11,NN,H11,1),
  49.     move_horizon(1,NN,C11,C22),
  50.     move_vert(C22,NN,1,H22).
  51.  
  52.  
  53.   makepole(_,0,_):-!.
  54.   makepole(H,N,C):-HH=H-N,inform(H,N,HH,HH,C,C), N1=N-1, makepole(H,N1,C).
  55.  
  56.  
  57.   move_vert(_,_,H,H):-!.
  58.   move_vert(COL,SIZE,H1,H2):-H1<H2,!, /* move up */
  59.     H11=H1+1,
  60.     field_attr(H11,COL,SIZE,112),
  61.     field_attr(H1,COL,SIZE,7),delay,delay,
  62.     move_vert(COL,SIZE,H11,H2).
  63.   move_vert(COL,SIZE,H1,H2):-H1>H2,!, /* move down */
  64.     H11=H1-1,
  65.     field_attr(H11,COL,SIZE,112),
  66.     field_attr(H1,COL,SIZE,7),delay,delay,
  67.     move_vert(COL,SIZE,H11,H2).
  68.  
  69.   move_horizon(_,_,H,H):-!.
  70.   move_horizon(ROW,SIZE,C1,C2):-C1<C2,!, /* move right */
  71.     C11=C1+1, HH=C1+SIZE,
  72.     field_attr(ROW,HH,1,112),
  73.     field_attr(ROW,C1,1,7),delay,
  74.     move_horizon(ROW,SIZE,C11,C2).
  75.   move_horizon(ROW,SIZE,C1,C2):-C1>C2,!, /* move left */
  76.     C11=C1-1, HH=C11+SIZE,
  77.     field_attr(ROW,C11,1,112),
  78.     field_attr(ROW,HH,1,7),delay,
  79.     move_horizon(ROW,SIZE,C11,C2).
  80.  
  81. goal
  82.   hanoi(6).