LogiXpr
Loading...
Searching...
No Matches
evaluator.cpp
Go to the documentation of this file.
1
6#include "../include/evaluator.h"
7
8std::vector<std::unordered_map<std::string, bool>> getTruthTableInputs(std::shared_ptr<Expression> lhs, std::shared_ptr<Expression> rhs)
9{
10 std::set<std::string> variables = lhs->getVariables();
11 std::set<std::string> rhsVariables = rhs->getVariables();
12 variables.insert(rhsVariables.begin(), rhsVariables.end());
13
14 std::vector<std::unordered_map<std::string, bool>> inputs;
15
16 for (int i = 0; i < std::pow(2, variables.size()); i++)
17 {
18 std::unordered_map<std::string, bool> input;
19 int state = i;
20 for (auto variable : variables)
21 {
22 input[variable] = state % 2;
23 state /= 2;
24 }
25 inputs.push_back(input);
26 }
27
28 return inputs;
29}
30
31bool evaluateExpression(std::shared_ptr<Expression> expression, std::unordered_map<std::string, bool> inputs)
32{
33 if (expression == nullptr)
34 return false;
35
36 std::string value = expression->getValue();
37
38 if (value == TRUE)
39 return true;
40 if (value == FALSE)
41 return false;
42 if (expression->isVar())
43 return inputs[expression->getValue()]; // leaf node
44 if (value == AND)
45 return evaluateExpression(expression->getLeft(), inputs) && evaluateExpression(expression->getRight(), inputs);
46 if (value == OR)
47 return evaluateExpression(expression->getLeft(), inputs) || evaluateExpression(expression->getRight(), inputs);
48 if (value == NOT)
49 return !evaluateExpression(expression->getLeft(), inputs);
50 if (value == XOR)
51 return evaluateExpression(expression->getLeft(), inputs) != evaluateExpression(expression->getRight(), inputs);
52 if (value == IMPLIES)
53 return !evaluateExpression(expression->getLeft(), inputs) || evaluateExpression(expression->getRight(), inputs);
54 if (value == IFF)
55 return evaluateExpression(expression->getLeft(), inputs) == evaluateExpression(expression->getRight(), inputs);
56
57 return false;
58}
59
60bool isEquivalent(std::shared_ptr<Expression> lhs, std::shared_ptr<Expression> rhs)
61{
62 std::vector<std::unordered_map<std::string, bool>> inputs = getTruthTableInputs(lhs, rhs);
63
64 for (auto input : inputs)
65 {
66 if (evaluateExpression(lhs, input) != evaluateExpression(rhs, input))
67 return false;
68 }
69
70 return true;
71}
std::vector< std::unordered_map< std::string, bool > > getTruthTableInputs(std::shared_ptr< Expression > lhs, std::shared_ptr< Expression > rhs)
Generate the truth table inputs for the given expressions.
Definition evaluator.cpp:8
bool isEquivalent(std::shared_ptr< Expression > lhs, std::shared_ptr< Expression > rhs)
Check if two expressions are equivalent.
Definition evaluator.cpp:60
bool evaluateExpression(std::shared_ptr< Expression > expression, std::unordered_map< std::string, bool > inputs)
Evaluate the expression with the given inputs.
Definition evaluator.cpp:31
#define IMPLIES
Definition expression.h:25
#define IFF
Definition expression.h:26
#define OR
Definition expression.h:22
#define XOR
Definition expression.h:24
#define TRUE
Definition expression.h:29
#define FALSE
Definition expression.h:30
#define AND
Definition expression.h:21
#define NOT
Definition expression.h:23