Premise: ((P v Q) ^ (Q -> R) XOR (P ^ R)) <-> (R ^ Q) Conclusion: (P v R) Create
ID: 3686303 • Letter: P
Question
Premise: ((P v Q) ^ (Q -> R) XOR (P ^ R)) <-> (R ^ Q) Conclusion: (P v R) Create a C++ program that generates the truth table for this argument, and indicates if the argument is valid or invalid. If the argument is invalid, identify the row(s) in the truth table that prove the argument is not valid. Your program must be modularized so that the argument can be assessed when your program is graded. Some more hints: a. Create a premise function with 3 parameters for the 3 variables. This function returns the different values (0 or 1) passed to the expression ((P v Q) ^ (Q -> R) XOR (P ^ R)) <-> (R ^ Q). bool getPremise(bool p, bool q, bool r) b. Create a conclusion function with 3 parameters for the 3 variables. This function returns the different values (0 or 1) passed to the expression (P v R) bool getConclusion(bool p, bool r) { return (p || r); } c. Loop through all the various boolean value combinations of P, Q, R. a. Apply the P, Q and R boolean values to getPremise and getConclusion b. Print the results in a truth table set. d. Spot the invalid rows (where premise is true and conclusion is false), print them. a. Using truth tables to prove validity (video) b. Pages 58 – 59 Susanna Epp’s book, 4’th edition. c. Susanna Epp’s book’s ppt slides.
Explanation / Answer
The truth table for the given expression will be like :
(t - true , f - false)
C++ Code:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
int main()
{
bool p[8] = { true, true, true, true, false, false, false, false }; // Declare the init T/F values
bool q[8] = { true, true, false, false, true, true, false, false };
bool r[8] = { true, false, true, false, true, false, true, false };
std::string expression;
std::cout << "Enter expression (using ^ for AND, V for OR, X for XOR, and I for Implies (-->): ";
std::getline(std::cin, expression);
int i = 0;
int j = 0;
std::vector<std::string> exprVector;
for (std::string::iterator it = expression.begin; it != expression.end(); it++)
{
if (expression.at(i) == 'p')
{
exprVector[i] = "p[i]";
}
else if (expression.at(i) == 'q')
{
exprVector[i] = "q[i]";
}
else if (expression.at(i) == 'r')
{
exprVector[i] = "r[i]";
}
else if (expression.at(i) == '(')
{
exprVector[i] = "(";
}
else if (expression.at(i) == ')')
{
exprVector[i] = ") ";
}
else if (expression.at(i) == '^')
{
exprVector[i] = "&&";
}
else if (expression.at(i) == 'V')
{
exprVector[i] = "||";
}
else if (expression.at(i) == 'X')
{
char temp1;
char temp2;
i--;
if (exprVector[i] == "p[i]") // (p XOR q)
{
i++;
i++;
if (exprVector[i] == "q[i]")
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((p[i] || q[i]) && ((p[i] && q[i]) == false))";
}
else if (exprVector[i] == "r") // (p XOR r)
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((p[i] || r[i]) && ((p[i] && r[i]) == false))";
}
}
else if (exprVector[i] == "q") // (q XOR p)
{
i++;
i++;
if (exprVector[i] == "p")
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((q[i] || p[i]) && ((q[i] && p[i]) == false))";
}
else if (exprVector[i] == "r") // (q XOR r)
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((q[i] || r[i]) && ((q[i] && r[i]) == false))";
}
}
else if (exprVector[i] == "r")
{
i++;
i++;
if (exprVector[i] == "p") // (r XOR p)
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((r[i] || p[i]) && ((r[i] && p[i]) == false)";
}
if (exprVector[i] == "q") // (r XOR q)
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((r[i] || q[i]) && ((r[i] && q[i]) == false)";
}
}
}
else if (expression.at(i) == 'I')
{
if (exprVector[i] == "p[i]") // (p ---> q)
{
i++;
i++;
if (exprVector[i] == "q[i]")
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((p[i] == true) || (q[i] == false)";
}
else if (exprVector[i] == "r") // (p ---> r)
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((p[i] == true) || (r[i] == false)";
}
}
else if (exprVector[i] == "q") // (q ---> p)
{
i++;
i++;
if (exprVector[i] == "p")
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((q[i] == true) || (p[i] == false))";
}
else if (exprVector[i] == "r") // (q ---> r)
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((q[i] == true) || (r[i] == false))";
}
}
else if (exprVector[i] == "r")
{
i++;
i++;
if (exprVector[i] == "p") // (r ---> p)
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((r[i] == true) || (p[i] == false))";
}
if (exprVector[i] == "q") // (r ---> q)
{
i--;
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] = "((r[i] == true) || (q[i] == false))";
}
}
else if (expression.at(i) == '!')
{
i++
if (exprVector[i] == "p")
{
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] == "(p[i] == false)"
}
if (exprVector[i] == "q")
{
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] == "(p[i] == false)"
}
if (exprVector[i] == "r")
{
//clear vector[i] from exprVector
i--;
//clear vector[i] from exprVector
exprVector[i] == "(p[i] == false)"
}
}
else if (expression.at(i) == ' ')
{
}
i++;
j++;
}
}