| kar[2 * n1 + 1] = key-index(key, m0), kar[2 * n1 + 2] = key-index(key0, m1), kar[n1] = key-index(key1, m2), ar0 = ar1, bh = bh0, bh1 = bin-heap(kar, m3), ki = bh.ar[n], ki0 = bh.ar[2 * n + 1], n = n0, 2 * n + 1 < bh.size, n < # bh.ar, 2 * n + 1 < # bh.ar, bubble-down-inv(n, bh, ar, bin-heap(kar, m3), ar0), no-dups-idx(kar, m3), valid-idx(kar, ar1, m3), m3 ≤ # kar, 2 * n + 2 < bh.size → 2 * n + 2 < # bh.ar, (2 * n1 + 1 < m3 → ¬ key < key1) ∧ (2 * n1 + 2 < m3 → ¬ key0 < key1) → heap-order(kar, m3), 2 * n1 + 1 < m3 ∧ key < key1 ∨ 2 * n1 + 2 < m3 ∧ key0 < key1 → heap-order(kar[n1, (2 * n1 + 2 < m3 ∧ key0 < key ⊃ key-index(key0, m1);key-index(key, m0))], m3), 2 * n + 1 < bh.size → (2 * n + 1 < # bh.ar ∧ n < # bh.ar) ∧ (¬ bh.ar[2 * n + 1].key < bh.ar[n].key → 2 * n + 2 < bh.size → 2 * n + 2 < # bh.ar ∧ n < # bh.ar), bh.ar[2 * n + 1].key < bh.ar[n].key ∨ 2 * n + 2 < bh.size ∧ bh.ar[2 * n + 2].key < bh.ar[n].key ⊦ 2 * n + 2 < bh.size ∧ bh.ar[2 * n + 2].key < ki0.key, ki0.idx < # ar ∧ ki0.idx < # ar |
# bh.ar = # kar, kar[2 * n1 + 1] = key-index(key, m0), kar[2 * n1 + 2] = key-index(key0, m1), kar[n1] = key-index(key1, m2), keyset(bh.ar, bh.size) = keyset(kar, bh.size), 2 * n + 1 < bh.size, n < # kar, 2 * n + 1 < # kar, heap-order(bh.ar[n, bh.ar[2 * n + 1]], bh.size), id-idx(ar1, ar), no-dups-idx(bh.ar, bh.size), no-dups-idx(kar, bh.size), valid-idx(bh.ar, ar, bh.size), valid-idx(kar, ar1, bh.size), # ar ≤ bh.ar[2 * n + 1].idx, bh.size ≤ # kar, ¬ bh.ar[2 * n + 1].key < bh.ar[n].key ∧ (2 * n + 2 < bh.size → ¬ bh.ar[2 * n + 2].key < bh.ar[n].key) → heap-order(bh.ar, bh.size), 2 * n + 2 < bh.size → 2 * n + 2 < # kar, (2 * n1 + 1 < bh.size → ¬ key < key1) ∧ (2 * n1 + 2 < bh.size → ¬ key0 < key1) → heap-order(kar, bh.size), 2 * n1 + 1 < bh.size ∧ key < key1 ∨ 2 * n1 + 2 < bh.size ∧ key0 < key1 → heap-order(kar[n1, (2 * n1 + 2 < bh.size ∧ key0 < key ⊃ key-index(key0, m1);key-index(key, m0))], bh.size), bh.ar[2 * n + 1].key < bh.ar[n].key ∨ 2 * n + 2 < bh.size ∧ bh.ar[2 * n + 2].key < bh.ar[n].key ⊦ 2 * n + 2 < bh.size ∧ bh.ar[2 * n + 2].key < bh.ar[2 * n + 1].key
Used simplifier rules: bubble-down-inv: ⊦ bubble-down-inv(n, bh, ar, bh0, ar0) ↔ bh.size ≤ # bh.ar ∧ # bh.ar = # bh0.ar ∧ bh.size = bh0.size ∧ id-idx(ar0, ar) ∧ no-dups-idx(bh.ar, bh.size) ∧ valid-idx(bh.ar, ar, bh.size) ∧ ( ( 2 * n + 1 < bh.size → ¬ bh.ar[2 * n + 1].key < bh.ar[n].key) ∧ ( 2 * n + 2 < bh.size → ¬ bh.ar[2 * n + 2].key < bh.ar[n].key) → heap-order(bh.ar, bh.size)) ∧ ( 2 * n + 1 < bh.size ∧ bh.ar[2 * n + 1].key < bh.ar[n].key ∨ 2 * n + 2 < bh.size ∧ bh.ar[2 * n + 2].key < bh.ar[n].key → heap-order (bh.ar [n, ( 2 * n + 2 < bh.size ∧ bh.ar[2 * n + 2].key < bh.ar[2 * n + 1].key ⊃ bh.ar[2 * n + 2] ;bh.ar[2 * n + 1] ) ], bh.size)) ∧ keyset(bh.ar, bh.size) = keyset(bh0.ar, bh0.size);% ⊦ m < n → n ≠ 0; (s)%fle: ⊦ m < n ∧ n ≤ n0 → m < n0; (forward) from specification nat%lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ m < n ↔ ¬ n ≤ m; (ss)% ⊦ bin-heap(kar, m).size = m; (s)% ⊦ bin-heap(kar, m).ar = kar; (s)