Theorem: OrdinalApprox.lfpApprox_ord_eq_lfp
File: Mathlib/SetTheory/Ordinal/FixedPointApproximants.lean

tactic: apply le_antisymm
state_before: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ lfpApprox f ⊥ (succ #α).ord = lfp f
state_after: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ lfpApprox f ⊥ (succ #α).ord ≤ lfp f

case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ lfp f ≤ lfpApprox f ⊥ (succ #α).ord

tactic: have h_lfp : ∃ y : fixedPoints f, lfp f = y := by use ⊥; exact rfl
state_before: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ lfpApprox f ⊥ (succ #α).ord ≤ lfp f
state_after: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_lfp : ∃ y, lfp f = ↑y
⊢ lfpApprox f ⊥ (succ #α).ord ≤ lfp f

tactic: let ⟨y, h_y⟩ := h_lfp
state_before: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_lfp : ∃ y, lfp f = ↑y
⊢ lfpApprox f ⊥ (succ #α).ord ≤ lfp f
state_after: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_lfp : ∃ y, lfp f = ↑y
y : ↑(fixedPoints ⇑f)
h_y : lfp f = ↑y
⊢ lfpApprox f ⊥ (succ #α).ord ≤ lfp f

tactic: rw [h_y]
state_before: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_lfp : ∃ y, lfp f = ↑y
y : ↑(fixedPoints ⇑f)
h_y : lfp f = ↑y
⊢ lfpApprox f ⊥ (succ #α).ord ≤ lfp f
state_after: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_lfp : ∃ y, lfp f = ↑y
y : ↑(fixedPoints ⇑f)
h_y : lfp f = ↑y
⊢ lfpApprox f ⊥ (succ #α).ord ≤ ↑y

tactic: exact lfpApprox_le_of_mem_fixedPoints f ⊥ y.2 bot_le (ord <| succ #α)
state_before: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_lfp : ∃ y, lfp f = ↑y
y : ↑(fixedPoints ⇑f)
h_y : lfp f = ↑y
⊢ lfpApprox f ⊥ (succ #α).ord ≤ ↑y
state_after: no goals

tactic: use ⊥
state_before: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ ∃ y, lfp f = ↑y
state_after: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ lfp f = ↑⊥

tactic: exact rfl
state_before: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ lfp f = ↑⊥
state_after: no goals

tactic: have h_fix : ∃ y : fixedPoints f, lfpApprox f ⊥ (ord <| succ #α) = y := by
  simpa only [Subtype.exists, mem_fixedPoints, exists_prop, exists_eq_right'] using
    lfpApprox_ord_mem_fixedPoint f ⊥ bot_le
state_before: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ lfp f ≤ lfpApprox f ⊥ (succ #α).ord
state_after: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_fix : ∃ y, lfpApprox f ⊥ (succ #α).ord = ↑y
⊢ lfp f ≤ lfpApprox f ⊥ (succ #α).ord

tactic: let ⟨x, h_x⟩ := h_fix
state_before: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_fix : ∃ y, lfpApprox f ⊥ (succ #α).ord = ↑y
⊢ lfp f ≤ lfpApprox f ⊥ (succ #α).ord
state_after: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x✝ : α
h_fix : ∃ y, lfpApprox f ⊥ (succ #α).ord = ↑y
x : ↑(fixedPoints ⇑f)
h_x : lfpApprox f ⊥ (succ #α).ord = ↑x
⊢ lfp f ≤ lfpApprox f ⊥ (succ #α).ord

tactic: rw [h_x]
state_before: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x✝ : α
h_fix : ∃ y, lfpApprox f ⊥ (succ #α).ord = ↑y
x : ↑(fixedPoints ⇑f)
h_x : lfpApprox f ⊥ (succ #α).ord = ↑x
⊢ lfp f ≤ lfpApprox f ⊥ (succ #α).ord
state_after: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x✝ : α
h_fix : ∃ y, lfpApprox f ⊥ (succ #α).ord = ↑y
x : ↑(fixedPoints ⇑f)
h_x : lfpApprox f ⊥ (succ #α).ord = ↑x
⊢ lfp f ≤ ↑x

tactic: exact lfp_le_fixed f x.prop
state_before: case a
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x✝ : α
h_fix : ∃ y, lfpApprox f ⊥ (succ #α).ord = ↑y
x : ↑(fixedPoints ⇑f)
h_x : lfpApprox f ⊥ (succ #α).ord = ↑x
⊢ lfp f ≤ ↑x
state_after: no goals

tactic: simpa only [Subtype.exists, mem_fixedPoints, exists_prop, exists_eq_right'] using
  lfpApprox_ord_mem_fixedPoint f ⊥ bot_le
state_before: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ ∃ y, lfpApprox f ⊥ (succ #α).ord = ↑y
state_after: no goals