| ar1 = ar[m0, ar[m0].idx:= m], bh0 = bin-heap(kar0[m, key-index(key, m0)], m + 1), subarray(kar0, 0, m) = subarray(kar, 0, m), 2exp-size(# kar), 2exp-size(# kar0), m < # kar0, m0 < # ar, heap-order(kar, m), heap-order(kar0, m), no-dups-idx(kar, m), no-dups-idx(kar0, m), valid-idx(kar, ar, m), valid-idx(kar0, ar, m), m ≤ # kar, ∀ ki0. ki0 ∈ keyset(kar, m) → ki0.idx ≠ m0 ⊦ ⟪bin_min_heap_bubble_up#(bh0.size - 1; bh0, ar1)⟫ ( bh0.size ≤ # bh0.ar ∧ no-dups-idx(bh0.ar, bh0.size) ∧ valid-idx(bh0.ar, ar1, bh0.size) ∧ 2exp-size(# bh0.ar) ∧ heap-order(bh0.ar, bh0.size) ∧ id-idx(ar, ar1) ∧ keyset(bh0.ar, bh0.size) = keyset(kar, m) ++ key-index(key, m0)) |
bh0 = bh, ar0 = ar, bubble-up-inv(n, bh, ar, bh0, ar0) ⊦ ⟪bin_min_heap_bubble_up#(n; bh, ar)⟫ ( bh.size = bh0.size ∧ # bh.ar = # bh0.ar ∧ id-idx(ar0, ar) ∧ no-dups-idx(bh.ar, bh.size) ∧ valid-idx(bh.ar, ar, bh.size) ∧ heap-order(bh.ar, bh.size) ∧ keyset(bh0) = keyset(bh))
ar1 = ar[m0, ar[m0].idx:= m], bh0 = bin-heap(kar0[m, key-index(key, m0)], m + 1), subarray(kar0, 0, m) = subarray(kar, 0, m), 2exp-size(# kar0), 2exp-size(# kar), m0 < # ar, m < # kar0, heap-order(kar0, m), heap-order(kar, m), no-dups-idx(kar0, m), no-dups-idx(kar, m), valid-idx(kar0, ar, m), valid-idx(kar, ar, m), m ≤ # kar, ∀ ki0. ki0 ∈ keyset(kar, m) → ki0.idx ≠ m0 ⊦ bh0 = bh0 ∧ ar1 = ar1 ∧ bubble-up-inv(bh0.size - 1, bh0, ar1, bh0, ar1)
ar1 = ar[m0, ar[m0].idx:= m], ar1 = ar1, ar2 = ar1, bh0 = bin-heap(kar0[m, key-index(key, m0)], m + 1), bh0 = bh0, bh1 = bh0, n0 = bh0.size - 1, subarray(kar0, 0, m) = subarray(kar, 0, m), 2exp-size(# kar0), 2exp-size(# kar), m0 < # ar, m < # kar0, bubble-up-inv(bh0.size - 1, bh0, ar1, bh0, ar1), heap-order(kar0, m), heap-order(kar, m), no-dups-idx(kar0, m), no-dups-idx(kar, m), valid-idx(kar0, ar, m), valid-idx(kar, ar, m), m ≤ # kar, ∀ ki0. ki0 ∈ keyset(kar, m) → ki0.idx ≠ m0 ⊦ [bin_min_heap_bubble_up#(bh0.size - 1; bh0, ar1)] ( bh0.size = bh1.size ∧ # bh0.ar = # bh1.ar ∧ id-idx(ar2, ar1) ∧ no-dups-idx(bh0.ar, bh0.size) ∧ valid-idx(bh0.ar, ar1, bh0.size) ∧ heap-order(bh0.ar, bh0.size) ∧ keyset(bh1) = keyset(bh0) → bh0.size ≤ # bh0.ar ∧ no-dups-idx(bh0.ar, bh0.size) ∧ valid-idx(bh0.ar, ar1, bh0.size) ∧ 2exp-size(# bh0.ar) ∧ heap-order(bh0.ar, bh0.size) ∧ id-idx(ar, ar1) ∧ keyset(bh0.ar, bh0.size) = keyset(kar, m) ++ key-index(key, m0))