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

Proof steps:
state_before: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
⊢ ∃ a < (succ #α).ord, ∃ b < (succ #α).ord, a ≠ b ∧ lfpApprox f x a = lfpApprox f x b
state_after: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj : ¬Set.InjOn (lfpApprox f x) (Set.Iio (SuccOrder.succ #α).ord)
⊢ ∃ a < (succ #α).ord, ∃ b < (succ #α).ord, a ≠ b ∧ lfpApprox f x a = lfpApprox f x b
tactic: have h_ninj := not_injective_limitation_set <| lfpApprox f x
state_before: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj : ¬Set.InjOn (lfpApprox f x) (Set.Iio (SuccOrder.succ #α).ord)
⊢ ∃ a < (succ #α).ord, ∃ b < (succ #α).ord, a ≠ b ∧ lfpApprox f x a = lfpApprox f x b
state_after: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
⊢ ∃ a < (succ #α).ord, ∃ b < (succ #α).ord, a ≠ b ∧ lfpApprox f x a = lfpApprox f x b
tactic: rw [Set.injOn_iff_injective, Function.not_injective_iff] at h_ninj
state_before: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
⊢ ∃ a < (succ #α).ord, ∃ b < (succ #α).ord, a ≠ b ∧ lfpApprox f x a = lfpApprox f x b
state_after: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ∃ a < (succ #α).ord, ∃ b < (succ #α).ord, a ≠ b ∧ lfpApprox f x a = lfpApprox f x b
tactic: let ⟨a, b, h_fab, h_nab⟩ := h_ninj
state_before: α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ∃ a < (succ #α).ord, ∃ b < (succ #α).ord, a ≠ b ∧ lfpApprox f x a = lfpApprox f x b
state_after: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ↑a < (succ #α).ord ∧ ∃ b < (succ #α).ord, ↑a ≠ b ∧ lfpApprox f x ↑a = lfpApprox f x b
tactic: use a.val
state_before: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ↑a < (succ #α).ord ∧ ∃ b < (succ #α).ord, ↑a ≠ b ∧ lfpApprox f x ↑a = lfpApprox f x b
state_after: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ∃ b < (succ #α).ord, ↑a ≠ b ∧ lfpApprox f x ↑a = lfpApprox f x b
tactic: apply And.intro a.prop
state_before: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ∃ b < (succ #α).ord, ↑a ≠ b ∧ lfpApprox f x ↑a = lfpApprox f x b
state_after: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ↑b < (succ #α).ord ∧ ↑a ≠ ↑b ∧ lfpApprox f x ↑a = lfpApprox f x ↑b
tactic: use b.val
state_before: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ↑b < (succ #α).ord ∧ ↑a ≠ ↑b ∧ lfpApprox f x ↑a = lfpApprox f x ↑b
state_after: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ↑a ≠ ↑b ∧ lfpApprox f x ↑a = lfpApprox f x ↑b
tactic: apply And.intro b.prop
state_before: case h
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ↑a ≠ ↑b ∧ lfpApprox f x ↑a = lfpApprox f x ↑b
state_after: case h.left
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ ↑a ≠ ↑b

case h.right
α : Type u
inst✝ : CompleteLattice α
f : α →o α
x : α
h_ninj :
  ∃ a b,
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
        (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b ∧
      a ≠ b
a b : ↑(Set.Iio (SuccOrder.succ #α).ord)
h_fab :
  (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) a =
    (Set.Iio (SuccOrder.succ #α).ord).restrict (lfpApprox f x) b
h_nab : a ≠ b
⊢ lfpApprox f x ↑a = lfpApprox f x ↑b
tactic: apply And.intro