| bitsand(boolvar ' + bits1.butlast, boolvar0 ' + bits.butlast) + (bits1.last ∧ bits.last)' = boolvar1 ' + bits0, ∀ bits2, boolvar, bits1, boolvar0, boolvar1, bits0. # bits2 < # bits → bitsand(boolvar ' + bits1, boolvar0 ' + bits2) = boolvar1 ' + bits0 → (boolvar1 ↔ boolvar ∧ boolvar0) ⊦ bits = [], bits1 = [], boolvar1 ↔ boolvar ∧ boolvar0, ¬ (bits1.last ∧ bits.last) ∈ bits0 ∧ ¬(bits1.last ∧ bits.last ↔ boolvar1), ¬(boolvar1 ↔ bits1.last ∧ bits.last) ∧ ¬ boolvar1 ∈ bitsand(boolvar ' + bits1.butlast, boolvar0 ' + bits.butlast) |
bits ≠ [] ⊦ bits0 + boolvar ' = bits ↔ bits0 = bits.butlast ∧ (boolvar ↔ bits.last)
boolvar1 ' + bits0 ≠ [], bitsand(boolvar ' + bits1.butlast, boolvar0 ' + bits.butlast) = (boolvar1 ' + bits0).butlast ∧ (bits1.last ∧ bits.last ↔ (boolvar1 ' + bits0).last), ∀ bits2, boolvar, bits1, boolvar0, boolvar1, bits0. # bits2 < # bits → bitsand(boolvar ' + bits1, boolvar0 ' + bits2) = boolvar1 ' + bits0 → (boolvar1 ↔ boolvar ∧ boolvar0) ⊦ bits = [], bits1 = [], boolvar1 ↔ boolvar ∧ boolvar0, ¬ (bits1.last ∧ bits.last) ∈ bits0 ∧ ¬(bits1.last ∧ bits.last ↔ boolvar1), ¬(boolvar1 ↔ bits1.last ∧ bits.last) ∧ ¬ boolvar1 ∈ bitsand(boolvar ' + bits1.butlast, boolvar0 ' + bits.butlast)
Used simplifier rules: ⊦ ¬ bits + bits0 ≠ [] ↔ bits = [] ∧ bits0 = [];% ⊦ boolvar ' ≠ [];% ⊦ (bits + bits0) + bits1 = bits + bits0 + bits1; Used terms: boolvar1 ' + bits0, bits1.last ∧ bits.last, bitsand(boolvar ' + bits1.butlast, boolvar0 ' + bits.butlast)