1  REM  ****  HP BASIC PROGRAM LIBRARY  *******************************
2  REM
3  REM        TRUTH:   TRUTH TABLES FOR BOOLEAN EXPRESSIONS
4  REM
5  REM        36602 REV  B   10/73
6  REM
7  REM  ****  CONTRIBUTED PROGRAM  ************************************
1000  REM   PROGRAM TRUTH
1010  REM
1020  DIM A$[70],B$[72],L$[32],P[7],S[50],V$[26],V[50]
1030  REM
1040  LET L$="ABCDEFGHIJKLMNOPQRSTUVWXYZ=>#+&'"
1050  REM
1060  MAT  READ P
1200  PRINT '10" ","TRUTH"'10
1210  PRINT '10"'BEAUTY IS TRUTH, TRUTH BEAUTY--THAT IS ALL"
1220  PRINT "   YE KNOW ON EARTH, AND ALL YE NEED TO KNOW.'"'10"  KEATS"
1250  PRINT '10"INSTRUCTIONS ";
1260  INPUT A$
1270  IF A$[1,1]="N" THEN 2000
1370  REM
1380  REM     INSTRUCTIONS
1390  REM
1400  PRINT '10"THIS PROGRAM PRODUCES TRUTH TABLES FOR BOOLEAN EXPRESSIONS."
1410  PRINT "ANY SINGLE LETTER MAY BE USED AS A VARIABLE."
1420  PRINT "THE BOOLEAN OPERATORS ARE:"
1430  PRINT " PRIORITY  SYMBOL  MNEMONIC  DESCRIPTION"'10
1440  PRINT "    1        '       NOT      NEGATION  (UNARY OPERATOR)"
1450  PRINT "    2        &       AND      CONJUNCTION"
1460  PRINT "    3        +        OR      DISJUNCTION"
1470  PRINT "    3        #       XOR      EXCLUSIVE OR"
1480  PRINT "    4        >        IF      CONDITIONAL"
1490  PRINT "    5        =       IFF      BICONDITIONAL"
1500  PRINT '10"WITHIN A PRIORITY GROUP EVALUATION IS LEFT TO RIGHT."
1510  PRINT "ALL OPERATORS EXCEPT 'NOT' ARE BINARY AND ARE PLACED ";
1520  PRINT "BETWEEN VARIABLES."
1530  PRINT "NEGATION IS INDICATED BY AN APOSTROPHE FOLLOWING THE ";
1540  PRINT "QUANTITY."
1550  PRINT "PARENTHESIS MAY BE USED AT WILL TO CHANGE THE ORDER OF ";
1560  PRINT "EVALUATION."'10'10
1970  REM
1980  REM      INPUT
1990  REM
2000  PRINT '10"EXP=";
2010  INPUT A$
2020  PRINT 
2100  LET B$="("
2110  LET B$[2]=A$
2120  LET B=LEN(B$)+1
2130  FOR I=B TO 72
2140  LET B$[I,I]=")"
2150  NEXT I
2160  LET V$=""
2200  MAT S=ZER
2210  LET S=V=N=0
2220  MAT V=ZER
2970  REM
2980  REM     EVALUATE EXPRESSION   (REV.POL)
2990  REM
3000  FOR I=1 TO 72
3010  IF B$[I,I]=" " THEN 3700
3020  IF B$[I,I]#"(" THEN 3100
3030  LET S=S+1
3040  LET S[S]=33
3050  GOTO 3700
3100  IF B$[I,I]#")" THEN 3200
3105  IF S[S]=33 THEN 3130
3110  LET V=V+1
3120  LET V[V]=S[S]
3130  LET S=S-1
3140  IF S=0 THEN 4000
3150  IF S[S]#33 THEN 3110
3160  LET S=S-1
3170  IF S=0 THEN 4000
3180  GOTO 3700
3200  FOR J=1 TO 32
3210  IF B$[I,I]=L$[J,J] THEN 3300
3220  NEXT J
3230  PRINT "UNRECOGNIZED CHARACTER IN COLUMN: ";I-1
3240  GOTO 2000
3300  IF J>26 THEN 3500
3310  FOR K=1 TO N
3320  IF L$[J,J]=V$[K,K] THEN 3400
3330  NEXT K
3350  LET N=N+1
3360  LET V$[N,N]=L$[J,J]
3370  LET V=V+1
3380  LET V[V]=N
3390  GOTO 3700
3400  LET V=V+1
3410  LET V[V]=K
3420  GOTO 3700
3500  IF P[J-26]>P[S[S]-26] THEN 3600
3510  LET V=V+1
3520  LET V[V]=S[S]
3530  LET S=S-1
3540  GOTO 3500
3600  LET S=S+1
3610  LET S[S]=J
3700  NEXT I
3750  PRINT '10"UNMATCHED LEFT PARENTHESIS"
3760  GOTO 2000
3970  REM
3980  REM     EXECUTION
3990  REM
4000  PRINT '10'10" ";A$
4010  PRINT '10'10;
4020  FOR I=1 TO N
4030  PRINT " ";V$[I,I];
4040  NEXT I
4050  PRINT "  EXP"
4060  FOR I=1 TO 2*N+6
4070  PRINT "-";
4080  NEXT I
4090  PRINT '10
4100  MAT I=ZER
4200  MAT S=ZER
4210  LET S=0
4240  FOR I=1 TO V
4260  IF V[I]>26 THEN 4300
4270  LET S=S+1
4280  LET S[S]=I[V[I]]
4290  GOTO 4500
4300  IF V[I]<32 THEN 4350
4310  LET S[S]= NOT S[S]
4320  GOTO 4500
4350  IF S>1 THEN 4400
4360  PRINT "ERROR, EMPTY PARENTHESIS"
4370  GOTO 2000
4400  GOTO V[I]-26 OF 4410,4420,4430,4440,4450
4410  LET S[S-1]=(S[S]=S[S-1])
4415  GOTO 4490
4420  LET S[S-1]=(S[S] >= S[S-1])
4425  GOTO 4490
4430  LET S[S-1]=(S[S]#S[S-1])
4435  GOTO 4490
4440  LET S[S-1]=(S[S] OR S[S-1])
4445  GOTO 4490
4450  LET S[S-1]=(S[S] AND S[S-1])
4490  LET S=S-1
4500  NEXT I
4510  IF S=1 THEN 4600
4520  PRINT '10"ERROR,  EXTRANEOUS CHARACTER"
4530  GOTO 2000
4570  REM
4580  REM     PRINT LINE
4590  REM
4600  FOR I=1 TO N
4610  IF I[I] THEN 4640
4620  PRINT " 0";
4630  GOTO 4650
4640  PRINT " 1";
4650  NEXT I
4670  PRINT "   ";
4680  IF S[1] THEN 4710
4690  PRINT "0"
4700  GOTO 4800
4710  PRINT "1"
4800  LET C=1
4810  FOR J=N TO 1 STEP -1
4820  IF I[J] THEN 4850
4830  LET I[J]=1
4840  GOTO 4900
4850  LET I[J]=0
4860  NEXT J
4870  LET C=0
4900  IF C THEN 4200
4910  PRINT '10'10'10'10;
4920  GOTO 2000
9000  REM
9010  DATA 1,2,3,3,4,5,0
9999  END 
