| # kar0 = # kar, kar[(n1 - 1) / 2] = key-index(key0, m1), kar[n1] = key-index(key, m0), kar0[m / 2] = key-index(key1, m3), kar0[m + 1] = key-index(key2, m4), keyset(kar0, m2) = keyset(kar, m2), m + 1 < # kar, m + 1 < m2, n1 < # kar, n1 < m2, m3 < # ar, key2 < key1, m4 < # ar, m / 2 < m2, m / 2 < # kar, heap-order(kar0[m + 1, key-index(key1, m3)], m2), id-idx(ar1, ar), no-dups-idx(kar, m2), no-dups-idx(kar0, m2), valid-idx(kar, ar1, m2), valid-idx(kar0, ar, m2), m2 ≤ # kar, n1 ≠ 0 ∧ key < key0 → heap-order(kar[n1, key-index(key0, m1)], m2), n1 = 0 ∨ ¬ key < key0 → heap-order(kar, m2) ⊦ # kar = 1, m2 = 1, keyset(kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1]], m2) = keyset(kar, m2) ∧ ( m ≠ 0 ∧ m ≠ 1 ∧ key2 < kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1]][(m / 2 - 1) / 2].key → heap-order(kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1]][(m / 2 - 1) / 2]], m2)) ∧ ( m = 0 ∨ m = 1 ∨ ¬ key2 < kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1]][(m / 2 - 1) / 2].key → heap-order(kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1]], m2)) ∧ valid-idx (kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1]], ar[m3, ar[m3].idx:= (m + 1)][m4, ar[m3, ar[m3].idx:= (m + 1)][m4].idx:= (m / 2)], m2) ∧ no-dups-idx(kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1]], m2) ∧ (m ≠ 0 ∧ m ≠ 1 → (m / 2 - 1) / 2 < # kar ∧ 2 ≤ m) |
# kar0 = # kar, kar[(n1 - 1) / 2] = key-index(key0, m1), kar[n1] = key-index(key, m0), kar0[m / 2] = key-index(key1, m3), kar0[m + 1] = key-index(key2, m4), keyset(kar0, m2) = keyset(kar, m2), m + 1 < # kar, m + 1 < m2, n1 < # kar, n1 < m2, m3 < # ar, key2 < key1, m4 < # ar, m / 2 < m2, m / 2 < # kar, heap-order(kar0[m + 1, key-index(key1, m3)], m2), id-idx(ar1, ar), no-dups-idx(kar, m2), no-dups-idx(kar0, m2), valid-idx(kar, ar1, m2), valid-idx(kar0, ar, m2), m2 ≤ # kar, n1 ≠ 0 ∧ key < key0 → heap-order(kar[n1, key-index(key0, m1)], m2), n1 = 0 ∨ ¬ key < key0 → heap-order(kar, m2) ⊦ # kar = 1, m2 = 1, ( m ≠ 0 ∧ m ≠ 1 ∧ key2 < kar0[m + 1, key-index(key1, m3)][m / 2, key-index(key2, m4)][(m / 2 - 1) / 2].key → heap-order(kar0[m + 1, key-index(key1, m3)][m / 2, kar0[m + 1, key-index(key1, m3)][m / 2, key-index(key2, m4)][(m / 2 - 1) / 2]], m2)) ∧ ( m = 0 ∨ m = 1 ∨ ¬ key2 < kar0[m + 1, key-index(key1, m3)][m / 2, key-index(key2, m4)][(m / 2 - 1) / 2].key → heap-order(kar0[m + 1, key-index(key1, m3)][m / 2, key-index(key2, m4)], m2)) ∧ no-dups-idx(kar0[m + 1, key-index(key1, m3)][m / 2, key-index(key2, m4)], m2) ∧ (m ≠ 0 ∧ m ≠ 1 → (m / 2 - 1) / 2 < # kar ∧ 2 ≤ m)
Used simplifier rules: ⊦ valid-idx(kar, ar, n) ∧ m0 < n ∧ m1 < n ∧ kar[m0] = key-index(key1, n1) ∧ kar[m1] = key-index(key0, n0) → valid-idx (kar[m0, key-index(key0, n0)][m1, key-index(key1, n1)], ar[n0, ar[n0].idx:= m0] [n1, ar[n0, ar0[n0].idx:= m0][n1].idx:= m1 ], n); (ss)%m ≤ # kar ⊦ n0 < m ∧ n1 < m ∧ kar[n0] = ki1 ∧ kar[n1] = ki0 → keyset(kar[n0, ki0][n1, ki1], m) = keyset(kar, m); (s)% ⊦ m ≤ n → (n < m ↔ false); (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)