/* 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