| bh0.size = 0, ar0 = ar, bh = bin-heap(kar, m), bh0 = bin-heap(kar, m - 1), 2exp-size(# kar), 0 < # bh.ar, heap-order(kar, m), no-dups-idx(kar, m), valid-idx(kar, ar, m), m ≤ # kar, m ≥ 1, ∃ key. key-index(key, bh.ar[0].idx) ∈ keyset(kar, m) ∧ (∀ ki. ki ∈ keyset(kar, m) → ¬ ki.key < key) ⊦ # keyset(kar, m) = 0, keyset(kar, m) = ∅, 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(ar0, ar) ∧ (∃ key. key-index(key, bh.ar[0].idx) ∈ keyset(kar, m) ∧ keyset(bh0.ar, bh0.size) = keyset(kar, m) -- key-index(key, bh.ar[0].idx) ∧ (∀ ki. ki ∈ keyset(kar, m) → ¬ ki.key < key)) |
key-index(key, kar[0].idx) = kar[0], 2exp-size(# kar), no-dups-idx(kar, 1), valid-idx(kar, ar, 1), 1 ≤ # kar ⊦ # kar = 0, kar[0].key < key, ∃ key0. key-index(key0, kar[0].idx) = kar[0] ∧ ∅ = (∅ ++ kar[0]) -- key-index(key0, kar[0].idx) ∧ ¬ kar[0].key < key0
Used simplifier rules: ⊦ keyset(kar, 0) = ∅; (s)% ⊦ heap-order(kar, 0); (s)% ⊦ valid-idx(kar, ar, 0); (s)% ⊦ no-dups-idx(kar, 0); (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m ≤ m + n; (s)% ⊦ ki ∈ ∅ ++ ki0 ↔ ki = ki0; (s)% ⊦ heap-order(kar, 1); (s)% ⊦ ∅ ≠ s ++ ki; (s)% ⊦ #(∅ ++ ki) = 1; (s)%# kar ≠ 0 ⊦ keyset(kar, 1) = ∅ ++ kar[0]; (s)%let: ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat%not-zero: 0 < n ⊦ (* n) ≤ m → m ≠ 0; (forward) from specification nat% ⊦ id-idx(ar, ar); (s)%n0 ≤ n ⊦ n - n0 ≤ m ↔ n ≤ m + n0; (s)% ⊦ 0 < m ↔ m ≠ 0; (s)% ⊦ m ≤ n → (n - m = 0 ↔ n = m); (s)% ⊦ n ≥ m ↔ m ≤ n; (s)% ⊦ bin-heap(kar, m).ar = kar; (s)% ⊦ bin-heap(kar, m).size = m; (s)