When I was taking MATH 381, Discrete Mathematics while I was a senior in high school, there ended up being more "busy work" than I expected, which was filling in truth tables. Basically evaluating, for every possible configuration of true/false variables, what the full statement evaluates to. I decided to write a little parser that determines it for you.

#### Sample output:

``````How many variables do you have?
3
How many other statements do you have?
0
p
q
r
p   q   r
true  true  true
true  false  true
true  true  false
true  false  false
false  true  true
false  false  true
false  true  false
false  false  false
```
```

#### Sample output 2:

``````
Input: ((p|~q)&r)|p
truetruetrue
truetruefalse
truefalsetrue
truefalsefalse
falsetruetrue
falsetruefalse
falsefalsetrue
falsefalsefalse
true
true
true
true
false
false
true
false
```
```

#### truthEval.java

``````import java.util.ArrayList;
import java.util.Scanner;

public class truthEval {

public boolean evaloriginal(String statement,boolean p,boolean q, boolean r){

boolean returnstatement=false;
char characters[] = new char[statement.length()];
statement.getChars(0, statement.length(), characters, 0);

int opens = 0;
int closes = 0;
for(int i=0; i<characters.length;i++){

if(characters[i]=='('){
opens++;
}
if(characters[i]==')'){
closes++;
}

if(opens==closes&&(characters[i]=='&'||characters[i]=='|')){
String left= statement.substring(0, i);
if(left.startsWith("(")){
left = (String) left.subSequence(1, left.length());
}
if(left.endsWith(")")){
left = (String) left.subSequence(0, left.length()-1);
}

String right=statement.substring(i+1,statement.length());
if(right.startsWith("(")){
right = (String) right.subSequence(1, right.length());
}
if(right.endsWith(")")){
right = (String) right.subSequence(0, right.length()-1);
}

char junction = characters[i];
returnstatement= eval(left,  right,  junction,  p, q,  r);
}

}
return returnstatement;

}

public boolean eval(String left, String right, char junction, boolean p,boolean q, boolean r){
boolean leftTruth=true;;
boolean rightTruth=true;
if(nested(left,p,q,r)){
leftTruth = evaloriginal(left,p,q,r);
}
if(nested(right,p,q,r)){
rightTruth =  evaloriginal(right,p,q,r);
}

if(left.equals("p")){
leftTruth=p;
}
if(left.equals("~p")){
leftTruth=!p;
}
if(right.equals("p")){
rightTruth=p;
}
if(right.equals("~p")){
rightTruth=!p;
}

if(left.equals("q")){
leftTruth=q;
}
if(left.equals("~q")){
leftTruth=!q;
}
if(right.equals("q")){
rightTruth=q;
}
if(right.equals("~q")){
rightTruth=!q;
}

if(left.equals("r")){
leftTruth=r;
}
if(left.equals("~r")){
leftTruth=!r;
}
if(right.equals("r")){
rightTruth=r;
}
if(right.equals("~r")){
rightTruth=!r;
}
if(junction=='>'&&(leftTruth&&!rightTruth)){
return false;
}
if(junction=='>'&&(leftTruth&&rightTruth)){
return true;
}
if(junction=='>'&&(!leftTruth)){
return true;
}

if(junction=='&'&&(rightTruth&&leftTruth)){
return true;
}

if(junction=='|'&&(rightTruth||leftTruth)){
return true;
} else{
return false;
}

}

public boolean nested(String side, boolean p,boolean q, boolean r){
boolean returnvalue = false;
char characters[] = new char[side.length()];
side.getChars(0, side.length(), characters, 0);
int opens = 0;
int closes = 0;
for(int i=0; i<characters.length;i++){

if(characters[i]=='('){
opens++;
}
if(characters[i]==')'){
closes++;
}

if(opens==closes&&(characters[i]=='&'||characters[i]=='|')){
returnvalue=true;
}

}
return returnvalue;

}

}
```
```

#### truthTableCreator.java

``````import java.util.Scanner;

public class truthTableCreator {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

Scanner scan = new Scanner(System.in);
System.out.println("How many variables do you have?");
int x= scan.nextInt();
System.out.println("How many other statements do you have?");
int y= scan.nextInt();

int number=1;
for(int i=0;i<x;i++){
number=number*2;
}

String truthTable[][]= new String [number+1][y+x];

for(int i=0;i<x;i++){
truthTable[0][i]=scan.next();
}
for(int i=x;i<y+x;i++){
truthTable[0][i]=scan.next();
}

int incrementor=1;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){

if(i==0){
truthTable[incrementor][0]="true";
}
else{
truthTable[incrementor][0]="false";

}
if(k==0){
truthTable[incrementor][1]="true";
}
else{
truthTable[incrementor][1]="false";

}
if(j==0){
truthTable[incrementor][2]="true";
}
else{
truthTable[incrementor][2]="false";

}
incrementor++;
}
}
}
int a=0;
while(a<y+x){
System.out.print("   "+truthTable[0][a]);
a++;
}
for(int i=1;i<number+1;i++){
System.out.println();
for(int j=0;j<y+x;j++){
System.out.print("  "+truthTable[i][j]);
}
}

}

}

```
```

#### truthTableGivenStatement.java

``````
public class truthTableGivenStatement {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
truthEval eval = new truthEval();
boolean truthTable[][]= new boolean [9][3];
int incrementor=0;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){

if(i==0){
truthTable[incrementor][0]=true;
}
else{
truthTable[incrementor][0]=false;

}
if(j==0){
truthTable[incrementor][1]=true;
}
else{
truthTable[incrementor][1]=false;

}

if(k==0){
truthTable[incrementor][2]=true;
}
else{
truthTable[incrementor][2]=false;

}

System.out.print(truthTable[incrementor][0]);
System.out.print(truthTable[incrementor][1]);
System.out.print(truthTable[incrementor][2]);
System.out.println();
incrementor++;

}
}
}

for(int i=0;i<8;i++){
System.out.println(eval.evaloriginal("((p|~q)&r)|p",  truthTable[i][0], truthTable[i][1],truthTable[i][2]));
}

}

}

```
```