| 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) |
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: ⊦ boolvar ∈ bits → ((boolvar0 ' + bits).last ↔ bits.last);% ⊦ (bits + bits0) + bits1 = bits + bits0 + bits1;% ⊦ boolvar ' + bits ≠ [];