diff options
| author | Mattias Andrée <maandree@kth.se> | 2024-07-19 01:29:42 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2024-07-19 01:29:42 +0200 |
| commit | 4294ec0ed06ee34920c9edaeebaeb8b65c720791 (patch) | |
| tree | e0cded59452597c04fb38f403745a384675cb5f9 /libnormalform_xor2.c | |
| download | libnormalform-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 'libnormalform_xor2.c')
| -rw-r--r-- | libnormalform_xor2.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/libnormalform_xor2.c b/libnormalform_xor2.c new file mode 100644 index 0000000..a00c575 --- /dev/null +++ b/libnormalform_xor2.c @@ -0,0 +1,63 @@ +/* See LICENSE file for copyright and license details. */ +#ifndef TEST +#include "common.h" + + +LIBNORMALFORM_SENTENCE * +(libnormalform_xor2)(LIBNORMALFORM_SENTENCE *l, LIBNORMALFORM_SENTENCE *r) +{ + int inv; + + if (!l || !r) { + libnormalform_free(l); + libnormalform_free(r); + return NULL; + } + + if (l->equals(l, r, &inv)) { + libnormalform_free(l); + libnormalform_free(r); + + if (!inv) { + /* x ⊕ x = 0 */ + return libnormalform_false(); + + } else { + /* x ⊕ ¬x = 1 */ + return libnormalform_true(); + } + + } else if (l->type == TYPE_TRUE) { + /* 1 ⊕ x = (1 ∨ x) ∧ ¬(1 ∧ x) = 1 ∧ ¬x = ¬x */ + r = libnormalform_not(r); + return_r: + libnormalform_free(l); + return r; + + } else if (l->type == TYPE_FALSE) { + /* 0 ⊕ x = (0 ∨ x) ∧ ¬(0 ∧ x) = x ∧ ¬0 = x ∧ 1 = x */ + goto return_r; + + } else if (r->type == TYPE_TRUE) { + /* x ⊕ 1 = 1 ⊕ x = ¬x */ + l = libnormalform_not(l); + return_l: + libnormalform_free(r); + return l; + + } else if (r->type == TYPE_FALSE) { + /* x ⊕ 0 = 0 ⊕ x = x */ + goto return_l; + + } else { + return libnormalform_xor2__(l, r); + } +} + + +#else + +#define USE_TWO +#include "libnormalform_xor.c" + +#endif |
