/****************************************************************
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).