| bits0 = boolvar + bits3, # bits2 < # bits0, ∀ bits1, bits. # bits1 < # bits0 → true → ¬ false ∈ bits ∧ # bits ≤ # bits1 ∧ bits ≠ [] → bitsand(bits, bits1) = bits1 ⊦ bitsand(true ' + bits2.butlast, bits0.butlast) + (bits2.last ∧ bits0.last)' = bits0, bits0 = [], bits0 = boolvar ', bits2 = [], false ∈ bits2 |
# bits2 ≤ # bits3, ∀ bits1, bits. # bits1 < #(boolvar + bits3) → true → ¬ false ∈ bits ∧ # bits ≤ # bits1 ∧ bits ≠ [] → bitsand(bits, bits1) = bits1 ⊦ bits3 = [], bits2 = [], bitsand(true ' + bits2.butlast, boolvar ' + bits3.butlast) + (bits2.last ∧ bits3.last)' = boolvar ' + bits3, false ∈ bits2
Used simplifier rules: ⊦ m + n = n + m;% ⊦ (m + n0) + n1 = m + n0 + n1;% ⊦ ¬ m < n ↔ n ≤ m;% ⊦ m < n + 1 ↔ ¬ n < m;% ⊦ # boolvar ' = 0 +1;% ⊦ #(bits + bits0) = # bits + # bits0;% ⊦ bits ≠ [] → ((boolvar ' + bits).last ↔ bits.last);% ⊦ bits ≠ [] → (bits0 + bits).butlast = bits0 + bits.butlast;% ⊦ bits = bits + bits0 ↔ bits0 = [];% ⊦ (bits + bits0) + bits1 = bits + bits0 + bits1;% ⊦ boolvar ' + bits ≠ [];% ⊦ boolvar + bits = boolvar ' + bits;