home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l217 / 2.ddi / PROGRAMS / HANOI.PRO < prev    next >
Encoding:
Prolog Source  |  1990-03-26  |  3.3 KB  |  124 lines

  1.   /****************************************************************/
  2.   /*            TOWERS OF HANOI                  */
  3.   /*            ===============                  */
  4.   /*                                  */
  5.   /* Call the predicate hanoi with the number of discs, you want. */
  6.   /****************************************************************/
  7. DOMAINS
  8.   TIME, ROW, COL, NUMBER = INTEGER
  9.  
  10. PREDICATES
  11.   hanoi( NUMBER )
  12.   move(  NUMBER, NUMBER, ROW, ROW, ROW, COL, COL, COL )
  13.   inform(  NUMBER, NUMBER, ROW, ROW, COL, COL )
  14.   makepole( NUMBER, NUMBER, COL)
  15.   move_vert(COL,NUMBER,ROW,ROW)
  16.   move_horizon(ROW,NUMBER,COL,COL)
  17.   keyact(CHAR)
  18.   gendelay
  19.   showdelay
  20.   nondeterm for(INTEGER,INTEGER,INTEGER)
  21.   fill
  22.  
  23. DATABASE
  24.   determ delay(INTEGER)
  25.  
  26. CLAUSES
  27.   for(X,X,_).
  28.   for(I,A,B):-B>A,A1=A+1,for(I,A1,B).
  29.  
  30.   fill:- % fill current window.
  31.     makewindow(_,_,_,_,_,_,ROWS,COLS),
  32.     RR=ROWS-1, CC=COLS-1,
  33.     for(COL,0,CC),for(ROW,0,RR),
  34.     scr_char(ROW,COL,'░'),
  35.     fail.
  36.   fill.
  37.  
  38.   gendelay :- inkey(CH), keyact(CH),showdelay,!.
  39.   gendelay :- delay(DELAY),!, sleep(DELAY).
  40.   gendelay.
  41.  
  42.   keyact('+'):-
  43.     retract(delay(VAL)),VAL1=VAL+1,
  44.     VAL1<=1000,!,assert(delay(VAL1)).
  45.   keyact('+'):-!,assert(delay(1000)).
  46.   keyact('-'):-
  47.     retract(delay(VAL)),VAL1=VAL-1-VAL div 10,
  48.     VAL1>=0,!,assert(delay(VAL1)).
  49.   keyact('-'):-!,assert(delay(0)).
  50.   keyact(_):-retractall(delay(_)),assert(delay(0)).
  51.  
  52.   
  53.   showdelay:-
  54.     delay(DELAY),gotowindow(2),
  55.     clearwindow,
  56.     write("Delay= ",DELAY),gotowindow(1).
  57.  
  58.   hanoi(N) :-   
  59.       N<=13,!,
  60.     textmode(ROWS,COLS),
  61.     makewindow(4,7,0,"",0,0,ROWS,COLS),
  62.     fill,
  63.     ROWS1=ROWS-1,
  64.     makewindow(3,40,0,"",ROWS1,0,1,COLS),
  65.     write("   + Improve delay,      - Lower delay,       Other keys removes delay"),
  66.     VB=2+6*N,VH=3+N,CV=N, CM=3*N, CH=5*N,
  67.       STCOL=(79-6*N) div 2, STROW=(25-VH) div 2 -1,
  68.     STROW1=STROW+1+VH,
  69.     makewindow(2,74,0,"DELAY",STROW1,34,1,13),
  70.     makewindow(1,7,52,"Hanoi",STROW,STCOL,VH,VB),
  71.     retractall(delay(_)),
  72.     makepole(N,N,CV),
  73.     assert(delay(10)),
  74.     showdelay,
  75.     move(N,N,0,0,0,CV,CM,CH),
  76.     cursor(0,0), write("Press any key"),readchar(_).
  77.  
  78.   hanoi(_):- write("maximum 13 disc's\n").
  79.  
  80.   move(H,1,HA,_,HC,CA,_,CH):-!,inform(H,1,HA,HC,CA,CH).
  81.   move(H,N,HA,HB,HC,CA,CB,CC):-
  82.         N1=N-1,
  83.         HA1=HA+1,
  84.         move(H,N1,HA1,HC,HB,CA,CC,CB),
  85.         inform(H,N,HA,HC,CA,CC),
  86.         HC1=HC+1,
  87.         move(H,N1,HB,HA,HC1,CB,CA,CC).
  88.  
  89.  inform( H, N, H1, H2, C1, C2 ) :-
  90.     C11=C1-N, C22=C2-N, NN=2*N,
  91.     H11=H-H1, H22=H-H2,
  92.     move_vert(C11,NN,H11,1),
  93.     move_horizon(1,NN,C11,C22),
  94.     move_vert(C22,NN,1,H22).
  95.  
  96.   makepole(_,0,_):-!.
  97.   makepole(H,N,C):-HH=H-N,inform(H,N,HH,HH,C,C), N1=N-1, makepole(H,N1,C).
  98.  
  99.   move_vert(_,_,H,H):-!.
  100.   move_vert(COL,SIZE,H1,H2):-H1<H2,!, /* move up */
  101.     H11=H1+1,
  102.     field_attr(H11,COL,SIZE,112),
  103.     field_attr(H1,COL,SIZE,7),gendelay,
  104.     move_vert(COL,SIZE,H11,H2).
  105.   move_vert(COL,SIZE,H1,H2):-H1>H2,!, /* move down */
  106.     H11=H1-1,
  107.     field_attr(H11,COL,SIZE,112),
  108.     field_attr(H1,COL,SIZE,7),gendelay,
  109.     move_vert(COL,SIZE,H11,H2).
  110.  
  111.   move_horizon(_,_,H,H):-!.
  112.   move_horizon(ROW,SIZE,C1,C2):-C1<C2,!, /* move right */
  113.     C11=C1+1, HH=C1+SIZE,
  114.     field_attr(ROW,HH,1,112),
  115.     field_attr(ROW,C1,1,7),gendelay,
  116.     move_horizon(ROW,SIZE,C11,C2).
  117.   move_horizon(ROW,SIZE,C1,C2):-C1>C2,!, /* move left */
  118.     C11=C1-1, HH=C11+SIZE,
  119.     field_attr(ROW,C11,1,112),
  120.     field_attr(ROW,HH,1,7),gendelay,
  121.     move_horizon(ROW,SIZE,C11,C2).
  122.  
  123. GOAL    hanoi(10).
  124.