/****************************************************************

Inteligencia Artificial

======================

Torres de Hanoi

this hanoi is slowed down

Llama al predicado hanoi con el n£mero de discos, t£ puedes

Ejemplo: Hanoi(6).

Gonzalo Villarreal Farah

Para Turbo Prolog 2.0 de la Borland

***************************************************************/

DOMAINS

TIEMPO, FILA, COLUMNA, NUMERO = INTEGER

PREDICATES

hanoi( NUMERO )

mueve( NUMERO, NUMERO, FILA, FILA, FILA, COLUMNA, COLUMNA, COLUMNA )

info( NUMERO, NUMERO, FILA, FILA, COLUMNA, COLUMNA )

marca( NUMERO, NUMERO, COLUMNA)

delay() dd(TIEMPO)

mueve_vert(COLUMNA,NUMERO,FILA,FILA)

mueve_horizon(FILA,NUMERO,COLUMNA,COLUMNA)

CLAUSES

delay :- dd(100).

dd(0):-!.

dd(N):-N1=N-1,dd(N1).

hanoi(N) :-

N<=13,!,

VB=2+6*N,VH=3+N,CV=N, CM=3*N, CH=5*N,

STCOLUMNA=(79-6*N)/2, STFILA=(25-VH)/2,

makewindow(1,7,7,"Hanoi",STFILA,STCOLUMNA,VH,VB),

marca(N,N,CV),

mueve(N,N,0,0,0,CV,CM,CH),

cursor(0,0), write("Presione cualquier tecla"),readchar(_).

hanoi(_):- write("maximo 13 discos's\n").

mueve(H,1,HA,_,HC,CA,_,CH):-!,info(H,1,HA,HC,CA,CH).

mueve(H,N,HA,HB,HC,CA,CB,CC):-

N1=N-1,

HA1=HA+1,

mueve(H,N1,HA1,HC,HB,CA,CC,CB),

info(H,N,HA,HC,CA,CC),

HC1=HC+1,

mueve(H,N1,HB,HA,HC1,CB,CA,CC).

info( H, N, H1, H2, C1, C2 ) :-

C11=C1-N, C22=C2-N, NN=2*N,

H11=H-H1, H22=H-H2,

mueve_vert(C11,NN,H11,1),

mueve_horizon(1,NN,C11,C22),

mueve_vert(C22,NN,1,H22).

 

marca(_,0,_):-!.

marca(H,N,C):-HH=H-N,info(H,N,HH,HH,C,C), N1=N-1, marca(H,N1,C).

 

mueve_vert(_,_,H,H):-!.

mueve_vert(COLUMNA,SIZE,H1,H2):-H1<H2,!, /* mueve arriba */

H11=H1+1,

field_attr(H11,COLUMNA,SIZE,112),

field_attr(H1,COLUMNA,SIZE,7),delay,delay,

mueve_vert(COLUMNA,SIZE,H11,H2).

mueve_vert(COLUMNA,SIZE,H1,H2):-H1>H2,!, /* mueve abajo */

H11=H1-1,

field_attr(H11,COLUMNA,SIZE,112),

field_attr(H1,COLUMNA,SIZE,7),delay,delay,

mueve_vert(COLUMNA,SIZE,H11,H2).

mueve_horizon(_,_,H,H):-!.

mueve_horizon(FILA,SIZE,C1,C2):-C1<C2,!, /* mueve derecha */

C11=C1+1, HH=C1+SIZE,

field_attr(FILA,HH,1,112),

field_attr(FILA,C1,1,7),delay,

mueve_horizon(FILA,SIZE,C11,C2).

mueve_horizon(FILA,SIZE,C1,C2):-C1>C2,!, /* mueve izquierda */

C11=C1-1, HH=C11+SIZE,

field_attr(FILA,C11,1,112),

field_attr(FILA,HH,1,7),delay,

mueve_horizon(FILA,SIZE,C11,C2).

goal

hanoi(6).