| kar[2 * n + 1] = key-index(key, m0), kar[2 * n + 2] = key-index(key0, m1), kar[n] = key-index(key1, m2), ar0 = ar, bh = bin-heap(kar, m), no-dups-idx(kar, m), valid-idx(kar, ar, m), m ≤ # kar, (2 * n + 1 < m → ¬ key < key1) ∧ (2 * n + 2 < m → ¬ key0 < key1) → heap-order(kar, m), 2 * n + 1 < m ∧ key < key1 ∨ 2 * n + 2 < m ∧ key0 < key1 → heap-order(kar[n, (2 * n + 2 < m ∧ key0 < key ⊃ key-index(key0, m1);key-index(key, m0))], m) ⊦ ⟪bin_min_heap_bubble_down#(n; bh, ar)⟫ ( bh.size = m ∧ # bh.ar = # kar ∧ 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(kar, bh.size) = keyset(bh.ar, bh.size)) |
kar[n] = key-index(key1, m2), kar[2 * n + 2] = key-index(key0, m1), kar[2 * n + 1] = key-index(key, m0), ar0 = ar, bh = bin-heap(kar, m), no-dups-idx(kar, m), valid-idx(kar, ar, m), m ≤ # kar, 2 * n + 1 < m ∧ key < key1 ∨ 2 * n + 2 < m ∧ key0 < key1 → heap-order(kar[n, (2 * n + 2 < m ∧ key0 < key ⊃ key-index(key0, m1);key-index(key, m0))], m), (2 * n + 1 < m → ¬ key < key1) ∧ (2 * n + 2 < m → ¬ key0 < key1) → heap-order(kar, m) ⊦ ⟪let m = n in while 2 * m + 1 < bh.size ∧ (bh.ar[2 * m + 1].key < bh.ar[m].key ∨ 2 * m + 2 < bh.size ∧ bh.ar[2 * m + 2].key < bh.ar[m].key) do let ki = bh.ar[m], ki0 = bh.ar[2 * m + 1] in if 2 * m + 2 < bh.size ∧ bh.ar[2 * m + 2].key < ki0.key then let ki1 = bh.ar[2 * m + 2] in {bh.ar[m] := ki1; ar[ki1.idx].idx := m; bh.ar[2 * m + 2] := ki; ar[ki.idx].idx := 2 * m + 2; m := 2 * m + 2} else {bh.ar[m] := ki0; ar[ki0.idx].idx := m; bh.ar[2 * m + 1] := ki; ar[ki.idx].idx := 2 * m + 1; m := 2 * m + 1}⟫ ( bh.size = m ∧ # bh.ar = # kar ∧ 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(kar, bh.size) = keyset(bh.ar, bh.size))
Used simplifier rules: bin_min_heap_bubble_down#(n; bh, ar) {let m = n in while 2 * m + 1 < bh.size ∧ ( bh.ar[2 * m + 1].key < bh.ar[m].key ∨ 2 * m + 2 < bh.size ∧ bh.ar[2 * m + 2].key < bh.ar[m].key) do let ki = bh.ar[m], ki0 = bh.ar[2 * m + 1] in if 2 * m + 2 < bh.size ∧ bh.ar[2 * m + 2].key < ki0.key then let ki1 = bh.ar[2 * m + 2] in {bh.ar[m] := ki1; ar[ki1.idx].idx := m; bh.ar[2 * m + 2] := ki; ar[ki.idx].idx := 2 * m + 2; m := 2 * m + 2} else {bh.ar[m] := ki0; ar[ki0.idx].idx := m; bh.ar[2 * m + 1] := ki; ar[ki.idx].idx := 2 * m + 1; m := 2 * m + 1} };