| # kar1 = # kar0, keyset(kar0, m2 + 1) ++ key-index(key, m0) = keyset(kar1, m2 + 1) ++ kar1[m2 + 1], kar0[m2 / 2] = key-index(key0, m1), subarray(kar0, 0, m2 + 1) = subarray(kar, 0, m2 + 1), 2exp-size(# kar0), 2exp-size(# kar), m0 < # ar, m2 + 1 < # kar0, m2 < # kar, heap-order(kar0, m2 + 1), heap-order(kar, m2 + 1), heap-order(kar1, 2 + m2), id-idx(ar, ar0), no-dups-idx(kar1, 2 + m2), no-dups-idx(kar0[m2 + 1, key-index(key, m0)], 2 + m2), no-dups-idx(kar0, m2 + 1), no-dups-idx(kar, m2 + 1), valid-idx(kar1, ar0, 2 + m2), valid-idx(kar0[m2 + 1, key-index(key, m0)], ar[m0, ar[m0].idx:= (m2 + 1)], 2 + m2), valid-idx(kar0, ar, m2 + 1), valid-idx(kar, ar, m2 + 1), key < key0 → heap-order(kar0[m2 + 1, key-index(key0, m1)], 2 + m2), ¬ key < key0 → heap-order(kar0[m2 + 1, key-index(key, m0)], 2 + m2), ∀ ki. ki = kar[m2] ∨ ki ∈ keyset(kar, m2) → ki.idx ≠ m0 ⊦ keyset(kar1, m2 + 1) ++ kar1[m2 + 1] = keyset(kar, m2) ++ kar[m2] ++ key-index(key, m0) |
m ≤ # kar0, m ≤ # kar1 ⊦ subarray(kar0, 0, m) = subarray(kar1, 0, m) → keyset(kar0, m) = keyset(kar1, m)
Used simplifier rules: ⊦ n < # kar → keyset(kar, n + 1) = keyset(kar, n) ++ kar[n]; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic%# kar = n ⊦ subarray(kar, 0, n) = kar; (s)% ⊦ m + 1 ≤ n ↔ m < n; (s)% ⊦ ¬ m < n → ¬ m + m0 < n; (s) Used terms: kar, m2 + 1, kar0