Deducir 1.0
Descripción del contenido de la página
Herramienta de inteligencia artificial para ZX Spectrum (versión 1.0).
Esta primera versión de Deducir es la más entretenida de usar, porque tiene la opción de mostrar los pasos del razonamiento. Aparte de las instrucciones generales, hay que tener en cuenta las especificidades de esta versión, algunos comandos diferentes de los de las versiones posteriores.
Sin embargo, esta versión no tiene implementada alguna de las reglas de deducción que añadí a las versiones posteriores, por lo que los resultados son más limitados. Tras hacer unas pruebas pero sin examinar el código con detalle, creo que las reglas que faltan son las que llamé «de transitivización» en el artículo de Microhobby 127 (página 19).
Pantallazo
Código fuente
10 REM Deducir 1.0 (1986-02; 2015-03-17)
20 REM Copyright © 1986,2015 Marcos Cruz (programandala.net)
30 REM Licencia/Permesilo/License: http://programandala.net/lp
40 GO TO 2890
50 RUN 2690
60 REM RUTINA FALSO O CIERTO? ********************************
70 REM
80 REM OBJETIVO PRIMERO --------------------------------------
90 LET PO=1: LET UO=1
100 LET O(1,1)=SO
110 LET O(1,2)=VO
120 LET O(1,3)=OO
130 LET O(1,4)=0
140 IF SO=OO AND VO=1 THEN LET RES=1.1: RETURN
150 IF EXPLICA THEN LET M$="VEAMOS...": GO SUB 1090
160 GO TO 420
170 REM CREAR NUEVO OBJETIVO ----------------------------------
180 LET UO=UO+1: LET PO=UO
190 LET O(UO,1)=SN: LET SO=SN: REM SUJETO NUEVO
200 LET O(UO,2)=VN: LET VO=VN: REM VERBO NUEVO
210 LET O(UO,3)=ON: LET OO=ON: REM OBJETO NUEVO
220 LET O(UO,4)=0: REM PUNTERO DE DATOS
230 REM IMPRIMIR MENSAJE ......................................
240 IF NOT EXPLICA THEN GO TO 330
250 LET I$(1)=C$(SD)
260 LET I$(2)=C$(VD)
270 LET I$(3)=C$(OD)
280 GO SUB 910: LET M$="COMO SE QUE "+O$+", ENTONCES ME PREGUNTO:": GO SUB 1090
290 LET I$(1)=C$(SN)
300 LET I$(2)=C$(VN)
310 LET I$(3)=C$(ON)
320 GO SUB 910: LET M$=O$+"?": GO SUB 1090
330 REM SUJETO SER OBJETO? ....................................
340 IF SO=OO AND VO=1 THEN LET RES=1.5: RETURN
350 REM OBJETIVO ESTA REPETIDO? ...............................
360 FOR X=1 TO UO-1
370 IF SN=O(X,1) AND VN=O(X,2) AND ON=O(X,3) THEN GO TO 400
380 NEXT X
390 GO TO 420
400 IF EXPLICA THEN LET M$="PERO COMO ESO YA ME LO PREGUNTE ANTES, "+("SIN NINGUN RESULTADO, " AND O(X,4)=-1)+"LO DEJO Y SIGO POR DONDE IBA:"
410 LET UO=UO-1: GO TO 480
420 REM OBJETIVO EXISTE COMO DATO? ----------------------------
430 FOR X=1 TO PD
440 IF SO=D(X,1) AND VO=D(X,2) AND OO=D(X,3) THEN LET O(PO,4)=X: LET RES=1: RETURN
450 NEXT X: GO TO 630
460 REM RETROCEDER UN OBJETIVO --------------------------------
470 IF EXPLICA THEN LET M$="PUESTO QUE ESO NO ME CONDUCE A NADA, VUELVO A PREGUNTARME:"
480 REM BUSCAR UN OBJETIVO ANTERIOR ---------------------------
490 FOR X=UO TO 1 STEP -1
500 IF O(X,4)<>-1 THEN GO TO 520
510 NEXT X: LET RES=0: RETURN
520 LET PO=X
530 LET SO=O(PO,1): REM SUJETO
540 LET VO=O(PO,2): REM VERBO
550 LET OO=O(PO,3): REM OBJETO
560 REM IMPRIMIR OBJETIVO HALLADO .............................
570 IF NOT EXPLICA THEN GO TO 630
580 GO SUB 1090
590 LET I$(1)=C$(SO)
600 LET I$(2)=C$(VO)
610 LET I$(3)=C$(OO)
620 GO SUB 910: LET M$=O$+"?": GO SUB 1090
630 REM COMPARACION DEL OBJETIVO CON LOS DATOS ----------------
640 FOR I=O(PO,4)+1 TO PD
650 REM PALABRAS DEL DATO
660 LET SD=D(I,1): REM SUJETO
670 LET VD=D(I,2): REM VERBO
680 LET OD=D(I,3): REM OBJETO
690 LET O(PO,4)=I: REM PUNTERO DE DATOS DEL OBJETIVO
700 IF VD=1 THEN GO TO 760
710 REM VERBO DEL DATO<>"SER" .................................
720 IF SO=SD AND OO=OD THEN LET SN=VO: LET VN=1: LET ON=VD: GO TO 170
730 IF SO=SD AND VO=VD THEN LET SN=OO: LET VN=1: LET ON=OD: GO TO 170
740 IF OO=OD AND VO=VD THEN LET SN=SO: LET VN=1: LET ON=SD: GO TO 170
750 GO TO 800
760 REM VERBO DEL DATO="SER" ..................................
770 IF SO=SD THEN LET SN=OD: LET VN=VO: LET ON=OO: GO TO 170
780 IF VO=SD THEN LET SN=SO: LET VN=OD: LET ON=OO: GO TO 170
790 IF OO=SD AND VO<>1 THEN LET SN=SO: LET VN=VO: LET ON=OD: GO TO 170
800 NEXT I
810 LET O(PO,4)=-1: REM MARCAR OBJETIVO COMO INUTIL
820 GO TO 460
830 REM RUTINA PARTIR O$ EN I$(1...3) *************************
840 FOR C=1 TO 3
850 FOR N=1 TO LEN O$
860 IF O$(N)=" " THEN GO TO 880
870 NEXT N
880 LET I$(C)=O$( TO N-1): LET O$=O$(N+1 TO )
890 IF LEN O$ THEN IF O$(1)=" " THEN LET O$=O$(2 TO ): GO TO 890: REM QUITAR ESPACIOS ENTRE LAS PALABRAS
900 NEXT C: RETURN
910 REM RUTINA UNIR I$(1...3) EN O$ ***************************
920 LET O$=""
930 FOR C=1 TO 3
940 FOR L=CAD TO 1 STEP -1
950 IF I$(C,L)<>" " THEN LET O$=O$+I$(C, TO L)+(" " AND C<>3): GO TO 970
960 NEXT L
970 NEXT C: RETURN
980 REM RUTINA FORMATEAR O$ **********************************
990 IF LEN O$ THEN IF O$(1)=" " THEN LET O$=O$(2 TO ): GO TO 990
1000 IF LEN O$ THEN IF O$( LEN O$)=" " THEN LET O$=O$( TO LEN O$-1): GO TO 1000
1010 LET P$=O$
1020 FOR N=1 TO LEN O$
1030 LET OC= CODE O$(N)
1040 IF OC>97 AND OC<122 THEN LET O$(N)= CHR$ (OC-32): GO TO 1050
1050 NEXT N: IF LEN O$=0 THEN RETURN
1060 LET OC= CODE P$(1): IF OC>97 AND OC<122 THEN LET P$(1)= CHR$ (OC-32)
1070 LET LO= LEN O$
1080 RETURN
1090 REM RUTINA FORMATEAR SALIDA M$ ****************************
1100 POKE 23692,255
1110 LET LL=LPAN: IF PRINTER THEN LET LL=LIMP: REM LONGITUD DE LINEA
1120 IF M$( LEN M$)=" " THEN LET M$=M$( TO LEN M$-1): GO TO 1120
1130 IF LEN M$<LL THEN PRINT M$: RETURN
1140 LET QUEDA=LL
1150 LET PP=1: REM PRINCIPIO DE PALABRA
1160 LET M= LEN M$
1170 FOR C=1 TO M
1180 IF M$(C)=" " OR C=M THEN GO SUB 1200
1190 NEXT C: PRINT : RETURN
1200 REM RUTINA PALABRA DE M$ ----------------------------------
1210 LET LONG=C-PP
1220 IF LONG+1>QUEDA THEN PRINT : LET QUEDA=LL
1230 PRINT M$(PP TO PP+LONG);
1240 LET QUEDA=QUEDA-LONG-1
1250 LET PP=C+1
1260 RETURN
1270 REM RUTINA CONCEPTOS CONOCIDOS? ***************************
1280 FOR C=1 TO 3
1290 FOR N=1 TO PC
1300 IF I$(C)=C$(N) THEN GO TO 1320
1310 NEXT N: LET DESC=C: RETURN
1320 LET I(C)=N
1330 NEXT C: LET DESC=0: RETURN
1340 REM RESPONDER *********************************************
1350 GO SUB 830
1360 GO SUB 1270
1370 IF DESC THEN LET M$="NO CONOZCO EL CONCEPTO "+I$(DESC): GO SUB 1090: GO TO 2960
1380 REM OBJETIVO A DEMOSTRAR
1390 LET SO=I(1): REM SUJETO
1400 LET VO=I(2): REM VERBO
1410 LET OO=I(3): REM OBJETO
1420 GO SUB 60: REM FALSO O CIERTO?
1430 REM FALSO .................................................
1440 IF RES<>0 THEN GO TO 1470
1450 IF NOT EXPLICA THEN LET M$="NO": GO SUB 1090: GO TO 2960
1460 GO SUB 1690: LET M$="NO HAY FORMA DE DEMOSTRAR ESO, NO ES CIERTO QUE "+O$: GO SUB 1090: GO TO 2960
1470 REM SUJETO SER OBJETO .....................................
1480 IF RES= INT RES THEN GO TO 1520
1490 IF NOT EXPLICA THEN LET M$="SI": GO SUB 1090: GO TO 2960
1500 IF RES=1.5 THEN GO SUB 1690: LET M$="COMO ESO ES EVIDENTE, NO ES NECESARIO CONTINUAR, ES CIERTO QUE "+O$: GO SUB 1090: GO TO 2960
1510 GO SUB 1690: LET M$="NO HAY NADA QUE EXPLICAR, PUESTO QUE ES EVIDENTE QUE "+O$: GO SUB 1090: GO TO 2960
1520 REM EVIDENTE (OBJETIVO PRIMERO ESTA COMO DATO) ............
1530 IF UO>1 THEN GO TO 1560
1540 IF NOT EXPLICA THEN LET M$="SI": GO SUB 1090: GO TO 2960
1550 GO SUB 1690: LET M$="ES CIERTO QUE "+O$+" PORQUE TU ME LO HAS DICHO, "+N$: GO SUB 1090: GO TO 2960
1560 REM CIERTO (DEDUCIDO) .....................................
1570 IF NOT EXPLICA THEN LET M$="SI": GO SUB 1090: GO TO 2960
1580 LET M$="LO CUAL SE CORRESPONDE CON MIS DATOS": GO SUB 1090
1590 LET M$="RESPUESTA:": GO SUB 1090: LET M$="PUESTO QUE": GO SUB 1090
1600 FOR S=1 TO UO
1610 IF O(S,4)=0 OR O(S,4)=-1 THEN GO TO 1660
1620 FOR C=1 TO 3
1630 LET I$(C)=C$(D(O(S,4),C))
1640 NEXT C
1650 GO SUB 910: LET M$="SE QUE "+O$+",": GO SUB 1090
1660 NEXT S
1670 GO SUB 1690: LET M$="ENTONCES DEDUZCO QUE ES CIERTO QUE "+O$: GO SUB 1090
1680 GO SUB 2960
1690 REM RUTINA O$=OBJETIVO PRIMERO ----------------------------
1700 LET I$(1)=C$(O(1,1))
1710 LET I$(2)=C$(O(1,2))
1720 LET I$(3)=C$(O(1,3))
1730 GO SUB 910
1740 RETURN
1750 REM APRENDER **********************************************
1760 LET NEWC=0: REM BANDERA DE QUE ALGUN CONCEPTO ES NUEVO
1770 GO SUB 830
1780 GO SUB 1270
1790 IF NOT DESC THEN GO TO 1850
1800 REM GUARDAR CONCEPTO NUEVO --------------------------------
1810 LET NEWC=NEWC+1: REM POR LO MENOS HAY UN CONCEPTO NUEVO
1820 IF PC=MAXC THEN LET M$="NO ME QUEDA MEMORIA PARA GUARDAR EL CONCEPTO "+I$(DESC): GO SUB 1090: GO TO 2960
1830 LET PC=PC+1
1840 LET C$(PC)=I$(DESC): LET M$="NO CONOCIA EL CONCEPTO "+C$(PC): GO SUB 1090: GO TO 1780
1850 REM DATO NUEVO ES DEDUCIBLE? ------------------------------
1860 IF NEWC THEN GO TO 1920: REM SI ALGUN CONCEPTO ES NUEVO,EL DATO TAMBIEN LO ES
1870 LET SO=I(1): REM SUJETO
1880 LET VO=I(2): REM VERBO
1890 LET OO=I(3): REM OBJETO
1900 GO SUB 60: REM FALSO O CIERTO?
1910 IF INT RES THEN LET M$="YA LO SE, PUEDO DEDUCIRLO": GO SUB 1090: GO TO 2950
1920 REM GUARDAR DATO NUEVO ------------------------------------
1930 IF PD=MAXD THEN GO SUB 910: LET M$="NO SABIA QUE "+O$+", PERO NO ME QUEDA MEMORIA LIBRE PARA ALMACENARLO": GO SUB 1090: GO TO 2950
1940 LET PD=PD+1
1950 LET D(PD,1)=I(1): REM SUJETO
1960 LET D(PD,2)=I(2): REM VERBO
1970 LET D(PD,3)=I(3): REM OBJETO
1980 IF NOT NEWC THEN GO TO 2930
1990 LET M$="AHORA LO"+("S" AND NEWC>1)+" CONOZCO, "+N$: GO SUB 1090
2000 GO SUB 910: LET M$="AHORA "+("TAMBIEN " AND NEWC<3)+"SE QUE "+O$: GO SUB 1090
2010 GO TO 2930
2020 REM OLVIDAR CONCEPTO **************************************
2030 LET I$(1)=O$: LET O$=I$(1): REM PONER LEN(O$)=CAD
2040 FOR N=1 TO PC
2050 IF C$(N)=O$ THEN GO TO 2080
2060 NEXT N
2070 LET M$="NO CONOZCO EL CONCEPTO "+O$: GO SUB 1090: GO TO 2960
2080 IF N=1 THEN LET M$="NO PUEDO OLVIDAR ESE CONCEPTO, ES LA BASE DE MI CONOCIMIENTO": GO SUB 1090: GO TO 2960
2090 REM BORRAR CONCEPTO DE LA LISTA ---------------------------
2100 FOR X=N TO PC-1
2110 LET C$(X)=C$(X+1)
2120 NEXT X
2130 LET PC=PC-1
2140 REM BORRAR DATOS QUE CONTENGAN DICHO CONCEPTO -------------
2150 LET L=1
2160 FOR X=L TO PD
2170 IF D(X,1)=N OR D(X,2)=N OR D(X,3)=N THEN GO SUB 2260: GO TO 2160
2180 NEXT X
2190 REM ACTUALIZAR CONCEPTOS MAYORES QUE EL BORRADO -----------
2200 FOR X=1 TO PD
2210 FOR C=1 TO 3
2220 IF D(X,C)>N THEN LET D(X,C)=D(X,C)-1
2230 NEXT C
2240 NEXT X
2250 GO TO 2930
2260 REM RUTINA BORRAR DATO X ----------------------------------
2270 FOR C=X TO PD-1
2280 LET D(C,1)=D(C+1,1)
2290 LET D(C,2)=D(C+1,2)
2300 LET D(C,3)=D(C+1,3)
2310 NEXT C
2320 LET PD=PD-1
2330 LET L=X
2340 RETURN
2350 REM OLVIDAR DATO ******************************************
2360 GO SUB 830
2370 GO SUB 1270
2380 IF DESC THEN LET M$="NO CONOZCO EL CONCEPTO "+I$(DESC): GO SUB 1090: GO TO 2960
2390 FOR X=1 TO PD
2400 IF D(X,1)=I(1) AND D(X,2)=I(2) AND D(X,3)=I(3) THEN GO SUB 2260: GO TO 2930
2410 NEXT X
2420 REM COMPROBAR SI EL DATO ES DEDUCIBLE ---------------------
2430 REM OBJETIVO A DEMOSTRAR
2440 LET SO=I(1): REM SUJETO
2450 LET VO=I(2): REM VERBO
2460 LET OO=I(3): REM OBJETO
2470 GO SUB 60: REM FALSO O CIERTO?
2480 REM DATO FALSO O ABSURDO
2490 IF RES<>1 THEN LET M$="NO CONOZCO ESE DATO": GO SUB 1090: GO TO 2960
2500 REM DATO CIERTO
2510 LET M$="ESE DATO SE DEDUCE DE LOS OTROS, POR LO QUE NO PUEDO OLVIDARLO": GO SUB 1090: GO TO 2960
2520 REM LISTAR CONCEPTOS **************************************
2530 LET M$="CONCEPTOS QUE CONOZCO:": GO SUB 1090
2540 FOR N=1 TO PC
2550 LET M$=" "( TO 4- LEN STR$ N)+ STR$ N+" "+C$(N): GO SUB 1090
2560 NEXT N
2570 GO TO 2930
2580 REM LISTAR DATOS ******************************************
2590 IF PD=0 THEN LET M$="NO CONOZCO NINGUN DATO": GO SUB 1090: GO TO 2960
2600 LET M$="DATOS QUE CONOZCO:": GO SUB 1090
2610 FOR N=1 TO PD
2620 LET I$(1)=C$(D(N,1)): REM SUJETO
2630 LET I$(2)=C$(D(N,2)): REM VERBO
2640 LET I$(3)=C$(D(N,3)): REM OBJETO
2650 GO SUB 910
2660 LET M$=" "( TO 4- LEN STR$ N)+ STR$ N+" "+O$: GO SUB 1090
2670 NEXT N
2680 GO TO 2930
2690 REM INICIACION ********************************************
2700 LET CAD=15: REM LONGITUD DE LOS CONCEPTOS
2710 LET MAXC=255: REM NUMERO MAXIMO DE CONCEPTOS
2720 DIM C$(MAXC,CAD): REM MATRIZ DE CONCEPTOS
2730 LET PC=2: REM PUNTERO DEL ULTIMO CONCEPTO
2740 LET C$(1)="SER": REM CONCEPTO PRINCIPAL
2750 LET C$(2)="": REM CONCEPTO VACIO,PARA PERMITIR DATOS CON DOS CONCEPTOS
2760 LET MAXD=255: REM NUMERO MAXIMO DE DATOS
2770 LET PD=0: REM PUNTERO DE ULTIMO DATO
2780 DIM D(MAXD,3): REM MATRIZ DE DATOS
2790 LET MAXO=MAXD-1: REM NUMERO MAXIMO DE OBJETIVOS
2800 LET PO=0: REM PUNTERO DE ULTIMO OBJETIVO
2810 DIM O(MAXO,4): REM MATRIZ DE OBJETIVOS
2820 LET N$="OH, TODOPODEROSO!": REM NOMBRE DEL OPERADOR
2830 DIM I$(3,CAD): REM MATRIZ TEMPORAL DE CONCEPTOS
2840 DIM I(3): REM MATRIZ TEMPORAL DE DATOS
2850 LET PRINTER=0
2860 LET LPAN=32: REM LINEAS DE PANTALLA
2870 LET LIMP=80: REM LINEAS DE IMPRESORA
2880 LET T$=" > "
2890 REM COMIENZO **********************************************
2900 PAPER 1: BORDER 1: INK 7: CLS
2910 PRINT "Deducir 1.0 (1986-02)"'"Copyright ©1986,2015 Marcos Cruz"'"(programandala.net)"'"Licencia/Permesilo/License:"'"http://programandala.net/lp"''
2920 LET M$="AGUARDO TUS ORDENES, "+N$: GO SUB 1090
2930 REM ESPERAR ORDENES ***************************************
2940 LET K$="OK"
2950 PRINT K$
2960 POKE 23692,255: REM SCROLL
2970 POKE 23658,0: POKE 23617,158: REM CURSOR
2980 LET EXPLICA=0
2990 INPUT (T$); LINE O$
3000 GO SUB 980: REM FORMATEAR
3010 IF O$="" THEN GO TO 2940
3020 LET M$=T$+P$: GO SUB 1090
3030 IF LO>10 THEN IF O$( TO 9)="EXPLICA: " AND O$(LO)="?" THEN LET O$=O$(10 TO LO-1): LET EXPLICA=1: GO TO 1340
3040 IF O$(LO)="?" THEN LET O$=O$( TO LO-1): GO TO 1340
3050 IF O$(LO)="." THEN LET O$=O$( TO LO-1): GO TO 1750
3060 IF LO>8 THEN IF O$( TO 8)="LLAMAME " THEN LET N$=O$(9 TO ): LET K$="OK "+N$: GO TO 2950
3070 IF LO>12 THEN IF O$( TO 12)="OLVIDA DATO " THEN LET O$=O$(13 TO ): GO TO 2350
3080 IF LO>16 THEN IF O$( TO 16)="OLVIDA CONCEPTO " THEN LET O$=O$(17 TO ): GO TO 2020
3090 IF O$="PANTALLA" THEN CLOSE # 2: LET PRINTER=0: GO TO 2930
3100 IF O$="IMPRESORA" THEN OPEN # 2,"P": LET PRINTER=1: GO TO 2930
3110 IF O$="LISTA CONCEPTOS" THEN GO TO 2520
3120 IF O$="LISTA DATOS" THEN GO TO 2580
3130 IF O$="MEMORIA" THEN LET M$="CONOZCO "+ STR$ PC+" CONCEPTO"+("S" AND PC<>1)+" Y "+ STR$ PD+" DATO"+("S" AND PD<>1): GO SUB 1090: GO TO 2930
3140 IF O$="GRABA" THEN SAVE "DED10X.BAS" LINE 2900: GO TO 2930
3150 IF O$="OLVIDA TODO" THEN RUN 2690
3160 LET K$="PERDON?": GO TO 2950
3170:
3180 CLEAR : SAVE "DED10.BAS" LINE 50: RUN 50