6#include "../include/equivLaws.h"
9 {identity,
"Identity Law"},
10 {domination,
"Domination Law"},
11 {idempotent,
"Idempotent Law"},
12 {doubleNegation,
"Double Negation Law"},
13 {commutative,
"Commutative Law"},
14 {associative,
"Associative Law"},
15 {associativeReversed,
"Associative Law"},
16 {distributive,
"Distributive Law"},
17 {distributiveReversed,
"Distributive Law"},
18 {deMorgan,
"De Morgan's Law"},
19 {deMorganReversed,
"De Morgan's Law"},
20 {absorption,
"Absorption Law"},
21 {negation,
"Negation Law"},
25 {implication0,
"Implication Equivalence"},
26 {implication0Reversed,
"Implication Equivalence"},
27 {implication1,
"Implication Equivalence"},
28 {implication1Reversed,
"Implication Equivalence"},
29 {implication2,
"Implication Equivalence"},
30 {implication2Reversed,
"Implication Equivalence"},
31 {implication3,
"Implication Equivalence"},
32 {implication3Reversed,
"Implication Equivalence"},
33 {implication4,
"Implication Equivalence"},
34 {implication4Reversed,
"Implication Equivalence"},
35 {implication5,
"Implication Equivalence"},
36 {implication5Reversed,
"Implication Equivalence"},
37 {implication6,
"Implication Equivalence"},
38 {implication6Reversed,
"Implication Equivalence"},
39 {implication7,
"Implication Equivalence"},
40 {implication7Reversed,
"Implication Equivalence"},
41 {implication8,
"Implication Equivalence"},
42 {implication8Reversed,
"Implication Equivalence"},
45std::unordered_map<EquivLaws::EquivLaw, std::string>
47 {bidirectionalImplication0,
"Bidirectional Implication Equivalence"},
48 {bidirectionalImplication0Reversed,
"Bidirectional Implication Equivalence"},
49 {bidirectionalImplication1,
"Bidirectional Implication Equivalence"},
50 {bidirectionalImplication2,
"Bidirectional Implication Equivalence"},
51 {bidirectionalImplication2Reversed,
"Bidirectional Implication Equivalence"},
52 {bidirectionalImplication3,
"Bidirectional Implication Equivalence"},
53 {bidirectionalImplication3Reversed,
"Bidirectional Implication Equivalence"},
54 {bidirectionalImplication4,
"Bidirectional Implication Equivalence"},
55 {bidirectionalImplication4Reversed,
"Bidirectional Implication Equivalence"},
59 std::shared_ptr<Expression> newExpression)
61 std::shared_ptr<Expression> parent = expression->getParent();
62 if (parent ==
nullptr)
66 expression = newExpression;
67 expression->setParent(
nullptr);
73 if (parent->getLeft() == expression)
74 parent->setLeft(newExpression, parent);
76 parent->setRight(newExpression, parent);
77 expression = newExpression;
82 if (expression->getValue() ==
AND && expression->getRight()->getValue() ==
TRUE)
85 std::shared_ptr<Expression> parent = expression->getParent();
86 std::shared_ptr<Expression> newExpression = expression->getLeft();
88 replace(expression, newExpression);
91 else if (expression->getValue() ==
OR && expression->getRight()->getValue() ==
FALSE)
94 std::shared_ptr<Expression> parent = expression->getParent();
95 std::shared_ptr<Expression> newExpression = expression->getLeft();
97 replace(expression, newExpression);
106 if (expression->getValue() ==
AND && expression->getRight()->getValue() ==
FALSE)
109 std::shared_ptr<Expression> parent = expression->getParent();
110 std::shared_ptr<Expression> newExpression = expression->getRight();
112 replace(expression, newExpression);
116 else if (expression->getValue() ==
OR && expression->getRight()->getValue() ==
TRUE)
119 std::shared_ptr<Expression> parent = expression->getParent();
120 std::shared_ptr<Expression> newExpression = expression->getRight();
122 replace(expression, newExpression);
131 if (expression->getValue() ==
AND || expression->getValue() ==
OR)
134 std::shared_ptr<Expression> left = expression->getLeft();
135 std::shared_ptr<Expression> right = expression->getRight();
137 if (!left->compare(right))
141 std::shared_ptr<Expression> parent = expression->getParent();
142 std::shared_ptr<Expression> newExpression = expression->getLeft();
144 replace(expression, newExpression);
154 if (expression->getValue() ==
NOT &&
155 expression->getLeft()->getValue() ==
NOT)
158 std::shared_ptr<Expression> parent = expression->getParent();
159 std::shared_ptr<Expression> newExpression =
160 expression->getLeft()->getLeft();
162 replace(expression, newExpression);
171 if (expression->getValue() ==
AND || expression->getValue() ==
OR)
174 std::shared_ptr<Expression> left = expression->getLeft();
175 std::shared_ptr<Expression> right = expression->getRight();
178 std::shared_ptr<Expression> newExpression =
179 std::make_shared<Expression>(expression->getValue());
180 newExpression->setLeft(right, newExpression);
181 newExpression->setRight(left, newExpression);
183 replace(expression, newExpression);
193 if ((expression->getValue() ==
AND || expression->getValue() ==
OR) &&
194 expression->getLeft()->getValue() == expression->getValue())
196 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
197 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
198 std::shared_ptr<Expression> right = expression->getRight();
201 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(expression->getValue());
202 newExpression->setLeft(left1, newExpression);
203 newExpression->setRight(std::make_shared<Expression>(expression->getValue()), newExpression);
204 newExpression->getRight()->setLeft(left2, newExpression->getRight());
205 newExpression->getRight()->setRight(right, newExpression->getRight());
207 replace(expression, newExpression);
217 if ((expression->getValue() ==
AND || expression->getValue() ==
OR) && expression->getRight()->getValue() == expression->getValue())
219 std::shared_ptr<Expression> left = expression->getLeft();
220 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
221 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
224 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(expression->getValue());
225 newExpression->setLeft(std::make_shared<Expression>(expression->getValue()), newExpression);
226 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
227 newExpression->getLeft()->setRight(right1, newExpression->getLeft());
228 newExpression->setRight(right2, newExpression);
230 replace(expression, newExpression);
240 if (expression->getValue() ==
AND && expression->getRight()->getValue() ==
OR)
242 std::shared_ptr<Expression> left = expression->getLeft();
243 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
244 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
247 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
OR);
248 newExpression->setLeft(std::make_shared<Expression>(
AND), newExpression);
249 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
250 newExpression->getLeft()->setRight(right1, newExpression->getLeft());
251 newExpression->setRight(std::make_shared<Expression>(
AND), newExpression);
252 newExpression->getRight()->setLeft(left, newExpression->getRight());
253 newExpression->getRight()->setRight(right2, newExpression->getRight());
255 replace(expression, newExpression);
259 else if (expression->getValue() ==
OR && expression->getRight()->getValue() ==
AND)
261 std::shared_ptr<Expression> left = expression->getLeft();
262 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
263 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
266 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
AND);
267 newExpression->setLeft(std::make_shared<Expression>(
OR), newExpression);
268 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
269 newExpression->getLeft()->setRight(right1, newExpression->getLeft());
270 newExpression->setRight(std::make_shared<Expression>(
OR), newExpression);
271 newExpression->getRight()->setLeft(left, newExpression->getRight());
272 newExpression->getRight()->setRight(right2, newExpression->getRight());
274 replace(expression, newExpression);
284 if (expression->getValue() ==
AND && expression->getLeft()->getValue() ==
OR && expression->getRight()->getValue() ==
OR)
286 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
287 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
288 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
289 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
292 if (!left1->compare(right1))
296 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
OR);
297 newExpression->setLeft(left1, newExpression);
298 newExpression->setRight(std::make_shared<Expression>(
AND), newExpression);
299 newExpression->getRight()->setLeft(left2, newExpression->getRight());
300 newExpression->getRight()->setRight(right2, newExpression->getRight());
302 replace(expression, newExpression);
306 else if (expression->getValue() ==
OR && expression->getLeft()->getValue() ==
AND && expression->getRight()->getValue() ==
AND)
308 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
309 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
310 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
311 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
314 if (!left1->compare(right1))
318 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
AND);
319 newExpression->setLeft(left1, newExpression);
320 newExpression->setRight(std::make_shared<Expression>(
OR), newExpression);
321 newExpression->getRight()->setLeft(left2, newExpression->getRight());
322 newExpression->getRight()->setRight(right2, newExpression->getRight());
324 replace(expression, newExpression);
334 if (expression->getValue() ==
NOT)
336 if (expression->getLeft()->getValue() ==
OR)
338 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
339 std::shared_ptr<Expression> right = expression->getLeft()->getRight();
342 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
AND);
343 newExpression->setLeft(std::make_shared<Expression>(
NOT), newExpression);
344 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
345 newExpression->setRight(std::make_shared<Expression>(
NOT), newExpression);
346 newExpression->getRight()->setLeft(right, newExpression->getRight());
348 replace(expression, newExpression);
352 else if (expression->getLeft()->getValue() ==
AND)
354 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
355 std::shared_ptr<Expression> right = expression->getLeft()->getRight();
358 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
OR);
359 newExpression->setLeft(std::make_shared<Expression>(
NOT), newExpression);
360 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
361 newExpression->setRight(std::make_shared<Expression>(
NOT), newExpression);
362 newExpression->getRight()->setLeft(right, newExpression->getRight());
364 replace(expression, newExpression);
375 if (expression->getValue() ==
AND && expression->getLeft()->getValue() ==
NOT && expression->getRight()->getValue() ==
NOT)
377 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
378 std::shared_ptr<Expression> right = expression->getRight()->getLeft();
381 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
NOT);
382 newExpression->setLeft(std::make_shared<Expression>(
OR), newExpression);
383 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
384 newExpression->getLeft()->setRight(right, newExpression->getLeft());
386 replace(expression, newExpression);
390 else if (expression->getValue() ==
OR && expression->getLeft()->getValue() ==
NOT && expression->getRight()->getValue() ==
NOT)
392 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
393 std::shared_ptr<Expression> right = expression->getRight()->getLeft();
396 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
NOT);
397 newExpression->setLeft(std::make_shared<Expression>(
AND), newExpression);
398 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
399 newExpression->getLeft()->setRight(right, newExpression->getLeft());
401 replace(expression, newExpression);
411 if ((expression->getValue() ==
OR && expression->getRight()->getValue() ==
AND) || (expression->getValue() ==
AND && expression->getRight()->getValue() ==
OR))
414 std::shared_ptr<Expression> left1 = expression->getLeft();
415 std::shared_ptr<Expression> left2 = expression->getRight()->getLeft();
416 std::shared_ptr<Expression> right1 = expression->getRight()->getRight();
419 if (!left1->compare(left2))
432 if (expression->getValue() ==
OR && expression->getRight()->getValue() ==
NOT)
434 std::shared_ptr<Expression> left = expression->getLeft();
435 std::shared_ptr<Expression> right = expression->getRight()->getLeft();
436 if (!left->compare(right))
440 replace(expression, std::make_shared<Expression>(
TRUE));
444 else if (expression->getValue() ==
AND && expression->getRight()->getValue() ==
NOT)
446 std::shared_ptr<Expression> left = expression->getLeft();
447 std::shared_ptr<Expression> right = expression->getRight()->getLeft();
448 if (!left->compare(right))
452 replace(expression, std::make_shared<Expression>(
FALSE));
462 if (expression->getValue() ==
IMPLIES)
464 std::shared_ptr<Expression> left = expression->getLeft();
465 std::shared_ptr<Expression> right = expression->getRight();
468 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
OR);
469 newExpression->setLeft(std::make_shared<Expression>(
NOT), newExpression);
470 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
471 newExpression->setRight(right, newExpression);
473 replace(expression, newExpression);
483 if (expression->getValue() ==
OR && expression->getLeft()->getValue() ==
NOT)
485 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
486 std::shared_ptr<Expression> right = expression->getRight();
489 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IMPLIES);
490 newExpression->setLeft(left, newExpression);
491 newExpression->setRight(right, newExpression);
493 replace(expression, newExpression);
503 if (expression->getValue() ==
IMPLIES)
505 std::shared_ptr<Expression> left = expression->getLeft();
506 std::shared_ptr<Expression> right = expression->getRight();
509 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IMPLIES);
510 newExpression->setLeft(std::make_shared<Expression>(
NOT), newExpression);
511 newExpression->getLeft()->setLeft(right, newExpression->getLeft());
512 newExpression->setRight(std::make_shared<Expression>(
NOT), newExpression);
513 newExpression->getRight()->setLeft(left, newExpression->getRight());
515 replace(expression, newExpression);
525 if (expression->getValue() ==
IMPLIES && expression->getLeft()->getValue() ==
NOT && expression->getRight()->getValue() ==
NOT)
527 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
528 std::shared_ptr<Expression> right = expression->getRight()->getLeft();
531 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IMPLIES);
532 newExpression->setLeft(right, newExpression);
533 newExpression->setRight(left, newExpression);
535 replace(expression, newExpression);
545 if (expression->getValue() ==
OR)
547 std::shared_ptr<Expression> left = expression->getLeft();
548 std::shared_ptr<Expression> right = expression->getRight();
551 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IMPLIES);
552 newExpression->setLeft(std::make_shared<Expression>(
NOT), newExpression);
553 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
554 newExpression->setRight(right, newExpression);
556 replace(expression, newExpression);
566 if (expression->getValue() ==
IMPLIES && expression->getLeft()->getValue() ==
NOT)
568 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
569 std::shared_ptr<Expression> right = expression->getRight();
572 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
OR);
573 newExpression->setLeft(left, newExpression);
574 newExpression->setRight(right, newExpression);
576 replace(expression, newExpression);
586 if (expression->getValue() ==
AND)
588 std::shared_ptr<Expression> left = expression->getLeft();
589 std::shared_ptr<Expression> right = expression->getRight();
592 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
NOT);
593 newExpression->setLeft(std::make_shared<Expression>(
IMPLIES), newExpression);
594 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
595 newExpression->getLeft()->setRight(std::make_shared<Expression>(
NOT), newExpression->getLeft());
596 newExpression->getLeft()->getRight()->setLeft(right, newExpression->getLeft()->getRight());
598 replace(expression, newExpression);
608 if (expression->getValue() ==
NOT && expression->getLeft()->getValue() ==
IMPLIES && expression->getLeft()->getRight()->getValue() ==
NOT)
610 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
611 std::shared_ptr<Expression> right = expression->getLeft()->getRight()->getLeft();
614 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
AND);
615 newExpression->setLeft(left, newExpression);
616 newExpression->setRight(right, newExpression);
618 replace(expression, newExpression);
628 if (expression->getValue() ==
NOT && expression->getLeft()->getValue() ==
IMPLIES)
630 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
631 std::shared_ptr<Expression> right = expression->getLeft()->getRight();
634 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
AND);
635 newExpression->setLeft(left, newExpression);
636 newExpression->setRight(std::make_shared<Expression>(
NOT), newExpression);
637 newExpression->getRight()->setLeft(right, newExpression->getRight());
639 replace(expression, newExpression);
649 if (expression->getValue() ==
AND && expression->getRight()->getValue() ==
NOT)
651 std::shared_ptr<Expression> left = expression->getLeft();
652 std::shared_ptr<Expression> right = expression->getRight()->getLeft();
655 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
NOT);
656 newExpression->setLeft(std::make_shared<Expression>(
IMPLIES), newExpression);
657 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
658 newExpression->getLeft()->setRight(right, newExpression->getLeft());
660 replace(expression, newExpression);
670 if (expression->getValue() ==
AND && expression->getLeft()->getValue() ==
IMPLIES && expression->getRight()->getValue() ==
IMPLIES)
672 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
673 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
674 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
675 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
678 if (!left1->compare(right1))
682 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IMPLIES);
683 newExpression->setLeft(left1, newExpression);
684 newExpression->setRight(std::make_shared<Expression>(
AND), newExpression);
685 newExpression->getRight()->setLeft(left2, newExpression->getRight());
686 newExpression->getRight()->setRight(right2, newExpression->getRight());
688 replace(expression, newExpression);
698 if (expression->getValue() ==
IMPLIES && expression->getRight()->getValue() ==
AND)
700 std::shared_ptr<Expression> left = expression->getLeft();
701 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
702 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
705 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
AND);
706 newExpression->setLeft(std::make_shared<Expression>(
IMPLIES), newExpression);
707 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
708 newExpression->getLeft()->setRight(right1, newExpression->getLeft());
709 newExpression->setRight(std::make_shared<Expression>(
IMPLIES), newExpression);
710 newExpression->getRight()->setLeft(left, newExpression->getRight());
711 newExpression->getRight()->setRight(right2, newExpression->getRight());
713 replace(expression, newExpression);
723 if (expression->getValue() ==
AND && expression->getLeft()->getValue() ==
IMPLIES && expression->getRight()->getValue() ==
IMPLIES)
725 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
726 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
727 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
728 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
731 if (!left2->compare(right1))
735 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IMPLIES);
736 newExpression->setLeft(std::make_shared<Expression>(
OR), newExpression);
737 newExpression->getLeft()->setLeft(left1, newExpression->getLeft());
738 newExpression->getLeft()->setRight(left2, newExpression->getLeft());
739 newExpression->setRight(right2, newExpression);
741 replace(expression, newExpression);
751 if (expression->getValue() ==
IMPLIES && expression->getLeft()->getValue() ==
OR)
753 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
754 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
755 std::shared_ptr<Expression> right = expression->getRight();
758 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
AND);
759 newExpression->setLeft(std::make_shared<Expression>(
IMPLIES), newExpression);
760 newExpression->getLeft()->setLeft(left1, newExpression->getLeft());
761 newExpression->getLeft()->setRight(left2, newExpression->getLeft());
762 newExpression->setRight(std::make_shared<Expression>(
IMPLIES), newExpression);
763 newExpression->getRight()->setLeft(left2, newExpression->getRight());
764 newExpression->getRight()->setRight(right, newExpression->getRight());
766 replace(expression, newExpression);
776 if (expression->getValue() ==
OR && expression->getLeft()->getValue() ==
IMPLIES && expression->getRight()->getValue() ==
IMPLIES)
778 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
779 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
780 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
781 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
784 if (!left1->compare(right1))
788 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IMPLIES);
789 newExpression->setLeft(left1, newExpression);
790 newExpression->setRight(std::make_shared<Expression>(
OR), newExpression);
791 newExpression->getRight()->setLeft(left2, newExpression->getRight());
792 newExpression->getRight()->setRight(right2, newExpression->getRight());
794 replace(expression, newExpression);
804 if (expression->getValue() ==
IMPLIES && expression->getRight()->getValue() ==
OR)
806 std::shared_ptr<Expression> left = expression->getLeft();
807 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
808 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
811 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
OR);
812 newExpression->setLeft(std::make_shared<Expression>(
IMPLIES), newExpression);
813 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
814 newExpression->getLeft()->setRight(right1, newExpression->getLeft());
815 newExpression->setRight(std::make_shared<Expression>(
IMPLIES), newExpression);
816 newExpression->getRight()->setLeft(left, newExpression->getRight());
817 newExpression->getRight()->setRight(right2, newExpression->getRight());
819 replace(expression, newExpression);
829 if (expression->getValue() ==
OR && expression->getLeft()->getValue() ==
IMPLIES && expression->getRight()->getValue() ==
IMPLIES)
831 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
832 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
833 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
834 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
837 if (!left2->compare(right1))
841 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IMPLIES);
842 newExpression->setLeft(std::make_shared<Expression>(
AND), newExpression);
843 newExpression->getLeft()->setLeft(left1, newExpression->getLeft());
844 newExpression->getLeft()->setRight(left2, newExpression->getLeft());
845 newExpression->setRight(right2, newExpression);
847 replace(expression, newExpression);
857 if (expression->getValue() ==
IMPLIES && expression->getLeft()->getValue() ==
AND)
859 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
860 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
861 std::shared_ptr<Expression> right = expression->getRight();
864 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
OR);
865 newExpression->setLeft(std::make_shared<Expression>(
IMPLIES), newExpression);
866 newExpression->getLeft()->setLeft(left1, newExpression->getLeft());
867 newExpression->getLeft()->setRight(left2, newExpression->getLeft());
868 newExpression->setRight(std::make_shared<Expression>(
IMPLIES), newExpression);
869 newExpression->getRight()->setLeft(left2, newExpression->getRight());
870 newExpression->getRight()->setRight(right, newExpression->getRight());
872 replace(expression, newExpression);
882 if (expression->getValue() ==
IFF)
884 std::shared_ptr<Expression> left = expression->getLeft();
885 std::shared_ptr<Expression> right = expression->getRight();
888 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
AND);
889 newExpression->setLeft(std::make_shared<Expression>(
IMPLIES), newExpression);
890 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
891 newExpression->getLeft()->setRight(right, newExpression->getLeft());
892 newExpression->setRight(std::make_shared<Expression>(
IMPLIES), newExpression);
893 newExpression->getRight()->setLeft(right, newExpression->getRight());
894 newExpression->getRight()->setRight(left, newExpression->getRight());
896 replace(expression, newExpression);
906 if (expression->getValue() ==
AND && expression->getLeft()->getValue() ==
IMPLIES && expression->getRight()->getValue() ==
IMPLIES)
908 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
909 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
910 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft();
911 std::shared_ptr<Expression> right2 = expression->getRight()->getRight();
914 if (!left2->compare(right1))
918 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IFF);
919 newExpression->setLeft(left1, newExpression);
920 newExpression->setRight(left2, newExpression);
922 replace(expression, newExpression);
932 if (expression->getValue() ==
IFF)
934 std::shared_ptr<Expression> left = expression->getLeft();
935 std::shared_ptr<Expression> right = expression->getRight();
938 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IFF);
939 newExpression->setLeft(right, newExpression);
940 newExpression->setRight(left, newExpression);
942 replace(expression, newExpression);
952 if (expression->getValue() ==
IFF)
954 std::shared_ptr<Expression> left = expression->getLeft();
955 std::shared_ptr<Expression> right = expression->getRight();
958 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IFF);
959 newExpression->setLeft(std::make_shared<Expression>(
NOT), newExpression);
960 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
961 newExpression->setRight(std::make_shared<Expression>(
NOT), newExpression);
962 newExpression->getRight()->setLeft(right, newExpression->getRight());
964 replace(expression, newExpression);
974 if (expression->getValue() ==
IFF && expression->getLeft()->getValue() ==
NOT && expression->getRight()->getValue() ==
NOT)
976 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
977 std::shared_ptr<Expression> right = expression->getRight()->getLeft();
980 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IFF);
981 newExpression->setLeft(left, newExpression);
982 newExpression->setRight(right, newExpression);
984 replace(expression, newExpression);
994 if (expression->getValue() ==
IFF)
996 std::shared_ptr<Expression> left = expression->getLeft();
997 std::shared_ptr<Expression> right = expression->getRight();
1000 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
OR);
1001 newExpression->setLeft(std::make_shared<Expression>(
AND), newExpression);
1002 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
1003 newExpression->getLeft()->setRight(right, newExpression->getLeft());
1004 newExpression->setRight(std::make_shared<Expression>(
AND), newExpression);
1005 newExpression->getRight()->setLeft(std::make_shared<Expression>(
NOT), newExpression->getRight());
1006 newExpression->getRight()->getLeft()->setLeft(left, newExpression->getRight()->getLeft());
1007 newExpression->getRight()->setRight(std::make_shared<Expression>(
NOT), newExpression->getRight());
1008 newExpression->getRight()->getRight()->setLeft(right, newExpression->getRight()->getRight());
1010 replace(expression, newExpression);
1020 if (expression->getValue() ==
OR && expression->getLeft()->getValue() ==
AND && expression->getRight()->getValue() ==
AND)
1022 std::shared_ptr<Expression> left1 = expression->getLeft()->getLeft();
1023 std::shared_ptr<Expression> left2 = expression->getLeft()->getRight();
1024 std::shared_ptr<Expression> right1 = expression->getRight()->getLeft()->getLeft();
1025 std::shared_ptr<Expression> right2 = expression->getRight()->getRight()->getLeft();
1028 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IFF);
1029 newExpression->setLeft(left1, newExpression);
1030 newExpression->setRight(left2, newExpression);
1032 replace(expression, newExpression);
1042 if (expression->getValue() ==
NOT && expression->getLeft()->getValue() ==
IFF)
1044 std::shared_ptr<Expression> left = expression->getLeft()->getLeft();
1045 std::shared_ptr<Expression> right = expression->getLeft()->getRight();
1048 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
IFF);
1049 newExpression->setLeft(left, newExpression);
1050 newExpression->setRight(std::make_shared<Expression>(
NOT), newExpression);
1051 newExpression->getRight()->setLeft(right, newExpression->getRight());
1053 replace(expression, newExpression);
1063 if (expression->getValue() ==
IFF && expression->getRight()->getValue() ==
NOT)
1065 std::shared_ptr<Expression> left = expression->getLeft();
1066 std::shared_ptr<Expression> right = expression->getRight()->getLeft();
1069 std::shared_ptr<Expression> newExpression = std::make_shared<Expression>(
NOT);
1070 newExpression->setLeft(std::make_shared<Expression>(
IFF), newExpression);
1071 newExpression->getLeft()->setLeft(left, newExpression->getLeft());
1072 newExpression->getLeft()->setRight(right, newExpression->getLeft());
1074 replace(expression, newExpression);
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.
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.