simp only [IH, Subarray.getElem_swap]
α : Type u
lt : α → α → Bool
x✝ : Subarray α
i✝ : Nat
y✝ : Subarray α
k : Nat
x : Subarray α
i : Nat
y : Subarray α
hi : i < Subarray.size x
hl✝ : 2 * i + 1 < Subarray.size x
hr : 2 * i + 2 < Subarray.size x
hx' : lt x[2 * i + 2] x[2 * i + 1] = false
hx : lt x[i] x[2 * i + 2] = true
h : heapifyDown.OpSpec lt (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr }) (2 * i + 2) y
IH✝ :
  ∀ (hk : k < Subarray.size (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr })),
    Descendant (2 * i + 2) k →
      ∃ l hl,
        Descendant (2 * i + 2) l ∧ y[k] = (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr })[l]
hk : k < Subarray.size x
hdesc : Descendant i k
hdesc' : Descendant (2 * i + 2) k
l : Nat
hl : l < Subarray.size (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr })
hld : Descendant (2 * i + 2) l
IH : y[k] = (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr })[l]
⊢ ∃ l hl, Descendant i l ∧ y[k] = x[l]
α : Type u
lt : α → α → Bool
x✝ : Subarray α
i✝ : Nat
y✝ : Subarray α
k : Nat
x : Subarray α
i : Nat
y : Subarray α
hi : i < Subarray.size x
hl✝ : 2 * i + 1 < Subarray.size x
hr : 2 * i + 2 < Subarray.size x
hx' : lt x[2 * i + 2] x[2 * i + 1] = false
hx : lt x[i] x[2 * i + 2] = true
h : heapifyDown.OpSpec lt (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr }) (2 * i + 2) y
IH✝ :
  ∀ (hk : k < Subarray.size (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr })),
    Descendant (2 * i + 2) k →
      ∃ l hl,
        Descendant (2 * i + 2) l ∧ y[k] = (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr })[l]
hk : k < Subarray.size x
hdesc : Descendant i k
hdesc' : Descendant (2 * i + 2) k
l : Nat
hl : l < Subarray.size (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr })
hld : Descendant (2 * i + 2) l
IH : y[k] = (Subarray.swap x { val := i, isLt := hi } { val := 2 * i + 2, isLt := hr })[l]
⊢ ∃ l_1 hl_1, Descendant i l_1 ∧ (if 2 * i + 2 = l then x[i] else if i = l then x[2 * i + 2] else x[l]) = x[l_1]