Máquina de Turing

Descripción del contenido de esta página

Programa para ZX Spectrum que simula el funcionamiento de una maquina de Turing.

Máquina de Turing fue uno de los primeros programas serios que escribí para la ZX Spectrum. Quizá no es la palabra adecuada, pues en cierta forma casi todos los programas son serios, casi todos tienen su complicación y su interés. Pero este siempre tuvo para mí algo especial.

Este programa imita el funcionamiento de una máquina de Turing, un dispositivo teórico descrito por el matemático y pionero de la informática Alan Turing, a quien también yo conocía entonces por su Test de Turing, citado a menudo en libros sobre inteligencia artificial e incluso en obras de ciencia ficción.

El origen de este programa

La idea y la inspiración me vinieron de un artículo en la enciclopedia Mi computer, cuyos fascículos por aquella época yo coleccionaba. El artículo estaba en las páginas 424 y 425, correspondientes al segundo volumen de la obra; se titulaba La cinta teórica, y fue mi única información para escribir el programa. Muestro a continuación el artículo, para quien quiera conocer cómo funciona una máquina de Turing.

Página 1: (598.88 KiB) Página 2: (428.31 KiB)

Las imágenes de las páginas con el artículo proceden del proyecto de digitalización de Mi computer iniciado por David Novo Iglesias.

Pantallazos

El menú del programa:

Menú

Quíntuplos creados, listados para su revisión:

Quíntuplos

La escritura de los datos en la cinta:

Cinta de datos

Fin de la ejecución:

Ejecución

Listado


  10 REM ***********************
  20 REM MAQUINA DE TURING
  30:
  40 REM Copyright (C) 1985,2010 Marcos Cruz
  50 REM http://programandala.net
  60 REM Licencia/Permesilo/License:
  70 REM http://programandala.net/licencia
  80:
  90 REM 1985-10-19 Primera version.
 100 REM 2010-03-13 Menu corregido. Creditos.
 110 REM ***********************
 120:
 130 REM GRAFICOS
 140 REM ********
 150:
 160 FOR N=0 TO 7
 170 POKE USR "A"+N,1
 180 POKE USR "B"+N,254
 190 NEXT N
 200:
 210 REM CONSTANTES
 220 REM **********
 230:
 240 LET LONG=100
 250 LET LINEA=20
 260 LET TABC=15
 270 LET TOPE=31
 280 LET GUIA=15
 290 LET RIGHT=1
 300 LET LEFT=-1
 310 LET NUMQ=20
 320 LET B$=""
 330 LET V$="                                "
 340:
 350 FOR N=1 TO TOPE
 360 LET B$=B$+CHR$ 144
 370 NEXT N
 380:
 390 REM MATRICES
 400 REM ********
 410:
 420 DIM C$(LONG)
 430 DIM Q$(NUMQ,5)
 440:
 450 FOR N=1 TO GUIA
 460 LET C$(N)=CHR$ 145
 470 NEXT N
 480 FOR N=LONG-GUIA TO LONG
 490 LET C$(N)=CHR$ 145
 500 NEXT N
 510:
 520 REM VARIABLES
 530 REM *********
 540:
 550 LET ULTQ=0
 560 LET L1=1
 570 LET LQ=0
 580 LET CABEZA=0
 590 LET INDICE=0
 600 LET H$=""
 610 LET E$=""
 620 LET S$=""
 630 LET T$=""
 640 LET F$=""
 650 LET M$=""
 660 LET A$=""
 670 LET X$=""
 680 LET I$=""
 690:
 700 REM BANDERAS
 710 REM ********
 720:
 730 LET IMPRES=0
 740:
 750 REM PREPARACION
 760 REM ***********
 770 REM :
 780 POKE 23658,0
 790 PAPER 7: BORDER 7: INK 0
 800:
 810 REM MENU
 820 REM ****
 830:
 840 CLS 
 850 LET IMPRES=0
 860 PRINT "LA MAQUINA DE TURING"
 870 PRINT '"(C) 1985,2010 Marcos Cruz"
 880 PRINT "Licencia/Permesilo/License:"
 890 PRINT "http://programandala.net/lp"
 900 PRINT "_______________________________"
 910 PRINT ''"1) ESCRIBIR QUINTUPLOS"
 920 PRINT '"2) ESCRIBIR DATOS EN LA CINTA"
 930 PRINT '"3) LISTAR/CORREGIR QUINTUPLOS"
 940 PRINT '"4) PONER EN MARCHA"
 950 IF INKEY$="1" THEN GO TO 1010
 960 IF INKEY$="2" THEN GO TO 1180
 970 IF INKEY$="3" THEN GO TO 1370
 980 IF INKEY$="4" THEN GO TO 1670
 990 GO TO 950
