| ar = ar1[kar[m0].idx, ar1[kar[m0].idx].idx:= 0], bh0 = bin-heap(kar[0, kar[m0]], m0), m = m0 + 1, 2exp-size(# kar), kar[m0].idx < # ar1, heap-order(kar, m), no-dups-idx(kar, m), valid-idx(kar, ar1, m), key-index(key, kar[0].idx) ∈ keyset(kar, m), m ≤ # kar, ∀ ki. ki ∈ keyset(kar, m) → ¬ ki.key < key ⊦ ⟪bin_min_heap_bubble_down#(0; bh0, ar)⟫ ( bh0.size ≤ # bh0.ar ∧ no-dups-idx(bh0.ar, bh0.size) ∧ valid-idx(bh0.ar, ar, bh0.size) ∧ 2exp-size(# bh0.ar) ∧ heap-order(bh0.ar, bh0.size) ∧ id-idx(ar1, ar) ∧ (∃ key0. key-index(key0, kar[0].idx) ∈ keyset(kar, m) ∧ keyset(bh0.ar, bh0.size) = keyset(kar, m) -- key-index(key0, kar[0].idx) ∧ (∀ ki. ki ∈ keyset(kar, m) → ¬ ki.key < key0))), # kar = 0, # keyset(kar, m) = 0, keyset(kar, m) = ∅, m = 0, m = 1 |
ar = ar1[kar[m0].idx, ar1[kar[m0].idx].idx:= 0], bh0 = bin-heap(kar[0, kar[m0]], m0), #(keyset(kar, m0) ++ kar[m0]) ≠ 0, m0 ≠ 0, 2exp-size(# kar), m0 < # kar, kar[m0].idx < # ar1, heap-order(kar, m0 + 1), no-dups-idx(kar, m0 + 1), valid-idx(kar, ar1, m0 + 1), ∀ ki. ki = kar[m0] ∨ ki ∈ keyset(kar, m0) → ¬ ki.key < key, key-index(key, kar[0].idx) = kar[m0] ∨ key-index(key, kar[0].idx) ∈ keyset(kar, m0) ⊦ ⟪bin_min_heap_bubble_down#(0; bh0, ar)⟫ ( bh0.size ≤ # bh0.ar ∧ no-dups-idx(bh0.ar, bh0.size) ∧ valid-idx(bh0.ar, ar, bh0.size) ∧ 2exp-size(# bh0.ar) ∧ heap-order(bh0.ar, bh0.size) ∧ id-idx(ar1, ar) ∧ (∃ key. (key-index(key, kar[0].idx) = kar[m0] ∨ key-index(key, kar[0].idx) ∈ keyset(kar, m0)) ∧ keyset(bh0.ar, bh0.size) = (keyset(kar, m0) ++ kar[m0]) -- key-index(key, kar[0].idx) ∧ (∀ ki. ki = kar[m0] ∨ ki ∈ keyset(kar, m0) → ¬ ki.key < key)))
Used simplifier rules: size-zero: ⊦ # s ≠ 0 → s ≠ ∅; (forward) from specification set-basic[keyindex-set]%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ ki ∈ s ++ ki0 ↔ ki = ki0 ∨ ki ∈ s; (s)% ⊦ m < n → n ≠ 0; (s)% ⊦ ∅ ≠ s ++ ki; (s)% ⊦ n < # kar → keyset(kar, n + 1) = keyset(kar, n) ++ kar[n]; (s)% ⊦ m + 1 ≤ n ↔ m < n; (s)% ⊦ m + 1 ≠ 0; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n = 1 ↔ m = 0 ∧ n = 1 ∨ n = 0 ∧ m = 1; (ws)