5  REM  HP CONTRIBUTED LIBRARY, 2/75
10  PRINT "THIS PROGRAM WILL PRODUCE A TRUTH TABLE FOR ANY BOOLEAN"
20  PRINT "ALGEBRA EXPRESSION THAT WILL FIT ON A 72-CHARACTER LINE."
30  PRINT " - = NOT"'10'13"+ = IOR"'10'13"* = AND"'10'13"EVALUATION IS FROM LEFT TO RIGHT."'10'10'10
40  REM EXECUTES COMPLEX BOOLEAN ALGEBRA STATEMENTS
50  REM BRAD JENSEN, MACMURRAY COLLEGE
60  REM  FEBRUARY 1974
70  DIM A[70,2],P[200],C[26],I[72],B$[31],A$[72],D$[2],C$[72]
80  D$="01"
90  B$="ABCDEFGHIJKLMNOPQRSTUVWXYZ+*-()"
100  PRINT "YOUR LOGICAL STATEMENT IS:"
110  MAT I=ZER
120  MAT P=ZER
130  INPUT A$
140  MAT A=ZER
150  N=LEN(A$)
160  K=1
170  D=-3
180  FOR I=1 TO N
190  IF A$[I,I]=" " THEN 390
200  FOR J=1 TO 31
210  IF A$[I,I]=B$[J,J] THEN 270
220  NEXT J
230  E=1
240  GOSUB 1670
250  PRINT "     '";A$[I,I];"'  "
260  GOTO 100
270  I[K]=J
280  IF I[K]<27 THEN 380
290  I[K]=-(I[K]-26)
300  IF I[K]>-4 THEN 390
310  GOTO ABS(I[K])-3 OF 320,350
320  D=D-1
330  I[K]=D
340  GOTO 390
350  I[K]=D
360  D=D+1
370  GOTO 390
380  A[I[K],1]=1
390  K=K+1
400  NEXT I
410  IF D=-3 THEN 450
420  E=2
430  GOSUB 1670
440  GOTO 100
450  REM SET UP LOGICAL SEQUENCE
460  A=1
470  K=K-1
480  V1=0
490  C=27
500  F=0
510  F1=K+1
520  FOR I=1 TO K
530  IF I[I]>-4 THEN 610
540  IF I[I] >= V1 THEN 610
550  F=I
560  V1=I[I]
570  I=I+1
580  IF I[I]>V1 THEN 570
590  IF I[I]<V1 THEN 550
600  F1=I
610  NEXT I
620  V1=0
630  IF F=0 THEN 660
640  I[F]=0
650  I[F1]=0
660  O1=400
670  I1=F
680  N1=0
690  I1=I1+1
700  IF I1=F1 THEN 1030
710  IF I[I1]>0 THEN 840
720  IF I[I1]=0 THEN 690
730  IF I[I1]<-2 THEN 770
740  E=3
750  GOSUB 1670
760  GOTO 100
770  IF I[I1]=-3 THEN 810
780  PRINT "PROGRAM ERROR."
790  PRINT I[I1]
800  STOP 
810  N1=1000
820  I[I1]=0
830  GOTO 690
840  O2=I[I1]
850  I[I1]=0
860  P[A]=O2+O1+N1
870  N1=0
880  A=A+1
890  I1=I1+1
900  IF I1=F1 THEN 1060
910  IF I[I1]=0 THEN 890
920  IF I[I1]<0 THEN 960
930  E=4
940  GOSUB 1670
950  GOTO 100
960  IF I[I1]<-2 THEN 1000
970  O1=I[I1]*-100
980  I[I1]=0
990  GOTO 690
1000  E=5
1010  GOSUB 1670
1020  GOTO 100
1030  E=6
1040  GOSUB 1670
1050  GOTO 100
1060  REM EXIT?
1070  P[A]=300+C
1080  I[F1]=C
1090  C=C+1
1100  A=A+1
1110  IF F1<K+1 THEN 500
1120  P[A]=500+C-1
1130  L1=A
1140  K=0
1150  PRINT '10"TRUTH TABLE FOR ";A$;"  :"
1160  FOR I=1 TO 26
1170  IF A[I,1]<1 THEN 1210
1180  K=K+1
1190  PRINT " ";B$[I,I];
1200  C[K]=I
1210  NEXT I
1220  PRINT "    T/F"
1230  FOR I=1 TO K+4
1240  PRINT "--";
1250  C=0
1260  NEXT I
1270  PRINT 
1280  FOR I=1 TO 2^K
1290  K1=K
1300  A[C[K1],2]=ABS(C-A[C[K1],2])
1310  IF A[C[K1],2]=1 THEN 1350
1320  IF I=1 THEN 1350
1330  K1=K1-1
1340  GOTO 1300
1350  FOR J=1 TO K
1360  K2=A[C[J],2]
1370  PRINT " ";D$[K2+1,K2+1];
1380  NEXT J
1390  C=1
1400  J=A=0
1410  J=J+1
1420  N=INT(P[J]/1000)
1430  O=INT((P[J]-(1000*N))/100)
1440  P=(P[J]/100-INT(P[J]/100))*100
1450  GOTO O OF 1460,1500,1540,1560,1600
1460  P=A[P,2]
1470  P=ABS(P-N)
1480  A=A OR P
1490  GOTO 1410
1500  P=A[P,2]
1510  P=ABS(P-N)
1520  A=A AND P
1530  GOTO 1410
1540  A[P,2]=A
1550  GOTO 1410
1560  P=A[P,2]
1570  P=ABS(P-N)
1580  A=P
1590  GOTO 1410
1600  PRINT "     ";
1610  K2=A[P,2]
1620  PRINT D$[K2+1,K2+1]
1630  NEXT I
1640  PRINT 
1650  GOTO 100
1660  STOP 
1670  REM  ERROR ROUTINE
1680  FOR Z=1 TO E
1690  READ C$
1700  NEXT Z
1710  PRINT C$
1720  RESTORE 
1730  RETURN 
1740  DATA "ILLEGAL CHARACTER","UNEQUAL NUMBER OF RIGHT AND LEFT PARENTHESES"
1750  DATA "OPERATION ERROR: TWO ADJACENT OPERATORS"
1760  DATA "OPERATION ERROR: TWO ADJACENT SYMBOLS"
1770  DATA "OPERATION ERROR: MISPLACED NOT"
1780  DATA "OPERATION ERROR: MISSING VARIABLE"
1790  END 
9999  END 
