;********************** LA MAQUINA DE TURING *************************** (LOAD WINDOWS) (LOAD ADD2.MT) (SETQ PROG 'ADD2.MT) (DEFUN INICIALIZA() (SETQ MT_PROG FUNCION_DE_TRANSICION) (SETQ MT_ENTRADA ENTRADA) (SETQ MT_INICIAL ESTADO_INICIAL) ;VERIFICAR QUE LA POSICION INICIAL DE LA CINTA ES VALIDA: (COND ((< POSICION_INICIAL_CINTA 0) (SETQ MT_POS 0)) ((>= POSICION_INICIAL_CINTA (LENGTH MT_ENTRADA)) (SETQ MT_POS (- (LENGTH MT_ENTRADA) 1))) (T(SETQ MT_POS POSICION_INICIAL_CINTA)) ) (SETQ MT_SIMBS SIMBOLOS) (SETQ EDO_ANT '()) (SETQ ACCION_ANT '()) (SETQ COMENTARIO '()) (SETQ MT_STEP 1) (FIJA_ENT) ) (DEFUN FIJA_ENT() ;ref_ent = en cual cuadro de la cinta inicia la muestra 1..19 ;inicio_ent = desde cual puede mostrar 0..((length mt_entrada) - 1) (SETQ REF_ENT (- 8 MT_POS)) (COND ((>= REF_ENT 1) (SETQ INICIO_ENT 0)) (T ((SETQ INICIO_ENT (- MT_POS 7)) (SETQ REF_ENT 1))) ) ) (INICIALIZA) (SETQ *INIT-WINDOW* "maq_turing") (SETQ DRIVER 'WINDOWS) (BORDER-COLOR 3) (DEFUN "maq_turing" (COMMAND (EVAL MT_STEP) (EVAL MT_INICIAL) (EVAL MT_POS) (EVAL MT_ENTRADA)) ((EQ COMMAND 'CREATE-WINDOW) (LIST "maq_turing" MT_STEP MT_INICIAL MT_POS MT_ENTRADA) ) ((EQ COMMAND 'CLOSE-WINDOW)) (MENSAJE) (UNWIND-PROTECT (PROGN ((EQ COMMAND 'UPDATE-WINDOW) (SETQ *INITIAL-POSITION*)) (PARAMETROS) (LOOP (EXECUTE-OPTION 'COMANDOS *MT-OPTIONS*)) ) ) ) (SETQ *MT-OPTIONS* '( ("Parametros " "ESTABLECER (ESC=menu principal)" ( ("Edo_inicial " . SET-MT-INICIAL) ("Pos_cinta " . SET-MT-POS) ("Cinta (entrada) " . SET-MT-ENTRADA) ("Reinicializar" . REINICIALIZA) )) ("Step" . SET-STEP) ("Correr" . MT1) ("Ejemplos" "EJEMPLOS A ELEGIR"( ("Dup (s0,s1,s2)" . SET-DUP) ("Suma (s0,s1,s2)" . SET-SUMA) ("Resta (s0,s1)" . SET-RESTA) ("Add2 (s0,s1)" . SET-ADD2))) ("Load" . LOAD_ARCH) ("Opciones" OPCIONES ( ("Color" . SET-COLOR) ("Dos" . GO-DOS) )) ("Quit" . EXIT))) (DEFUN EXIT() ;(BORDER-COLOR 0) (QUIT-PROGRAM) ) (DEFUN REINICIALIZA() (INICIALIZA) (PARAMETROS) ) (DEFUN PARAMETROS() (CURRENT-WINDOW) (CLEAR-SCREEN) (SETQ MAX_ANT 0) (CURRENT-WINDOW) (SET-CURSOR 1 60) (WRITE-STRING "PROG: ") (SET-CURSOR 1 66) (PRINC PROG) (ENCABEZADOS) (VALORES) ) (DEFUN ENCABEZADOS() (CURRENT-WINDOW) (FOREGROUND-COLOR 7) (SET-CURSOR 4 3) (WRITE-STRING " ESTADO ACTUAL: ") (SET-CURSOR 6 3) (WRITE-STRING " SIMBOLO APUNTADO: ") (SET-CURSOR 8 3) (WRITE-STRING " POS. RELATIVA: ") (SET-CURSOR 9 3) (WRITE-STRING " EN CINTA ") (SET-CURSOR 10 28) (WRITE-STRING " C I N T A : ") (SET-CURSOR 13 2) (WRITE-STRING "==========================================================================") (SET-CURSOR 15 2) (WRITE-STRING "==========================================================================") (SET-CURSOR 14 3) (WRITE-STRING "| | | | | | | | | | | | | | | | | | |") (SET-CURSOR 4 27) (WRITE-STRING " REALIZO: ") (SET-CURSOR 6 27) (WRITE-STRING " COMENTARIO: ") (SET-CURSOR 4 60) (WRITE-STRING " POSIBLES SIG. ") (FOREGROUND-COLOR 15) (BACKGROUND-COLOR 0) ) (DEFUN VALORES() (CURRENT-WINDOW) (SET-CURSOR 4 22) (PRINC MT_INICIAL) (WRITE-STRING " ") (SET-CURSOR 6 22) (PRINC (TRAE_SIMB)) (WRITE-STRING " ") (SET-CURSOR 8 22) (PRINC MT_POS) (WRITE-STRING " ") (SET-CURSOR 4 40) (COND ((EQUAL EDO_ANT NIL) (WRITE-STRING " ")) (T( (PRINC EDO_ANT) (WRITE-STRING " -> "))) ) (SET-CURSOR 4 51) (COND ((EQUAL ACCION_ANT NIL) ;el programa termino ((WRITE-STRING " ") ;(SETQ MT_ENTRADA (SIMP_CINTA MT_ENTRADA MAGT 0)) (COND ((>= MT_POS (LENGTH MT_ENTRADA)) (SETQ MT_POS (- (LENGTH MT_ENTRADA) 1))))) ) (T (PRINC ACCION_ANT)) ) (SET-CURSOR 6 40) (COND ((EQUAL COMENTARIO NIL) (WRITE-STRING " ")) (T( (PRINC COMENTARIO) (WRITE-STRING " ") )) ) (POSIBLES MT_INICIAL MT_PROG 0) (MUESTRA_ENT 1) ) (DEFUN MT1() (MT MT_STEP) (COND ((EQ MT_FIN 0) ((PROMPT-YN "continuar (S/N)? ") (MT1) ) ) ) ) (DEFUN MT(MT_STEP) (COND ((OR (> MT_STEP 3) (EQ MT_STEP -1)) ((SHOW-PROMPT "Presiona una tecla para abortar") ( ((LISTEN T) (CLEAR-INPUT T) ((PROMPT-YN "Abortar ejecucion? (Y/N)? ") ((THROW 'SWITCH-SCREEN) (EXECUTE-OPTION 'COMANDOS *MT-OPTIONS*) ) ) (SHOW-PROMPT "Presiona una tecla para abortar")) ) ) ) ) (COND ((OR (EQ MT_STEP -1) ( > MT_STEP 0) ) (BUSCA (LIST MT_INICIAL (TRAE_SIMB)) MT_PROG MT_STEP)) (T( (SETQ COMENTARIO 'Ok...continuar) (VALORES) (SETQ MT_FIN 0) ) ) ) ) (DEFUN TRAE_SIMB() (NTH MT_POS MT_ENTRADA) ) (DEFUN BUSCA (EDO_ACTUAL MT_PROG_AUX MT_STEP) (SETQ EDO_ANT EDO_ACTUAL) (COND ((NULL MT_PROG_AUX) ((SETQ COMENTARIO 'Indefinido...FIN) (SETQ ACCION_ANT '()) (VALORES) (SETQ MT_FIN 1)) ) ((EQUAL EDO_ACTUAL (CAAR MT_PROG_AUX)) (ACCION (SECOND (CAR MT_PROG_AUX)) MT_STEP) ) (T (BUSCA EDO_ACTUAL (CDR MT_PROG_AUX) MT_STEP)) ) ) (DEFUN ACCION (EDO_NUEVO MT_STEP) ;Inicia escribir simbolo (COND ((EQ (- (LENGTH MT_ENTRADA) 1) MT_POS) (INSERT_NTH B MT_ENTRADA (+ MT_POS 1)) ) ) (INSERT_NTH (FIRST EDO_NUEVO) (DELETE_NTH MT_ENTRADA MT_POS) MT_POS ) (COND ((AND (EQ (+ REF_ENT (- (LENGTH MT_ENTRADA) INICIO_ENT)) 20) (> MT_POS 1)) (SETQ REF_ENT (- REF_ENT 1)) ;desp izq ) ) (COND ((EQ REF_ENT 0) ((SETQ REF_ENT 1) (SETQ INICIO_ENT (+ INICIO_ENT 1))) ) ) (COND ((EQ MT_POS 0) (SETQ MT_POS 1) (NTH MT_POS (INSERT_NTH B MT_ENTRADA 0)) (SETQ REF_ENT (- REF_ENT 1)) (COND ((EQ REF_ENT 0) (SETQ REF_ENT 1) ) ) ) ) ;Termina escribir simbolo ;Inicia realizar movimiento (R, L o' S) (COND ((EQ R (SECOND EDO_NUEVO)) ( (SETQ MT_POS (+ MT_POS 1)) (COND ((EQ MT_POS (LENGTH MT_ENTRADA)) (NTH MT_POS (INSERT_NTH B MT_ENTRADA MT_POS))) ) (COND ((EQ (+ REF_ENT (- MT_POS INICIO_ENT)) 19) ;si esta en extremo der ; (+ ref_ent (eq (- mt_pos inicio_ent)) 19) ;y es right desplazar a la izq. (SETQ REF_ENT (- REF_ENT 1)) (COND ((EQ REF_ENT 0) ((SETQ REF_ENT 1) (SETQ INICIO_ENT (+ INICIO_ENT 1)))) ) ) ) (COND ((AND (EQ REF_ENT 1) (EQ (- MT_POS INICIO_ENT) 18)) ;mostrando desde extremo izq (ref_ent=1) y ;estando en extremo der (eq (- mt_pos inicio_ent) 18) ;esconder un simbolo (desplaz a la izq) (SETQ INICIO_ENT (+ INICIO_ENT 1)) ) ) )) ((EQ L (SECOND EDO_NUEVO)) ( (SETQ MT_POS (- MT_POS 1)) (COND ((EQ MT_POS -1) (SETQ MT_POS 0) (NTH MT_POS (INSERT_NTH B MT_ENTRADA MT_POS)) (SETQ REF_ENT (- REF_ENT 1)) ;desp izq (COND ((EQ REF_ENT 0) (SETQ REF_ENT 1))) ) ) (COND ((AND (EQ (+ REF_ENT (- (LENGTH MT_ENTRADA) INICIO_ENT)) 20) (> REF_ENT 2)) (SETQ REF_ENT (- REF_ENT 1)) ;desp izq ) ) (COND ((AND (EQ REF_ENT 1) (> INICIO_ENT 0) (EQ (- MT_POS INICIO_ENT) -1)) ;en extremo izq (ref_ent=1) and (eq (- mt_pos inicio_ent) -1) ;y tenemos entrada escondida (inicio_ent > 0) hay que sacar ;un simbolo (desplaz a la derecha) (SETQ INICIO_ENT (- INICIO_ENT 1)) ) ) )) ;Si es 'S' no se mueve ) ;Termina realizar movimiento (SETQ ACCION_ANT EDO_NUEVO) (VALORES) (SETQ MT_INICIAL (THIRD EDO_NUEVO)) (COND ((NEQ MT_STEP -1) (MT (- MT_STEP 1))) (T(MT MT_STEP)) ;mt_step=-1, no modificarlo ) ) (DEFUN MUESTRA_ENT(INICIO_PANT) (COND ((EQ INICIO_PANT 19)) ;SOLO DE 1 A 18 (T ( (SET-CURSOR 16 (+ (* INICIO_PANT 4) 1)) (COND ((EQ (+ REF_ENT (- MT_POS INICIO_ENT)) INICIO_PANT) ((FOREGROUND-COLOR 10) (BACKGROUND-COLOR (SIXTH *WINDOW-COLORS*)) (WRITE-STRING "^") (FOREGROUND-COLOR 4) (BACKGROUND-COLOR 3) (SET-CURSOR 17 (- (* INICIO_PANT 4) 1) ) (WRITE-STRING " ") (SET-CURSOR 17 (- (* INICIO_PANT 4) 0) ) (PRINC MT_INICIAL) ) ) (T( (FOREGROUND-COLOR 0) (BACKGROUND-COLOR (SIXTH *WINDOW-COLORS*)) (WRITE-STRING " ") (SET-CURSOR 17 (* INICIO_PANT 4) ) (WRITE-STRING " ") (FOREGROUND-COLOR 15) (BACKGROUND-COLOR 3) ) ) ) (SET-CURSOR 14 (* INICIO_PANT 4)) (WRITE-STRING " ") (COND ((NEQ (NTH (+ INICIO_ENT (- INICIO_PANT REF_ENT)) MT_ENTRADA) NIL) (PRINC (NTH (+ INICIO_ENT (- INICIO_PANT REF_ENT)) MT_ENTRADA) ) ) (T( (FOREGROUND-COLOR 7) (BACKGROUND-COLOR 3) (WRITE-STRING "B") )) ) (WRITE-STRING " ") (MUESTRA_ENT (+ INICIO_PANT 1)) ) ) ) ) (DEFUN POSIBLES (EDO_ACTUAL MT_PROG_AUX INICIAL) (COND ((NULL MT_PROG_AUX) ((LIMPIAR_POSIBLES INICIAL MAX_ANT) (SETQ MAX_ANT INICIAL) ) ) ((EQUAL EDO_ACTUAL (CAAAR MT_PROG_AUX)) ((SET-CURSOR (+ 6 INICIAL) 60) (PRINC (CAR MT_PROG_AUX)) (WRITE-STRING " ") (POSIBLES EDO_ACTUAL (CDR MT_PROG_AUX) (+ INICIAL 1)) ) ) (T (POSIBLES EDO_ACTUAL (CDR MT_PROG_AUX) INICIAL)) ) ) (DEFUN LIMPIAR_POSIBLES (INICIAL MAX_ANT) (COND ((>= INICIAL MAX_ANT) ) (T( (SET-CURSOR (+ 6 INICIAL) 60) (WRITE-STRING " ") (LIMPIAR_POSIBLES (+ INICIAL 1) MAX_ANT) )) ) ) (DEFUN INSERT_NTH (ELEM L POS) (SETQ MT_ENTRADA (MI_INSERT ELEM L POS 0)) ) (DEFUN MI_INSERT(ELEM L POS CTA_POS) (COND ( (EQ POS CTA_POS) (CONS ELEM (MI_INSERT ELEM L POS (+ CTA_POS 1)))) ( (NULL L) L) (T (CONS (CAR L) (MI_INSERT ELEM (CDR L) POS (+ CTA_POS 1)))) ) ) (DEFUN DELETE_NTH (L POS) (SETQ MT_ENTRADA (MI_DELETE L POS 0)) ) (DEFUN MI_DELETE(L POS CTA_POS) (COND ( (NULL L) L) ( (EQ POS CTA_POS) (MI_DELETE (CDR L) POS (+ CTA_POS 1))) (T (CONS (CAR L) (MI_DELETE (CDR L) POS (+ CTA_POS 1)))) ) ) (DEFUN SIMP_CINTA (ENT SIMB_ANT CTA_SIMP) ;hace '(b b b 1 1 b b) -> '(b 1 1 b) (COND ( (NULL ENT) ENT) ( (AND (NULL (CDR ENT)) (< CTA_SIMP 2)) ;si es el ultimo y cta<2 pegalo (CONS (CAR ENT) (SIMP_CINTA (CDR ENT) (CAR ENT) (+ CTA_SIMP 1)))) ((AND (EQ (CAR ENT) B) (EQ SIMB_ANT B) ) ;si simb_ant=simb_actual=b saltalo (SIMP_CINTA (CDR ENT) SIMB_ANT CTA_SIMP)) (T (CONS (CAR ENT) (SIMP_CINTA (CDR ENT) (CAR ENT) (+ CTA_SIMP 1))) ) ) ) (DEFUN SET-STEP (STEP) (RPLACA (CAR LET-STEP) MT_STEP) (LOOP ((NOT (MODE-QUERY 'STEP LET-STEP)) NIL) (SETQ STEP (PARSE-INTEGER (CAAR LET-STEP))) ((AND STEP (<= -1 STEP 99)) (SETQ MT_STEP STEP *INITIAL-POSITION*) T ) (ERROR-BEEP) ) ) (SETQ LET-STEP '( ("" 0 0 "Dame el step para ejecucion (-1 => continuo)" " " 3) )) (DEFUN SET-MT-INICIAL (INICIAL) (RPLACA (CAR LET-INICIAL) MT_INICIAL) (LOOP ((NOT (MODE-QUERY 'INICIAL LET-INICIAL)) NIL) (SETQ INICIAL (CAAR LET-INICIAL)) ( (<= (LENGTH INICIAL) 4) (SETQ AUX1 INICIAL) (SETQ AUX AUX1) (SETQ MT_INICIAL AUX) T ) (ERROR-BEEP) ) (PARAMETROS) ) (SETQ LET-INICIAL '( ("" 0 0 "Dame el estado inicial" " " 6) )) (DEFUN SET-MT-POS (POSICION) (RPLACA (CAR LET-POS) MT_POS) (LOOP ((NOT (MODE-QUERY 'POSICION LET-POS)) NIL) (SETQ POSICION (PARSE-INTEGER (CAAR LET-POS))) ((AND POSICION (<= 0 POSICION (- (LENGTH MT_ENTRADA) 1))) (SETQ MT_POS POSICION *INITIAL-POSITION*) T ) (ERROR-BEEP) ) (FIJA_ENT) (PARAMETROS) ) (SETQ LET-POS '( ("" 0 0 "Dame posicion inicial en cinta [0 -> ((length cinta) - 1)]" " " 3) )) (DEFUN LOAD_ARCH (ARCH_ENT) (SETQ COMMAND "DIR *.MT /B /A:-D /O /P") (CURRENT-WINDOW) (CLEAR-SCREEN) (SET-CURSOR 1 20) (WRITE-STRING " LISTA DE ARCHIVOS MT PARA ELEGIR ") (SET-CURSOR 3 0) (EXECUTE (GETSET 'COMSPEC) (PACK* "/C " COMMAND)) (LOOP ((NOT (MODE-QUERY 'ARCH LET-ARCH)) NIL) (SETQ ARCH_ENT (CAAR LET-ARCH)) ( (<= (LENGTH ARCH_ENT) 11) (SETQ PROG ARCH_ENT) (LOAD ARCH_ENT) (INICIALIZA) T ) (ERROR-BEEP) ) (THROW 'SWITCH-SCREEN) ) (SETQ LET-ARCH '( ("" 0 0 "Dame el archivo a cargar (Con extension)" " " 12) )) (DEFUN SET-DUP() (LOAD DUP.MT) (SETQ PROG 'DUP.MT) (INICIALIZA) (PARAMETROS) ) (DEFUN SET-SUMA() (LOAD SUMA.MT) (SETQ PROG 'SUMA.MT) (INICIALIZA) (PARAMETROS) ) (DEFUN SET-RESTA() (LOAD RESTA.MT) (SETQ PROG 'RESTA.MT) (INICIALIZA) (PARAMETROS) ) (DEFUN SET-ADD2() (LOAD ADD2.MT) (SETQ PROG 'ADD2.MT) (INICIALIZA) (PARAMETROS) ) (DEFUN SET-MT-ENTRADA () (MODE-QUERY1 'ENTRADA "EJ: (b 1 1 b)<enter>" ) (PARAMETROS) ) (DEFUN MENSAJE () (SET-CURSOR 0 17) (BACKGROUND-COLOR 1) (WRITE-STRING " SIMULADOR DE LA MAQUINA DE TURING v1.1 ") (SET-CURSOR 0 65) (WRITE-STRING " by magt ") (CLEAR-STATUS "maq_turing") (WRITE-STRING "FACULTAD DE ING. ELECTRICA U.M.S.N.H. Junio/95") ) (PROGN (WRITE-LINE "Presiona la tecla ESC para iniciar ") T)