LogiXpr
Loading...
Searching...
No Matches
equivLaws.h
Go to the documentation of this file.
1
6#pragma once
7
8#include "expression.h"
9#include <unordered_map>
10
11
15class EquivLaws {
16public:
24 typedef bool (*EquivLaw)(std::shared_ptr<Expression> &);
25
29 static std::unordered_map<EquivLaw, std::string> laws;
30
34 static std::unordered_map<EquivLaw, std::string> implications;
35
39 static std::unordered_map<EquivLaw, std::string> bidirectionalImplications;
40
47 static void replace(std::shared_ptr<Expression> &expression, std::shared_ptr<Expression> newExpression);
48
57 static bool identity(std::shared_ptr<Expression> &expression);
58
67 static bool domination(std::shared_ptr<Expression> &expression);
68
77 static bool idempotent(std::shared_ptr<Expression> &expression);
78
87 static bool doubleNegation(std::shared_ptr<Expression> &expression);
88
97 static bool commutative(std::shared_ptr<Expression> &expression);
98
107 static bool associative(std::shared_ptr<Expression> &expression);
108
119 static bool associativeReversed(std::shared_ptr<Expression> &expression);
120
129 static bool distributive(std::shared_ptr<Expression> &expression);
130
141 static bool distributiveReversed(std::shared_ptr<Expression> &expression);
142
151 static bool deMorgan(std::shared_ptr<Expression> &expression);
152
163 static bool deMorganReversed(std::shared_ptr<Expression> &expression);
164
173 static bool absorption(std::shared_ptr<Expression> &expression);
174
183 static bool negation(std::shared_ptr<Expression> &expression);
184
192 static bool implication0(std::shared_ptr<Expression> &expression);
193
204 static bool implication0Reversed(std::shared_ptr<Expression> &expression);
205
213 static bool implication1(std::shared_ptr<Expression> &expression);
214
223 static bool implication1Reversed(std::shared_ptr<Expression> &expression);
224
232 static bool implication2(std::shared_ptr<Expression> &expression);
233
244 static bool implication2Reversed(std::shared_ptr<Expression> &expression);
245
253 static bool implication3(std::shared_ptr<Expression> &expression);
254
265 static bool implication3Reversed(std::shared_ptr<Expression> &expression);
266
274 static bool implication4(std::shared_ptr<Expression> &expression);
275
286 static bool implication4Reversed(std::shared_ptr<Expression> &expression);
287
295 static bool implication5(std::shared_ptr<Expression> &expression);
296
307 static bool implication5Reversed(std::shared_ptr<Expression> &expression);
308
316 static bool implication6(std::shared_ptr<Expression> &expression);
317
328 static bool implication6Reversed(std::shared_ptr<Expression> &expression);
329
337 static bool implication7(std::shared_ptr<Expression> &expression);
338
349 static bool implication7Reversed(std::shared_ptr<Expression> &expression);
350
358 static bool implication8(std::shared_ptr<Expression> &expression);
359
370 static bool implication8Reversed(std::shared_ptr<Expression> &expression);
371
379 static bool bidirectionalImplication0(std::shared_ptr<Expression> &expression);
380
391 static bool bidirectionalImplication0Reversed(std::shared_ptr<Expression> &expression);
392
400 static bool bidirectionalImplication1(std::shared_ptr<Expression> &expression);
401
409 static bool bidirectionalImplication2(std::shared_ptr<Expression> &expression);
410
421 static bool bidirectionalImplication2Reversed(std::shared_ptr<Expression> &expression);
422
430 static bool bidirectionalImplication3(std::shared_ptr<Expression> &expression);
431
442 static bool bidirectionalImplication3Reversed(std::shared_ptr<Expression> &expression);
443
451 static bool bidirectionalImplication4(std::shared_ptr<Expression> &expression);
452
463 static bool bidirectionalImplication4Reversed(std::shared_ptr<Expression> &expression);
464};
Class that handles equivalence laws.
Definition equivLaws.h:15
static std::unordered_map< EquivLaw, std::string > implications
Map of implication equivalences to their string representations.
Definition equivLaws.h:24
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.
Definition equivLaws.h:8
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.
Definition equivLaws.cpp:58
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.
Definition equivLaws.h:46
static bool identity(std::shared_ptr< Expression > &expression)
Applies the identity law (p & T) = p, (p | F) = p.
Definition equivLaws.cpp:80
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.
Definition equivLaws.h:24
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.