| 1 < 2 ^ (i + 1), 0 ≤ i, 2 ^ i ≤ j, j < 2 ^ (i + 1), 0 < j, 0 < 2 ^ (i + 1), 0 ≤ 2 ^ (i + 1), ∀ j0, i. i→n(j0) < i→n(j) → 0 ≤ i ∧ 2 ^ i ≤ j0 ∧ j0 < 2 ^ (i + 1) → # uint2bits(j0) = i→n(i + 2) ⊦ 0 ≤ i - 1 ∧ 2 ^ (i - 1) ≤ j / 2 ∧ j / 2 < 2 ^ ((i - 1) + 1), # uint2bits(j / 2) + 1 = i→n(i + 2), j = 1 |
2 ^ i ≤ j, j < 2 ^ (i + 1), 0 < j, 0 < 2 ^ (i + 1), 0 ≤ 2 ^ (i + 1), 1 < 2 ^ (i + 1), 0 < i, ∀ j0, i. i→n(j0) < i→n(j) → 0 ≤ i ∧ 2 ^ i ≤ j0 ∧ j0 < 2 ^ (i + 1) → # uint2bits(j0) = i→n(i + 2) ⊦ # uint2bits(j / 2) + 1 = i→n(i + 2), j = 1, 0 = i, ¬ 2 ^ i ≤ j / 2 ∧ ¬ j / 2 < 2 ^ (i - 1)
Used simplifier rules: ⊦ 0 < j → (j < 2 ↔ j = 1);% ⊦ m + n = n + m;% ⊦ (m + n0) + n1 = m + n0 + n1;% ⊦ (bits + bits0) + bits1 = bits + bits0 + bits1;% ⊦ bits + [] = bits;% ⊦ boolvar + bits = boolvar ' + bits;% ⊦ # bits = 1 ↔ bits = bits.first + [];%n0 < n ⊦ (* n) = m0 + (* n0) ↔ n - n0 = m0;% ⊦ i ≠ j → (i ≤ j ↔ i < j);% ⊦ i + j = j + i;% ⊦ i + j + i0 = (i + j) + i0;% ⊦ i + (j - i) = j;% ⊦ ¬ i ≤ j ↔ j < i;% ⊦ i ≤ j → (j ≤ i ↔ i = j);% ⊦ ¬ i < j ↔ j ≤ i;% ⊦ 1 ≤ i ↔ 0 < i;% ⊦ i ≤ j - i0 ↔ i + i0 ≤ j;