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