100 REM "ANIMALS" AI PROGRAM 110 REM A SIMPLE EXPERT SYSTEM 120 REM RUN 51000 TO CREATE FILE 130 REM RUN 51100 TO INITIALIZE FILE 140 REM RUN 50000 TO PRINT FILE 150 REM SAVE"@0:ANIMALS",8 160 : 170 Z$=CHR$(0) 180 SP$=" " 190 RL=44: REM REL RECORD SIZE-1 200 INPUT"[206]AME OF DATA FILE ANIMALS.DAT[157][157][157][157][157][157][157][157][157][157][157][157][157]";F$ 210 : 220 REM* MAIN PROGRAM LOOP * 230 OPEN 15,8,15 240 OPEN 1,8,9,F$ 250 PRINT#15,"P";CHR$(9)CHR$(1)CHR$(0)CHR$(1) 260 REM FIRST RECORD HOLDS NEXT AVAILABLE RECORD 270 GET#1,M1$,M2$: REM IN LOW, HI FORMAT 280 M1$=LEFT$(M1$+Z$,1): M2$=LEFT$(M2$+Z$,1) 290 MAX=ASC(M1$) + 256*ASC(M2$) 300 : 310 PRINT"[147]** [212]HINK OF AN ANIMAL **"; 320 PRINT"** [193]NSWER QUESTIONS WITH 'Y' OR 'N' **" 330 RP=2: REM POINT TO FIRST QUESTION 340 : 350 R=RP: GOSUB 20000'READ IN (null) 360 IF YES=0 AND NO=0 THEN 460'END OF CHAIN 370 REM CHAIN TO NEXT BRANCH 380 PRINT M$;"? "; 390 GOSUB 10000: REM GET Y/N RESPONSE 400 BP=RP: REMEMBER OLD RECORD # 410 IF YN$="Y" THEN A$="YES": RP=YES: OB=0 420 IF YN$="N" THEN A$="NO" : RP=NO : OB=1 430 PRINT A$: REM YES OR NO 440 GOTO 350 450 : 460 REM END OF CHAIN - GIVE GUESS 470 PRINT"*** [201]T MIGHT BE A ";M$ 480 PRINT"> [201]S THAT CORRECT (Y/N) "; 490 GOSUB 10000'GET ANSWER YES OR NO 500 IF YN$="Y" THEN 950'FOUND ANSWER, WRAP UP 510 REM GOT WRONG ANSWER, LET'S LEARN FROM IT 520 PRINT" NO": PRINT"[207][203], WHAT WERE YOU ACTUALLY THINKING OF" 530 INPUT" >";ANIMAL$ 540 PRINT"[215]HAT YES/NO QUESTION COULD [201] ASK" 550 PRINT"TO DISTINGUISH A" 560 PRINT" ";M$ 570 PRINT"FROM A" 580 PRINT" ";ANIMAL$ 590 INPUT Q$ 600 PRINT"[193]ND REGARDING A" 610 PRINT" ";M$;",": PRINT Q$ 620 PRINT"> (Y/N)"; 630 GOSUB 10000'GET YES/NO 640 REM CREATE NEW QUESTION POINTING TO CURRENT OR NEW ANIMAL 650 IF YN$="Y" THEN A$="YES": YN=RP: NN=MAX+1: REM NEW YES/NO POINTERS 660 IF YN$="N" THEN A$="NO" : YN=MAX+1: NN=RP: REM NEW YES/NO POINTERS 670 PRINT A$: REM YES OR NO 680 RR=MAX: GOSUB 40000'(null)#(MAX) 690 N=YN: GOSUB 30000: YN$=LH$: REM CONVERT N TO LH$ (LOW+HI) 700 N=NN: GOSUB 30000: NN$=LH$: REM CONVERT N TO LH$ (LOW+HI) 710 PRINT#1,YN$;NN$;LEFT$(Q$+SP$,RL-4) 720 GOSUB 40000'RE-POSITION TO FOIL BUG 730 REM POINT OLD QUESTION TO NEW 740 R=BP : GOSUB 20000'READ IN OLD QUESTION 750 N=MAX: GOSUB 30000'FIND LOW,HI OF NEW (null) POSITION 760 IF OB=0 THEN YES$=LH$: REM POINT 'YES' PTR TO NEW QUESTION 770 IF OB=1 THEN NO$ =LH$: REM POINT 'NO' PTR TO NEW QUESTION 780 RR=BP: GOSUB 40000'(null)#1,(BP) 790 PRINT#1,YES$;NO$;M$: REM RE-WRITE MODIFIED RECORD 800 GOSUB 40000'RE-POSITION TO FOIL BUG 810 REM NOW PUT NEW ANIMAL IN NEXT AVAILABLE RECORD 820 RR=MAX+1: GOSUB 40000'(null)#1,(MAX+1) 830 PRINT#1,Z$;Z$;Z$;Z$;LEFT$(ANIMAL$+SP$,RL-4) 840 GOSUB 40000'RE-POSITION TO FOIL BUG 850 REM NOW UPDATE MAX. RECORD POINTER 860 RR=1: GOSUB 40000'1ST REC HAS PTR 870 MAX=MAX+2 : REM 2 RECORDS HAVE BEEN ADDED TO FILE 880 N=MAX: GOSUB 30000'CONVERT TO 2-BYTE POINTER 890 PRINT#1,LH$;LEFT$(SP$,RL-2): REM PAD WITH SPACES 900 GOSUB 40000'RE-POSITION TO FOIL BUG 910 PRINT: PRINT"[212]HANK YOU FOR TEACHING ME A NEW ANIMAL!" 920 GOTO 970 930 : 940 REM GOT RIGHT ANSWER, WRAP UP 950 PRINT" YES": PRINT"[193]LRIGHT! [199]UESS [201]'M PRETTY SMART." 960 : 970 CLOSE 1: CLOSE 15 980 INPUT"PLAY AGAIN Y[157][157][157]";YN$ 990 IF YN$="Y" THEN 230 1000 END 1010 : 1020 : 10000 REM* SUBROUTINE TO ACCEPT Y OR N 10010 K=0: FOR I=0 TO 1 10020 GET YN$ 10030 REM FLASH FAKE CURSOR 10040 PRINT MID$("[146]",SGN(K AND 8)+1,1);" [157]"; 10050 K=(K+1) AND 255 10060 I=-(YN$="Y"OR YN$="N"): NEXT 10070 REM UNTIL 'Y' OR 'N' PRESSED 10080 PRINT"[146] ";: REM ERASE CURSOR 10090 RETURN 10100 : 10110 : 20000 REM SUBROUTINE TO READ RECORD# (R) IN YES$,NO$,M$ 20010 RR=R: GOSUB 40000: REM RECORD#1,(R) 20020 GET#1,Y1$,Y2$,N1$,N2$ 20030 YES$=LEFT$(Y1$+Z$,1) + LEFT$(Y2$+Z$,1) 20040 NO$ =LEFT$(N1$+Z$,1) + LEFT$(N2$+Z$,1) 20050 YES=ASC(Y1$+Z$) + 256*ASC(Y2$+Z$) 20060 NO =ASC(N1$+Z$) + 256*ASC(N2$+Z$) 20070 INPUT#1,M$ 20080 REM STRIP TRAILING SPACES 20090 LC=0: FOR K=1TOLEN(M$):IF MID$(M$,K,1)<>" "THEN LC=K 20100 NEXT: IF LC THEN M$=LEFT$(M$,LC) 20110 RETURN 20120 : 20130 : 30000 REM* SUBROUTINE TO CONVERT 16-BIT 'N' TO LOW,HI 'LH$' * 30010 HH%=N/256: LL%=N-256*HH%: LH$=CHR$(LL%)+CHR$(HH%) 30020 RETURN 30030 : 30040 : 40000 REM* SUBROUTINE TO SIMULATE 'RECORD#1,(RR)' USING BASIC 2.0 * 40010 RH%=RR/256: RL%=RR-256*RH% 40020 PRINT#15,"P";CHR$(96+9)CHR$(RL%)CHR$(RH%)CHR$(1) 40030 RETURN 40040 : 40050 : 50000 REM** DUMP RELATIVE FILE 50010 OPEN 15,8,15 50020 INPUT"[206]AME OF DATA FILE ANIMALS.DAT[157][157][157][157][157][157][157][157][157][157][157][157][157]";F$ 50030 OPEN 1,8,9,F$ 50040 Z$=CHR$(0) 50050 PRINT#15,"P";CHR$(9)CHR$(1)CHR$(0)CHR$(1): GET#1,L$,H$ 50060 NR=ASC(L$+Z$)+256*ASC(H$+Z$)-1 50070 PRINT " 1 :"NR"RECORDS IN FILE" 50080 RL=2: RH=0: REM RECORD #, LO/HI 50090 FOR I=2 TO NR 50100 PRINT#15,"P";CHR$(9)CHR$(RL)CHR$(RH)CHR$(1) 50110 GET#1,X1$,X2$,X3$,X4$: INPUT#1,A$ 50120 P1=ASC(X1$+Z$)+256*ASC(X2$+Z$) 50130 P2=ASC(X3$+Z$)+256*ASC(X4$+Z$) 50140 PRINT I;":";P1,P2,"["A$"]" 50150 RL=RL+1: IF RL>255 THEN RL=0: RH=RH+1 50160 NEXT: CLOSE 15 50170 END 50180 : 50190 : 51000 REM** CREATE NEW ANIMAL FILE 51010 INPUT"[206]AME OF DATA FILE ANIMALS.DAT[157][157][157][157][157][157][157][157][157][157][157][157][157]";F$ 51020 INPUT"MAXIMUM NUMBER OF RECORDS 2000[157][157][157][157][157][157]";M 51030 OPEN 15,8,15 51040 OPEN 1,8,9,F$+",L,"+CHR$(45): REM REC LEN = 45 51050 RR=M: GOSUB 40000 51060 PRINT#1,LEFT$(SP$,44) 51070 CLOSE 1: CLOSE 15: GOTO 51110 51080 INPUT"[206]AME OF DATA FILE ANIMALS.DAT[157][157][157][157][157][157][157][157][157][157][157][157][157]";F$ 51090 : 51100 REM** TEACH FIRST TWO ANIMALS 51110 R1$="[196]OES IT LIVE IN THE WATER":REM FIRST QUESTION 51120 R2$="[198]ISH" : REM 'YES' ANSWER 51130 R3$="[200]ORSE": REM 'NO' ANSWER 51140 Z$=CHR$(0) 51150 SP$=" " 51160 OPEN 15,8,15 51170 OPEN 1,8,9,F$ 51180 RR=1: GOSUB 40000 51190 PRINT#1,CHR$(5);Z$;LEFT$(SP$,40) 51200 GOSUB 40000: RR=RR+1: GOSUB 40000 51210 PRINT#1,CHR$(3);Z$;CHR$(4);Z$;LEFT$(R1$+SP$,40) 51220 GOSUB 40000: RR=RR+1: GOSUB 40000 51230 PRINT#1,Z$Z$Z$Z$;LEFT$(R2$+SP$,40) 51240 GOSUB 40000: RR=RR+1: GOSUB 40000 51250 PRINT#1,Z$Z$Z$Z$;LEFT$(R3$+SP$,40) 51260 CLOSE 15 51270 END