aboutsummaryrefslogtreecommitdiffstats
path: root/libnormalform_or2.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2024-07-19 01:29:42 +0200
committerMattias Andrée <maandree@kth.se>2024-07-19 01:29:42 +0200
commit4294ec0ed06ee34920c9edaeebaeb8b65c720791 (patch)
treee0cded59452597c04fb38f403745a384675cb5f9 /libnormalform_or2.c
downloadlibnormalform-4294ec0ed06ee34920c9edaeebaeb8b65c720791.tar.gz
libnormalform-4294ec0ed06ee34920c9edaeebaeb8b65c720791.tar.bz2
libnormalform-4294ec0ed06ee34920c9edaeebaeb8b65c720791.tar.xz
First commit
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r--libnormalform_or2.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/libnormalform_or2.c b/libnormalform_or2.c
new file mode 100644
index 0000000..51ed628
--- /dev/null
+++ b/libnormalform_or2.c
@@ -0,0 +1,82 @@
+/* See LICENSE file for copyright and license details. */
+#ifndef TEST
+#include "common.h"
+
+
+LIBNORMALFORM_SENTENCE *
+(libnormalform_or2)(LIBNORMALFORM_SENTENCE *l, LIBNORMALFORM_SENTENCE *r)
+{
+ LIBNORMALFORM_SENTENCE *ll, *lr;
+ LIBNORMALFORM_SENTENCE *rl, *rr;
+ int inv;
+
+ if (!l || !r) {
+ libnormalform_free(l);
+ libnormalform_free(r);
+ return NULL;
+ }
+
+ if (l->equals(l, r, &inv)) {
+ if (!inv) {
+ /* x ∨ x = x */
+ goto return_either;
+
+ } else {
+ /* x ∨ ¬x = 1 */
+ libnormalform_free(l);
+ libnormalform_free(r);
+ return libnormalform_true();
+ }
+
+ } else if (l->type == TYPE_TRUE || r->type == TYPE_FALSE) {
+ /* 1 ∨ x = 1 */
+ /* x ∨ 0 = x */
+ return_either:
+ libnormalform_free(r);
+ return l;
+
+ } else if (r->type == TYPE_TRUE || l->type == TYPE_FALSE) {
+ /* x ∨ 1 = 1 */
+ /* 0 ∨ x = x */
+ libnormalform_free(l);
+ return r;
+
+ } else if (l->hash == r->hash && l->type == TYPE_AND && r->type == TYPE_AND) {
+ /* (x ∧ ¬y) ∨ (¬x ∧ y) = x ⊕ y */
+ ll = l->data.binary.l;
+ lr = l->data.binary.r;
+ rl = r->data.binary.l;
+ rr = r->data.binary.r;
+ if (ll->hash != rl->hash || lr->hash != rr->hash)
+ goto fallback;
+ if (!ll->equals(ll, rl, &inv)) {
+ if (ll->hash == lr->hash) {
+ rl = r->data.binary.r;
+ rr = r->data.binary.l;
+ if (!ll->equals(ll, rl, &inv))
+ goto fallback;
+ } else {
+ goto fallback;
+ }
+ }
+ if (!inv || !lr->equals(lr, rr, &inv) || !inv)
+ goto fallback;
+ l->data.binary.l = NULL;
+ r->data.binary.r = NULL;
+ libnormalform_free(l);
+ libnormalform_free(r);
+ return libnormalform_xor2__(ll, rr);
+
+ } else {
+ fallback:
+ return libnormalform_or2__(l, r);
+ }
+}
+
+
+#else
+
+#define USE_TWO
+#include "libnormalform_or.c"
+
+#endif