Theorem: project.IsHeapForest'_eraseIdx (Project/DeleteMin.lean)

State before:
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
id : ℕ
⊢ IsHeapForest' r (List.eraseIdx [] id)
Tactic:
simp
State after:
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
id : ℕ
⊢ IsHeapForest' r []

State before:
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
id : ℕ
⊢ IsHeapForest' r []
Tactic:
constructor
State after:
no goals

State before:
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
id : ℕ
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
⊢ IsHeapForest' r (List.eraseIdx (t :: ts) id)
Tactic:
unfold List.eraseIdx
State after:
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
id : ℕ
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
⊢ IsHeapForest' r
    (match t :: ts, id with
    | [], x => []
    | head :: as, 0 => as
    | a :: as, Nat.succ n => a :: List.eraseIdx as n)

State before:
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
id : ℕ
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
⊢ IsHeapForest' r
    (match t :: ts, id with
    | [], x => []
    | head :: as, 0 => as
    | a :: as, Nat.succ n => a :: List.eraseIdx as n)
Tactic:
split
State after:
case h_1
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝² : ℕ
x✝¹ : List (BinTree α✝)
x✝ : ℕ
heq✝ : t :: ts = []
⊢ IsHeapForest' r []

case h_2
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
head✝ : BinTree α✝
as✝ : List (BinTree α✝)
heq✝ : t :: ts = head✝ :: as✝
⊢ IsHeapForest' r as✝

case h_3
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
a✝ : BinTree α✝
as✝ : List (BinTree α✝)
n✝ : ℕ
heq✝ : t :: ts = a✝ :: as✝
⊢ IsHeapForest' r (a✝ :: List.eraseIdx as✝ n✝)

State before:
case h_1
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝² : ℕ
x✝¹ : List (BinTree α✝)
x✝ : ℕ
heq✝ : t :: ts = []
⊢ IsHeapForest' r []

case h_2
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
head✝ : BinTree α✝
as✝ : List (BinTree α✝)
heq✝ : t :: ts = head✝ :: as✝
⊢ IsHeapForest' r as✝

case h_3
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
a✝ : BinTree α✝
as✝ : List (BinTree α✝)
n✝ : ℕ
heq✝ : t :: ts = a✝ :: as✝
⊢ IsHeapForest' r (a✝ :: List.eraseIdx as✝ n✝)
Tactic:
. constructor
State after:
case h_2
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
head✝ : BinTree α✝
as✝ : List (BinTree α✝)
heq✝ : t :: ts = head✝ :: as✝
⊢ IsHeapForest' r as✝

case h_3
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
a✝ : BinTree α✝
as✝ : List (BinTree α✝)
n✝ : ℕ
heq✝ : t :: ts = a✝ :: as✝
⊢ IsHeapForest' r (a✝ :: List.eraseIdx as✝ n✝)

State before:
case h_2
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
head✝ : BinTree α✝
as✝ : List (BinTree α✝)
heq✝ : t :: ts = head✝ :: as✝
⊢ IsHeapForest' r as✝

case h_3
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
a✝ : BinTree α✝
as✝ : List (BinTree α✝)
n✝ : ℕ
heq✝ : t :: ts = a✝ :: as✝
⊢ IsHeapForest' r (a✝ :: List.eraseIdx as✝ n✝)
Tactic:
. simp_all
  apply IsHeapForest'_weaken
  . assumption
  . apply le_of_lt 
    assumption
State after:
case h_3
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
a✝ : BinTree α✝
as✝ : List (BinTree α✝)
n✝ : ℕ
heq✝ : t :: ts = a✝ :: as✝
⊢ IsHeapForest' r (a✝ :: List.eraseIdx as✝ n✝)

State before:
case h_3
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
a✝ : BinTree α✝
as✝ : List (BinTree α✝)
n✝ : ℕ
heq✝ : t :: ts = a✝ :: as✝
⊢ IsHeapForest' r (a✝ :: List.eraseIdx as✝ n✝)
Tactic:
. rename_i eq
  have hf : IsHeapForest' r (t ::ts) := by
    apply IsHeapForest'_of_IsHeapForest' <;> assumption
  constructor
  . simp_all
  . simp_all
  . rw[eq] at hf
    cases hf
    apply IsHeapForest'_eraseIdx
    assumption
State after:
no goals

State before:
α : Sort ?u.32649
le : α → α → Bool
not_le_le : ∀ (x y : α), ¬le x y = true → le y x = true
le_trans : ∀ (x y z : α), le x y = true → le y z = true → le x z = true
le_rfl : ∀ (z : α), le z z = true
r : ℕ
α✝ : Type u_1
a : List (BinTree α✝)
t : BinTree α✝
ts : List (BinTree α✝)
lt : r < t.rank
bt : IsBinTree t
h₁ : IsHeapForest' t.rank ts
x✝¹ : List (BinTree α✝)
x✝ : ℕ
a✝ : BinTree α✝
as✝ : List (BinTree α✝)
n✝ : ℕ
eq : t :: ts = a✝ :: as✝
⊢ IsHeapForest' r (t :: ts)
Tactic:
apply IsHeapForest'_of_IsHeapForest' <;> assumption
State after:
no goals