1000:
1010 REM ESCRIBIR QUINTUPLOS
1020 REM *******************
1030:
1040 CLS 
1050 PRINT AT 21,0
1060 LET INDICE=1
1070 INPUT "QUINTUPLO "; LINE Q$(INDICE)
1080 IF Q$(INDICE)="     " THEN LET ULTQ=INDICE-1: GO TO 810
1090 PRINT Q$(INDICE)
1100 POKE 23692,255
1110 LET INDICE=INDICE+1
1120 IF INDICE"z" OR I$<" " THEN GO TO 1270
1320 LET C$(CABEZA)=I$
1330 LET L1=L1+RIGHT
1340 GO TO 1260
1350:
1360:
1370 REM LISTAR QUINTUPLOS
1380 REM *****************
1390:
1400 IF NOT ULTQ THEN GO TO 810
1410 CLS 
1420 PRINT "PARA DETENER EL LISTADO TEN PUL-SADA LA BARRA ESPACIADORA."
1430 PRINT '"PARA CORREGIR UN QUINTUPLO PULSADELETE."
1440 PRINT '"PULSA UNA TECLA."
1450 PAUSE 0
1460 CLS 
1470 PRINT AT 20,0
1480 LET INDICE=1
1490 PRINT INDICE,Q$(INDICE)
1500 POKE 23692,255
1510 PAUSE 10
1520 LET I$=INKEY$
1530 IF I$=" " THEN GO TO 1520
1540 IF CODE I$=12 THEN GO TO 1630
1550 LET INDICE=INDICE+1
1560 IF INDICE<=ULTQ THEN GO TO 1490
1570 PRINT '"PULSA DELETE PARA CORREGIR ALGUNQUINTUPLO."
1580 PRINT '"OTRA TECLA PARA MENU."
1590 PAUSE 0
1600 LET I$=INKEY$
1610 IF CODE I$=12 THEN GO TO 1630
1620 GO TO 810
1630 INPUT "NUMERO DEL QUINTUPLO QUE QUIERE CORREGIR ";INDICE
1640 IF INDICE<1 OR INDICE>ULTQ THEN GO TO 1630
1650 INPUT "QUINTUPLO ";(INDICE);" "; LINE Q$(INDICE): PRINT : GO TO 1490
1660:
1670 REM PONER EN MARCHA 
1680 REM ***************
1690:
1700 CLS 
1710 PRINT "QUIERES COPIA EN PAPEL DEL DESA-RROLLO DE LA MAQUINA?"
1720 PRINT '"PULSA 'S' U OTRA TECLA."
1730 PAUSE 0
1740 LET I$=INKEY$
1750 LET IMPRES=1: IF I$<>"S" AND I$<>"s" THEN LET IMPRES=0: GO TO 1810
1760 LPRINT CHR$ 14;"MAQUINA DE TURING"
1770 LPRINT 
1780 FOR N=1 TO ULTQ
1790 LPRINT Q$(N)
1800 NEXT N
1810 CLS 
1820 LET INDICE=1
1830 LET L1=1
1840 GO SUB 2230
1850 IF IMPRES THEN LPRINT '"CINTA DE DATOS:"
1860 GO SUB 2350
1870 IF IMPRES THEN LPRINT : LPRINT 
1880 LET LQ=1: PLOT 180,172: DRAW 47,0: DRAW 0,-100: DRAW -47,0: DRAW 0,100
1890 FOR N=INDICE-5 TO INDICE+5
1900 IF N=INDICE THEN PRINT AT LQ,0;"QUINTUPLO ACTUAL ===>": INVERSE 1: IF IMPRES THEN LPRINT CHR$ 14;Q$(N)
1910 IF N>0 AND N<=ULTQ THEN PRINT AT LQ,23;Q$(N): GO TO 1930
1920 PRINT AT LQ,23;"     "
1930 LET LQ=LQ+1
1940 INVERSE 0
1950 NEXT N
1960 LET H$=C$(CABEZA)
1970 LET E$=Q$(INDICE,1)
1980 LET S$=Q$(INDICE,2)
1990 LET T$=Q$(INDICE,3)
2000 LET F$=Q$(INDICE,4)
2010 LET M$=Q$(INDICE,5)
2020 PRINT AT 14,0;"ESTADO DE LA MAQUINA "; INVERSE 1;E$
2030 IF H$=S$ THEN GO TO 2080
2040 LET INDICE=INDICE+1
2050 IF INDICE>ULTQ THEN LET X$=CHR$ 18+CHR$ 1+"ERROR:"+CHR$ 18+CHR$ 0+" NO HAY CONTINUACION DE   ESTADO": GO TO 2170
2060 IF E$=Q$(INDICE,1) THEN GO TO 1880
2070 GO TO 2040
2080 LET C$(CABEZA)=T$
2090 LET E$=F$
2100 IF M$="R" OR M$="r" THEN LET L1=L1+RIGHT: GO TO 2130
2110 IF M$="L" OR M$="l" THEN LET L1=L1+LEFT: GO TO 2130
2120 LET X$=CHR$ 18+CHR$ 1+"ERROR:"+CHR$ 18+CHR$ 0+" MOVIMIENTO INDETERMINADO DE LA CINTA": GO TO 2170
2130 GO SUB 2350
2140 IF Q$(INDICE,4)<>"H" AND Q$(INDICE,4)<>"h" THEN GO TO 2040
2150 PRINT AT 14,21; INVERSE 1;F$
2160 LET X$="FIN DE PROCESO"
2170:
2180 PRINT AT 16,0;X$
2190 PRINT #1;"PULSA UNA TECLA"
2200 PAUSE 0
2210 GO TO 810
2220:
2230 REM PINTAR CABEZA
2240 REM *************
2250:
2260 PRINT AT LINEA-1,TABC;CHR$ 140
2270 PRINT AT LINEA+1,TABC;"↑"
2280 PLOT 0,175-(LINEA+1)*8
2290 DRAW 255,0
2300 PLOT 0,176-LINEA*8
2310 DRAW 255,0
2320:
2330 RETURN 
2340:
2350 REM PINTAR CINTA
2360 REM ************
2370:
2380 IF L1<1 THEN LET L1=1
2390 IF L1>LONG-TOPE THEN LET L1=LONG-TOPE
2400 LET CABEZA=L1+TABC
2410 PRINT AT LINEA,0;V$
2420 PRINT AT LINEA,0;C$(L1 TO L1+TOPE)
2430 PRINT AT LINEA,0; OVER 1;B$
2440 BEEP .01,0
2450:
2460 IF NOT IMPRES THEN RETURN 
2470:
2480 LPRINT C$(GUIA+1 TO LONG-GUIA)
2490 LPRINT TAB CABEZA-GUIA-1;"↑"
2500:
2510 RETURN 

Descarga