(* this program simulates the tower of hanoi problem. DO TO THE LIMITATIONS *) (* IMPOSED BY THE RISC MACHINE, THE RECURSIVE DEAPTH OF THE SOLUTION IS *) (* IS LIMITED. *) MODULE HANOI; CONST mindisk = 1; maxdisk = 26; terminate = -1; TYPE towertype = RECORD tower : ARRAY [ mindisk .. maxdisk] OF CHAR; top : INTEGER; END; (* RECORD *) VAR source,dest,aux : towertype; disk : INTEGER; counter : INTEGER; (* INITIALIZE *) PROCEDURE initialize(); BEGIN (* initialize *) source.top := mindisk - 1; dest.top := mindisk - 1; aux.top := mindisk - 1; END initialize; (* SETSOURCE *) PROCEDURE setsource(): INTEGER; VAR num : INTEGER; disk : INTEGER; BEGIN (* setsource *) READ(num); IF ( num > terminate ) THEN FOR disk := ORD('A') TO ORD("A") + num - 1 DO INC(source.top); source.tower[ source.top ] := CHR(disk); END; (* FOR *) END; (* IF *) RETURN(num); END setsource; (* MOVE *) PROCEDURE move( VAR source,dest : towertype ); BEGIN (* move *) INC(dest.top); dest.tower[ dest.top ] := source.tower[ source.top ]; DEC(source.top); END move; (* PRINT *) PROCEDURE print(); VAR index : INTEGER; BEGIN (* print *) WRITE("source -> "); FOR index := mindisk TO source.top DO WRITE(source.tower[index]); WRITE(" "); END; (* FOR *) WRITELN; WRITE("auxiliary -> "); FOR index := mindisk TO aux.top DO WRITE(aux.tower[index]); WRITE(" "); END; (* FOR *) WRITELN; WRITE("destination -> "); FOR index := mindisk TO dest.top DO WRITE(dest.tower[index]); WRITE(" "); END; (* FOR *) WRITELN; WRITELN; END print; (* TOWERS *) PROCEDURE TOWERS( disk : INTEGER; VAR source,dest,aux : towertype ); BEGIN (* TOWERS *) IF disk = 1 THEN move(source,dest); print(); ELSE TOWERS( disk - 1, source, aux, dest); move(source,dest); print(); TOWERS( disk - 1, aux, dest, source); END; (* IF *) END TOWERS; BEGIN (* HANOI *) counter := 0; REPEAT initialize(); disk := setsource(); IF (disk > terminate) THEN INC(counter); WRITELN; WRITE(" TOWERS OF HANOI TRACE : test number -> "); WRITE(counter); WRITELN; print(); TOWERS( disk, source, dest, aux); END; UNTIL (disk <= terminate); END HANOI.