9#include <unordered_map>
24 typedef bool (*
EquivLaw)(std::shared_ptr<Expression> &);
29 static std::unordered_map<EquivLaw, std::string>
laws;
34 static std::unordered_map<EquivLaw, std::string>
implications;
47 static void replace(std::shared_ptr<Expression> &expression, std::shared_ptr<Expression> newExpression);
57 static bool identity(std::shared_ptr<Expression> &expression);
67 static bool domination(std::shared_ptr<Expression> &expression);
77 static bool idempotent(std::shared_ptr<Expression> &expression);
87 static bool doubleNegation(std::shared_ptr<Expression> &expression);
97 static bool commutative(std::shared_ptr<Expression> &expression);
107 static bool associative(std::shared_ptr<Expression> &expression);
129 static bool distributive(std::shared_ptr<Expression> &expression);
151 static bool deMorgan(std::shared_ptr<Expression> &expression);
173 static bool absorption(std::shared_ptr<Expression> &expression);
183 static bool negation(std::shared_ptr<Expression> &expression);
192 static bool implication0(std::shared_ptr<Expression> &expression);
213 static bool implication1(std::shared_ptr<Expression> &expression);
232 static bool implication2(std::shared_ptr<Expression> &expression);
253 static bool implication3(std::shared_ptr<Expression> &expression);
274 static bool implication4(std::shared_ptr<Expression> &expression);
295 static bool implication5(std::shared_ptr<Expression> &expression);
316 static bool implication6(std::shared_ptr<Expression> &expression);
337 static bool implication7(std::shared_ptr<Expression> &expression);
358 static bool implication8(std::shared_ptr<Expression> &expression);
Class that handles equivalence laws.
static std::unordered_map< EquivLaw, std::string > implications
Map of implication equivalences to their string representations.
static bool implication6(std::shared_ptr< Expression > &expression)
Applies implication: (p -> q) & (q -> r) = (p | q) -> r.
static bool bidirectionalImplication0(std::shared_ptr< Expression > &expression)
Applies bidirectional implication: p <-> q = (p -> q) & (q -> p)
static bool implication2Reversed(std::shared_ptr< Expression > &expression)
Applies implication2() but reversed !p -> q = p | q.
static bool implication3Reversed(std::shared_ptr< Expression > &expression)
Applies implication3() but reversed !(p -> !q) = p & q.
static bool bidirectionalImplication3(std::shared_ptr< Expression > &expression)
Applies bidirectional implication: p <-> q = (p & q) | (!p & !q)
static std::unordered_map< EquivLaw, std::string > laws
Map of equivalence laws to their string representations.
static bool bidirectionalImplication2Reversed(std::shared_ptr< Expression > &expression)
Applies bidirectionalImplication2() but reversed !p <-> !q = p <-> q.
static bool implication8Reversed(std::shared_ptr< Expression > &expression)
Applies implication8() but reversed (p & q) -> r = (p -> q) | (q -> r)
static bool distributive(std::shared_ptr< Expression > &expression)
Applies distributive law p | (q & r) = (p | q) & (p | r), p & (q | r) = (p & q) | (p & r)
static bool implication7(std::shared_ptr< Expression > &expression)
Applies implication: (p -> q) | (p -> r) = p -> (q | r)
static bool commutative(std::shared_ptr< Expression > &expression)
Applies the commutative law (p | q) = (q | p), (p & q) = (q & p)
static bool domination(std::shared_ptr< Expression > &expression)
Applies the domination law (p | T) = T, (p & F) = F.
static void replace(std::shared_ptr< Expression > &expression, std::shared_ptr< Expression > newExpression)
Replace the current expression with the new expression.
static bool associative(std::shared_ptr< Expression > &expression)
Applies the associative law (p | q) | r = p | (q | r), (p & q) & r = p & (q & r)
static bool implication0Reversed(std::shared_ptr< Expression > &expression)
Applies implication0() but reversed !p | q = p -> q.
static bool implication0(std::shared_ptr< Expression > &expression)
Applies implication: p -> q = !p | q.
static bool implication5(std::shared_ptr< Expression > &expression)
Applies implication: (p -> q) & (p -> r) = p -> (q & r)
static bool implication6Reversed(std::shared_ptr< Expression > &expression)
Applies implication6() but reversed (p | q) -> r = (p -> q) & (q -> r)
static bool absorption(std::shared_ptr< Expression > &expression)
Applies the absorption law p | (p & q) = p, p & (p | q) = p.
static bool idempotent(std::shared_ptr< Expression > &expression)
Applies the idempotent law (p | p) = p, (p & p) = p.
static bool distributiveReversed(std::shared_ptr< Expression > &expression)
Applies distributive() but reversed (p | q) & (p | r) = p | (q & r), (p & q) | (p & r) = p & (q | r)
static bool implication1(std::shared_ptr< Expression > &expression)
Applies implication: p -> q = !q -> !p.
static bool implication3(std::shared_ptr< Expression > &expression)
Applies implication: p & q = !(p -> !q)
static bool bidirectionalImplication2(std::shared_ptr< Expression > &expression)
Applies bidirectional implication: p <-> q = !p <-> !q.
static bool implication7Reversed(std::shared_ptr< Expression > &expression)
Applies implication7() but reversed p -> (q | r) = (p -> q) | (p -> r)
static bool implication2(std::shared_ptr< Expression > &expression)
Applies implication: p | q = !p -> q.
static std::unordered_map< EquivLaw, std::string > bidirectionalImplications
Map of biimplication equivalences to their string representations.
static bool identity(std::shared_ptr< Expression > &expression)
Applies the identity law (p & T) = p, (p | F) = p.
static bool implication1Reversed(std::shared_ptr< Expression > &expression)
Applies implication1() but reversed !q -> !p = p -> q.
static bool deMorganReversed(std::shared_ptr< Expression > &expression)
Applies deMorgan() but reversed !p & !q = !(p | q), !p | !q = !(p & q)
static bool implication5Reversed(std::shared_ptr< Expression > &expression)
Applies implication5() but reversed p -> (q & r) = (p -> q) & (p -> r)
static bool associativeReversed(std::shared_ptr< Expression > &expression)
Applies associative() but reversed p | (q | r) = (p | q) | r, p & (q & r) = (p & q) & r.
static bool implication4Reversed(std::shared_ptr< Expression > &expression)
Applies implication4() but reversed p & !q = !(p -> q)
static bool implication4(std::shared_ptr< Expression > &expression)
Applies implication: !(p -> q) = p & !q.
static bool bidirectionalImplication1(std::shared_ptr< Expression > &expression)
Applies bidirectional implication: p <-> q = q <-> p.
bool(* EquivLaw)(std::shared_ptr< Expression > &)
Function pointer type for an equivalence law.
static bool bidirectionalImplication4Reversed(std::shared_ptr< Expression > &expression)
Applies bidirectionalImplication4() but reversed p <-> !q = !(p <-> q)
static bool deMorgan(std::shared_ptr< Expression > &expression)
Applies De Morgan's law !(p | q) = !p & !q, !(p & q) = !p | !q.
static bool implication8(std::shared_ptr< Expression > &expression)
Applies implication: (p -> q) | (q -> r) = (p & q) -> r.
static bool negation(std::shared_ptr< Expression > &expression)
Applies the negation law p | !p = T, p & !p = F.
static bool bidirectionalImplication3Reversed(std::shared_ptr< Expression > &expression)
Applies bidirectionalImplication3() but reversed (p & q) | (!p & !q) = p <-> q.
static bool bidirectionalImplication0Reversed(std::shared_ptr< Expression > &expression)
Applies bidirectionalImplication0() but reversed (p -> q) & (q -> p) = p <-> q.
static bool bidirectionalImplication4(std::shared_ptr< Expression > &expression)
Applies bidirectional implication: !(p <-> q) = p <-> !q.
static bool doubleNegation(std::shared_ptr< Expression > &expression)
Applies the double negation law !!p = p.
Header file for expression class.