[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{v}
⊢ lift (succ a) = succ (lift a)
[PROOFSTEP]
rw [← add_one_eq_succ, lift_add, lift_one]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{v}
⊢ lift a + 1 = succ (lift a)
[PROOFSTEP]
rfl
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
a : α
⊢ ↑f (Sum.inl a) = Sum.inl a
[PROOFSTEP]
simpa only [InitialSeg.trans_apply, InitialSeg.leAdd_apply] using
  @InitialSeg.eq _ _ _ _ _ ((InitialSeg.leAdd r s₁).trans f) (InitialSeg.leAdd r s₂) a
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
⊢ (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
[PROOFSTEP]
intro b
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
b : β₁
⊢ { b' // ↑f (Sum.inr b) = Sum.inr b' }
[PROOFSTEP]
cases e : f (Sum.inr b)
[GOAL]
case inl
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
b : β₁
val✝ : α
e : ↑f (Sum.inr b) = Sum.inl val✝
⊢ { b' // Sum.inl val✝ = Sum.inr b' }
[PROOFSTEP]
rw [← fl] at e 
[GOAL]
case inl
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
b : β₁
val✝ : α
e : ↑f (Sum.inr b) = ↑f (Sum.inl val✝)
⊢ { b' // Sum.inl val✝ = Sum.inr b' }
[PROOFSTEP]
have := f.inj' e
[GOAL]
case inl
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
b : β₁
val✝ : α
e : ↑f (Sum.inr b) = ↑f (Sum.inl val✝)
this : Sum.inr b = Sum.inl val✝
⊢ { b' // Sum.inl val✝ = Sum.inr b' }
[PROOFSTEP]
contradiction
[GOAL]
case inr
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
b : β₁
val✝ : β₂
e : ↑f (Sum.inr b) = Sum.inr val✝
⊢ { b' // Sum.inr val✝ = Sum.inr b' }
[PROOFSTEP]
exact ⟨_, rfl⟩
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
x y : β₁
h : g x = g y
⊢ x = y
[PROOFSTEP]
injection f.inj' (by rw [fr, fr, h] : f (Sum.inr x) = f (Sum.inr y))
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
x y : β₁
h : g x = g y
⊢ ↑f (Sum.inr x) = ↑f (Sum.inr y)
[PROOFSTEP]
rw [fr, fr, h]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
a b : β₁
⊢ s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
      (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
    s₁ a b
[PROOFSTEP]
simpa only [Sum.lex_inr_inr, fr, InitialSeg.coe_coe_fn, Embedding.coeFn_mk] using
  @RelEmbedding.map_rel_iff _ _ _ _ f.toRelEmbedding (Sum.inr a) (Sum.inr b)
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
a : β₁
b : β₂
H :
  s₂ b
    (↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
          map_rel_iff' :=
            (_ :
              ∀ (a b : β₁),
                s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                    (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                  s₁ a b) }
      a)
⊢ ∃ a',
    ↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
            map_rel_iff' :=
              (_ :
                ∀ (a b : β₁),
                  s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                      (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                    s₁ a b) }
        a' =
      b
[PROOFSTEP]
rcases f.init (by rw [fr] <;> exact Sum.lex_inr_inr.2 H) with ⟨a' | a', h⟩
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
a : β₁
b : β₂
H :
  s₂ b
    (↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
          map_rel_iff' :=
            (_ :
              ∀ (a b : β₁),
                s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                    (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                  s₁ a b) }
      a)
⊢ Sum.Lex r s₂ ?m.57687 (↑f ?m.57686)
[PROOFSTEP]
rw [fr]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
a : β₁
b : β₂
H :
  s₂ b
    (↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
          map_rel_iff' :=
            (_ :
              ∀ (a b : β₁),
                s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                    (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                  s₁ a b) }
      a)
⊢ Sum.Lex r s₂ ?m.57687 (Sum.inr (g ?m.57775))
[PROOFSTEP]
exact Sum.lex_inr_inr.2 H
[GOAL]
case intro.inl
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
a : β₁
b : β₂
H :
  s₂ b
    (↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
          map_rel_iff' :=
            (_ :
              ∀ (a b : β₁),
                s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                    (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                  s₁ a b) }
      a)
a' : α
h : ↑f (Sum.inl a') = Sum.inr b
⊢ ∃ a',
    ↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
            map_rel_iff' :=
              (_ :
                ∀ (a b : β₁),
                  s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                      (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                    s₁ a b) }
        a' =
      b
[PROOFSTEP]
rw [fl] at h 
[GOAL]
case intro.inl
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
a : β₁
b : β₂
H :
  s₂ b
    (↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
          map_rel_iff' :=
            (_ :
              ∀ (a b : β₁),
                s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                    (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                  s₁ a b) }
      a)
a' : α
h : Sum.inl a' = Sum.inr b
⊢ ∃ a',
    ↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
            map_rel_iff' :=
              (_ :
                ∀ (a b : β₁),
                  s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                      (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                    s₁ a b) }
        a' =
      b
[PROOFSTEP]
cases h
[GOAL]
case intro.inr
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
a : β₁
b : β₂
H :
  s₂ b
    (↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
          map_rel_iff' :=
            (_ :
              ∀ (a b : β₁),
                s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                    (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                  s₁ a b) }
      a)
a' : β₁
h : ↑f (Sum.inr a') = Sum.inr b
⊢ ∃ a',
    ↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
            map_rel_iff' :=
              (_ :
                ∀ (a b : β₁),
                  s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                      (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                    s₁ a b) }
        a' =
      b
[PROOFSTEP]
rw [fr] at h 
[GOAL]
case intro.inr
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ b✝ c : Ordinal.{u}
α : Type u
r : α → α → Prop
hr : IsWellOrder α r
β₁ : Type u
s₁ : β₁ → β₁ → Prop
hs₁ : IsWellOrder β₁ s₁
β₂ : Type u
s₂ : β₂ → β₂ → Prop
hs₂ : IsWellOrder β₂ s₂
x✝ : type r + type s₁ ≤ type r + type s₂
f : Sum.Lex r s₁ ≼i Sum.Lex r s₂
fl : ∀ (a : α), ↑f (Sum.inl a) = Sum.inl a
this : (b : β₁) → { b' // ↑f (Sum.inr b) = Sum.inr b' }
g : β₁ → β₂ := fun b => ↑(this b)
fr : ∀ (b : β₁), ↑f (Sum.inr b) = Sum.inr (g b)
a : β₁
b : β₂
H :
  s₂ b
    (↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
          map_rel_iff' :=
            (_ :
              ∀ (a b : β₁),
                s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                    (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                  s₁ a b) }
      a)
a' : β₁
h : Sum.inr (g a') = Sum.inr b
⊢ ∃ a',
    ↑{ toEmbedding := { toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) },
            map_rel_iff' :=
              (_ :
                ∀ (a b : β₁),
                  s₂ (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } a)
                      (↑{ toFun := g, inj' := (_ : ∀ (x y : β₁), g x = g y → x = y) } b) ↔
                    s₁ a b) }
        a' =
      b
[PROOFSTEP]
exact ⟨a', Sum.inr.inj h⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
⊢ a + b = a + c ↔ b = c
[PROOFSTEP]
simp only [le_antisymm_iff, add_le_add_iff_left]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
⊢ a + b < a + c ↔ b < c
[PROOFSTEP]
rw [← not_le, ← not_le, add_le_add_iff_left]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
⊢ a + ↑0 ≤ b + ↑0 ↔ a ≤ b
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
n : ℕ
⊢ a + ↑(n + 1) ≤ b + ↑(n + 1) ↔ a ≤ b
[PROOFSTEP]
simp only [nat_cast_succ, add_succ, add_succ, succ_le_succ_iff, add_le_add_iff_right]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
n : ℕ
⊢ a + ↑n = b + ↑n ↔ a = b
[PROOFSTEP]
simp only [le_antisymm_iff, add_le_add_iff_right]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
x✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
x✝ : IsWellOrder β s
⊢ type r + type s = 0 ↔ type r = 0 ∧ type s = 0
[PROOFSTEP]
simp_rw [← type_sum_lex, type_eq_zero_iff_isEmpty]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
x✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
x✝ : IsWellOrder β s
⊢ IsEmpty (α ⊕ β) ↔ IsEmpty α ∧ IsEmpty β
[PROOFSTEP]
exact isEmpty_sum
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
⊢ pred (succ o) = o
[PROOFSTEP]
have h : ∃ a, succ o = succ a := ⟨_, rfl⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
h : ∃ a, succ o = succ a
⊢ pred (succ o) = o
[PROOFSTEP]
simpa only [pred, dif_pos h] using (succ_injective <| Classical.choose_spec h).symm
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
h : ∃ a, o = succ a
⊢ pred o ≤ o
[PROOFSTEP]
let ⟨a, e⟩ := h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
h : ∃ a, o = succ a
a : Ordinal.{u_4}
e : o = succ a
⊢ pred o ≤ o
[PROOFSTEP]
rw [e, pred_succ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
h : ∃ a, o = succ a
a : Ordinal.{u_4}
e : o = succ a
⊢ a ≤ succ a
[PROOFSTEP]
exact le_succ a
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
h : ¬∃ a, o = succ a
⊢ pred o ≤ o
[PROOFSTEP]
rw [pred, dif_neg h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
e : pred o = o
x✝ : ∃ a, o = succ a
a : Ordinal.{u_4}
e' : o = succ a
⊢ False
[PROOFSTEP]
rw [e', pred_succ] at e 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
x✝ : ∃ a, o = succ a
a : Ordinal.{u_4}
e : a = succ a
e' : o = succ a
⊢ False
[PROOFSTEP]
exact (lt_succ a).ne e
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
⊢ pred o = o ↔ ∀ (a : Ordinal.{u_4}), o ≠ succ a
[PROOFSTEP]
simpa using pred_eq_iff_not_succ
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
⊢ pred o < o ↔ ¬pred o = o
[PROOFSTEP]
simp only [le_antisymm_iff, pred_le_self, true_and_iff, not_le]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
x✝ : ∃ a, o = succ a
a : Ordinal.{u_4}
e : o = succ a
⊢ succ (pred o) = o
[PROOFSTEP]
simp only [e, pred_succ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : ∃ a, b = succ a
⊢ a < pred b ↔ succ a < b
[PROOFSTEP]
let ⟨c, e⟩ := h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : ∃ a, b = succ a
c : Ordinal.{u_4}
e : b = succ c
⊢ a < pred b ↔ succ a < b
[PROOFSTEP]
rw [e, pred_succ, succ_lt_succ_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : ¬∃ a, b = succ a
⊢ a < pred b ↔ succ a < b
[PROOFSTEP]
simp only [pred, dif_neg h, succ_lt_of_not_succ h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{v}
x✝ : ∃ a, lift o = succ a
a : Ordinal.{max v u}
h : lift o = succ a
b : Ordinal.{v}
e : lift b = a
⊢ lift o = lift (succ b)
[PROOFSTEP]
rw [h, ← e, lift_succ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{v}
x✝ : ∃ a, o = succ a
a : Ordinal.{v}
h : o = succ a
⊢ lift o = succ (lift a)
[PROOFSTEP]
simp only [h, lift_succ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{v}
h : ∃ a, o = succ a
⊢ lift (pred o) = pred (lift o)
[PROOFSTEP]
cases' h with a e
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o a : Ordinal.{v}
e : o = succ a
⊢ lift (pred o) = pred (lift o)
[PROOFSTEP]
simp only [e, pred_succ, lift_succ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{v}
h : ¬∃ a, o = succ a
⊢ lift (pred o) = pred (lift o)
[PROOFSTEP]
rw [pred_eq_iff_not_succ.2 h, pred_eq_iff_not_succ.2 (mt lift_is_succ.1 h)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
h : IsLimit o
a : Ordinal.{u_4}
⊢ a < o ↔ ∃ x, x < o ∧ a < x
[PROOFSTEP]
simpa only [not_ball, not_le, bex_def] using not_congr (@limit_le _ h a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
⊢ lift o = 0 ↔ o = 0
[PROOFSTEP]
simpa only [lift_zero] using @lift_inj o 0
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
H : ∀ (a : Ordinal.{max u_4 u_5}), a < lift o → succ a < lift o
a : Ordinal.{u_4}
h : a < o
⊢ lift (succ a) < lift o
[PROOFSTEP]
simpa only [lift_succ] using H _ (lift_lt.2 h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
H : ∀ (a : Ordinal.{u_4}), a < o → succ a < o
a : Ordinal.{max u_4 u_5}
h : a < lift o
⊢ succ a < lift o
[PROOFSTEP]
obtain ⟨a', rfl⟩ := lift_down h.le
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
H : ∀ (a : Ordinal.{u_4}), a < o → succ a < o
a' : Ordinal.{u_4}
h : lift a' < lift o
⊢ succ (lift a') < lift o
[PROOFSTEP]
rw [← lift_succ, lift_lt]
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
H : ∀ (a : Ordinal.{u_4}), a < o → succ a < o
a' : Ordinal.{u_4}
h : lift a' < lift o
⊢ succ a' < o
[PROOFSTEP]
exact H a' (lift_lt.1 h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
h : IsLimit o
⊢ 1 < o
[PROOFSTEP]
simpa only [succ_zero] using h.2 _ h.pos
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{?u.99300} → Sort u_4
o✝ : Ordinal.{?u.99300}
H₁ : C 0
H₂ : (o : Ordinal.{?u.99300}) → C o → C (succ o)
H₃ : (o : Ordinal.{?u.99300}) → IsLimit o → ((o' : Ordinal.{?u.99300}) → o' < o → C o') → C o
o : Ordinal.{?u.99300}
IH : (y : Ordinal.{?u.99300}) → y < o → C y
o0 : o = 0
⊢ C o
[PROOFSTEP]
rw [o0]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{?u.99300} → Sort u_4
o✝ : Ordinal.{?u.99300}
H₁ : C 0
H₂ : (o : Ordinal.{?u.99300}) → C o → C (succ o)
H₃ : (o : Ordinal.{?u.99300}) → IsLimit o → ((o' : Ordinal.{?u.99300}) → o' < o → C o') → C o
o : Ordinal.{?u.99300}
IH : (y : Ordinal.{?u.99300}) → y < o → C y
o0 : o = 0
⊢ C 0
[PROOFSTEP]
exact H₁
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{?u.99300} → Sort u_4
o✝ : Ordinal.{?u.99300}
H₁ : C 0
H₂ : (o : Ordinal.{?u.99300}) → C o → C (succ o)
H₃ : (o : Ordinal.{?u.99300}) → IsLimit o → ((o' : Ordinal.{?u.99300}) → o' < o → C o') → C o
o : Ordinal.{?u.99300}
IH : (y : Ordinal.{?u.99300}) → y < o → C y
o0 : ¬o = 0
h : ∃ a, o = succ a
⊢ C o
[PROOFSTEP]
rw [← succ_pred_iff_is_succ.2 h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{?u.99300} → Sort u_4
o✝ : Ordinal.{?u.99300}
H₁ : C 0
H₂ : (o : Ordinal.{?u.99300}) → C o → C (succ o)
H₃ : (o : Ordinal.{?u.99300}) → IsLimit o → ((o' : Ordinal.{?u.99300}) → o' < o → C o') → C o
o : Ordinal.{?u.99300}
IH : (y : Ordinal.{?u.99300}) → y < o → C y
o0 : ¬o = 0
h : ∃ a, o = succ a
⊢ C (succ (pred o))
[PROOFSTEP]
exact H₂ _ (IH _ <| pred_lt_iff_is_succ.2 h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
⊢ limitRecOn 0 H₁ H₂ H₃ = H₁
[PROOFSTEP]
rw [limitRecOn, lt_wf.fix_eq, dif_pos rfl]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
⊢ Eq.mpr (_ : C 0 = C 0) H₁ = H₁
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
⊢ limitRecOn (succ o) H₁ H₂ H₃ = H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
have h : ∃ a, succ o = succ a := ⟨_, rfl⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
⊢ limitRecOn (succ o) H₁ H₂ H₃ = H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
rw [limitRecOn, lt_wf.fix_eq, dif_neg (succ_ne_zero o), dif_pos h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
⊢ Eq.mpr (_ : C (succ o) = C (succ (pred (succ o))))
      (H₂ (pred (succ o))
        ((fun y x =>
            WellFounded.fix lt_wf
              (fun o IH =>
                if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
                else
                  if h : ∃ a, o = succ a then
                    Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
                  else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
              y)
          (pred (succ o)) (_ : pred (succ o) < succ o))) =
    H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
generalize limitRecOn.proof_2 (succ o) h = h₂
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
h₂ : C (succ o) = C (succ (pred (succ o)))
⊢ Eq.mpr h₂
      (H₂ (pred (succ o))
        ((fun y x =>
            WellFounded.fix lt_wf
              (fun o IH =>
                if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
                else
                  if h : ∃ a, o = succ a then
                    Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
                  else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
              y)
          (pred (succ o)) (_ : pred (succ o) < succ o))) =
    H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
generalize limitRecOn.proof_3 (succ o) h = h₃
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
h₂ : C (succ o) = C (succ (pred (succ o)))
h₃ : pred (succ o) < succ o
⊢ Eq.mpr h₂
      (H₂ (pred (succ o))
        ((fun y x =>
            WellFounded.fix lt_wf
              (fun o IH =>
                if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
                else
                  if h : ∃ a, o = succ a then
                    Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
                  else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
              y)
          (pred (succ o)) h₃)) =
    H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
revert h₂ h₃
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
⊢ ∀ (h₂ : C (succ o) = C (succ (pred (succ o)))) (h₃ : pred (succ o) < succ o),
    Eq.mpr h₂
        (H₂ (pred (succ o))
          ((fun y x =>
              WellFounded.fix lt_wf
                (fun o IH =>
                  if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
                  else
                    if h : ∃ a, o = succ a then
                      Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
                    else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
                y)
            (pred (succ o)) h₃)) =
      H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
generalize e : pred (succ o) = o'
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
o' : Ordinal.{u_4}
e : pred (succ o) = o'
⊢ ∀ (h₂ : C (succ o) = C (succ o')) (h₃ : o' < succ o),
    Eq.mpr h₂
        (H₂ o'
          ((fun y x =>
              WellFounded.fix lt_wf
                (fun o IH =>
                  if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
                  else
                    if h : ∃ a, o = succ a then
                      Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
                    else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
                y)
            o' h₃)) =
      H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
intros
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
o' : Ordinal.{u_4}
e : pred (succ o) = o'
h₂✝ : C (succ o) = C (succ o')
h₃✝ : o' < succ o
⊢ Eq.mpr h₂✝
      (H₂ o'
        ((fun y x =>
            WellFounded.fix lt_wf
              (fun o IH =>
                if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
                else
                  if h : ∃ a, o = succ a then
                    Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
                  else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
              y)
          o' h₃✝)) =
    H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
rw [pred_succ] at e 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
o' : Ordinal.{u_4}
e : o = o'
h₂✝ : C (succ o) = C (succ o')
h₃✝ : o' < succ o
⊢ Eq.mpr h₂✝
      (H₂ o'
        ((fun y x =>
            WellFounded.fix lt_wf
              (fun o IH =>
                if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
                else
                  if h : ∃ a, o = succ a then
                    Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
                  else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
              y)
          o' h₃✝)) =
    H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
subst o'
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : ∃ a, succ o = succ a
h₂✝ : C (succ o) = C (succ o)
h₃✝ : o < succ o
⊢ Eq.mpr h₂✝
      (H₂ o
        ((fun y x =>
            WellFounded.fix lt_wf
              (fun o IH =>
                if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
                else
                  if h : ∃ a, o = succ a then
                    Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
                  else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
              y)
          o h₃✝)) =
    H₂ o (limitRecOn o H₁ H₂ H₃)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : IsLimit o
⊢ limitRecOn o H₁ H₂ H₃ = H₃ o h fun x _h => limitRecOn x H₁ H₂ H₃
[PROOFSTEP]
rw [limitRecOn, lt_wf.fix_eq, dif_neg h.1, dif_neg (not_succ_of_isLimit h)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
C : Ordinal.{u_4} → Sort u_5
o : Ordinal.{u_4}
H₁ : C 0
H₂ : (o : Ordinal.{u_4}) → C o → C (succ o)
H₃ : (o : Ordinal.{u_4}) → IsLimit o → ((o' : Ordinal.{u_4}) → o' < o → C o') → C o
h : IsLimit o
⊢ (H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) fun y x =>
      WellFounded.fix lt_wf
        (fun o IH =>
          if o0 : o = 0 then Eq.mpr (_ : C o = C 0) H₁
          else
            if h : ∃ a, o = succ a then
              Eq.mpr (_ : C o = C (succ (pred o))) (H₂ (pred o) (IH (pred o) (_ : pred o < o)))
            else H₃ o (_ : o ≠ 0 ∧ ∀ (a : Ordinal.{u_4}), a < o → succ a < o) IH)
        y) =
    H₃ o h fun x _h => limitRecOn x H₁ H₂ H₃
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{?u.103711}
⊢ o < type fun x x_1 => x < x_1
[PROOFSTEP]
rw [type_lt]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{?u.103711}
⊢ o < succ o
[PROOFSTEP]
exact lt_succ o
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
α : Type u_4
r : α → α → Prop
wo : IsWellOrder α r
h : ∀ (a : Ordinal.{u_4}), a < type r → succ a < type r
x : α
⊢ ∃ y, r x y
[PROOFSTEP]
use enum r (succ (typein r x)) (h _ (typein_lt_type r x))
[GOAL]
case h
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
α : Type u_4
r : α → α → Prop
wo : IsWellOrder α r
h : ∀ (a : Ordinal.{u_4}), a < type r → succ a < type r
x : α
⊢ r x (enum r (succ (typein r x)) (_ : succ (typein r x) < type r))
[PROOFSTEP]
convert (enum_lt_enum (typein_lt_type r x) (h _ (typein_lt_type r x))).mpr (lt_succ _)
[GOAL]
case h.e'_1
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
α : Type u_4
r : α → α → Prop
wo : IsWellOrder α r
h : ∀ (a : Ordinal.{u_4}), a < type r → succ a < type r
x : α
⊢ x = enum r (typein r x) (_ : typein r x < type r)
[PROOFSTEP]
rw [enum_typein]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
ho : ∀ (a : Ordinal.{u_4}), a < o → succ a < o
⊢ ∀ (a : Ordinal.{u_4}), (a < type fun a b => a < b) → succ a < type fun a b => a < b
[PROOFSTEP]
rwa [type_lt]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
r : α → α → Prop
inst✝ : IsWellOrder α r
hr : IsLimit (type r)
x : α
⊢ Bounded r {x}
[PROOFSTEP]
refine' ⟨enum r (succ (typein r x)) (hr.2 _ (typein_lt_type r x)), _⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
r : α → α → Prop
inst✝ : IsWellOrder α r
hr : IsLimit (type r)
x : α
⊢ ∀ (b : α), b ∈ {x} → r b (enum r (succ (typein r x)) (_ : succ (typein r x) < type r))
[PROOFSTEP]
intro b hb
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
r : α → α → Prop
inst✝ : IsWellOrder α r
hr : IsLimit (type r)
x b : α
hb : b ∈ {x}
⊢ r b (enum r (succ (typein r x)) (_ : succ (typein r x) < type r))
[PROOFSTEP]
rw [mem_singleton_iff.1 hb]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
r : α → α → Prop
inst✝ : IsWellOrder α r
hr : IsLimit (type r)
x b : α
hb : b ∈ {x}
⊢ r x (enum r (succ (typein r x)) (_ : succ (typein r x) < type r))
[PROOFSTEP]
nth_rw 1 [← enum_typein r x]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
r : α → α → Prop
inst✝ : IsWellOrder α r
hr : IsLimit (type r)
x b : α
hb : b ∈ {x}
⊢ r (enum r (typein r x) (_ : typein r x < type r)) (enum r (succ (typein r x)) (_ : succ (typein r x) < type r))
[PROOFSTEP]
rw [@enum_lt_enum _ r]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
r : α → α → Prop
inst✝ : IsWellOrder α r
hr : IsLimit (type r)
x b : α
hb : b ∈ {x}
⊢ typein r x < succ (typein r x)
[PROOFSTEP]
apply lt_succ
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
⊢ type (Subrel (fun x x_1 => x < x_1) {o' | o' < o}) = lift o
[PROOFSTEP]
refine' Quotient.inductionOn o _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
⊢ ∀ (a : WellOrder),
    type (Subrel (fun x x_1 => x < x_1) {o' | o' < Quotient.mk isEquivalent a}) = lift (Quotient.mk isEquivalent a)
[PROOFSTEP]
rintro ⟨α, r, wo⟩
[GOAL]
case mk
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
α : Type u
r : α → α → Prop
wo : IsWellOrder α r
⊢ type (Subrel (fun x x_1 => x < x_1) {o' | o' < Quotient.mk isEquivalent { α := α, r := r, wo := wo }}) =
    lift (Quotient.mk isEquivalent { α := α, r := r, wo := wo })
[PROOFSTEP]
skip
[GOAL]
case mk
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
α : Type u
r : α → α → Prop
wo : IsWellOrder α r
⊢ type (Subrel (fun x x_1 => x < x_1) {o' | o' < Quotient.mk isEquivalent { α := α, r := r, wo := wo }}) =
    lift (Quotient.mk isEquivalent { α := α, r := r, wo := wo })
[PROOFSTEP]
apply Quotient.sound
[GOAL]
case mk.a
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
α : Type u
r : α → α → Prop
wo : IsWellOrder α r
⊢ { α := ↑{o' | o' < Quotient.mk isEquivalent { α := α, r := r, wo := wo }},
      r := Subrel (fun x x_1 => x < x_1) {o' | o' < Quotient.mk isEquivalent { α := α, r := r, wo := wo }},
      wo :=
        (_ :
          IsWellOrder (↑{o' | o' < Quotient.mk isEquivalent { α := α, r := r, wo := wo }})
            (Subrel (fun x x_1 => x < x_1) {o' | o' < Quotient.mk isEquivalent { α := α, r := r, wo := wo }})) } ≈
    { α := ULift { α := α, r := r, wo := wo }.α, r := ULift.down ⁻¹'o { α := α, r := r, wo := wo }.r,
      wo := (_ : IsWellOrder (ULift { α := α, r := r, wo := wo }.α) (ULift.down ⁻¹'o { α := α, r := r, wo := wo }.r)) }
[PROOFSTEP]
constructor
[GOAL]
case mk.a.val
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
α : Type u
r : α → α → Prop
wo : IsWellOrder α r
⊢ Subrel (fun x x_1 => x < x_1) {o' | o' < Quotient.mk isEquivalent { α := α, r := r, wo := wo }} ≃r
    ULift.down ⁻¹'o { α := α, r := r, wo := wo }.r
[PROOFSTEP]
refine' ((RelIso.preimage Equiv.ulift r).trans (enumIso r).symm).symm
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
⊢ #↑{o' | o' < o} = Cardinal.lift (card o)
[PROOFSTEP]
rw [lift_card, ← type_subrel_lt, card_type]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
H : IsNormal f
o : Ordinal.{u_4}
h : IsLimit o
a : Ordinal.{u_5}
⊢ ¬a < f o ↔ ¬∃ b, b < o ∧ a < f b
[PROOFSTEP]
simpa only [exists_prop, not_exists, not_and, not_lt] using H.2 _ h a
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
H : IsNormal f
a b : Ordinal.{u_4}
⊢ f a = f b ↔ a = b
[PROOFSTEP]
simp only [le_antisymm_iff, H.le_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
b : Ordinal.{u_4}
H₂ : ∀ (o : Ordinal.{u_4}), b ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
⊢ f b ≤ o
[PROOFSTEP]
induction b using limitRecOn with
| H₁ =>
  cases' p0 with x px
  have := Ordinal.le_zero.1 ((H₂ _).1 (Ordinal.zero_le _) _ px)
  rw [this] at px 
  exact h _ px
| H₂ S _ =>
  rcases not_ball.1 (mt (H₂ S).2 <| (lt_succ S).not_le) with ⟨a, h₁, h₂⟩
  exact (H.le_iff.2 <| succ_le_of_lt <| not_le.1 h₂).trans (h _ h₁)
| H₃ S L _ =>
  refine' (H.2 _ L _).2 fun a h' => _
  rcases not_ball.1 (mt (H₂ a).2 h'.not_le) with ⟨b, h₁, h₂⟩
  exact (H.le_iff.2 <| (not_le.1 h₂).le).trans (h _ h₁)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
b : Ordinal.{u_4}
H₂ : ∀ (o : Ordinal.{u_4}), b ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
⊢ f b ≤ o
[PROOFSTEP]
induction b using limitRecOn with
| H₁ =>
  cases' p0 with x px
  have := Ordinal.le_zero.1 ((H₂ _).1 (Ordinal.zero_le _) _ px)
  rw [this] at px 
  exact h _ px
| H₂ S _ =>
  rcases not_ball.1 (mt (H₂ S).2 <| (lt_succ S).not_le) with ⟨a, h₁, h₂⟩
  exact (H.le_iff.2 <| succ_le_of_lt <| not_le.1 h₂).trans (h _ h₁)
| H₃ S L _ =>
  refine' (H.2 _ L _).2 fun a h' => _
  rcases not_ball.1 (mt (H₂ a).2 h'.not_le) with ⟨b, h₁, h₂⟩
  exact (H.le_iff.2 <| (not_le.1 h₂).le).trans (h _ h₁)
[GOAL]
case H₁
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), 0 ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
⊢ f 0 ≤ o
[PROOFSTEP]

| H₁ =>
  cases' p0 with x px
  have := Ordinal.le_zero.1 ((H₂ _).1 (Ordinal.zero_le _) _ px)
  rw [this] at px 
  exact h _ px
[GOAL]
case H₁
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), 0 ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
⊢ f 0 ≤ o
[PROOFSTEP]
cases' p0 with x px
[GOAL]
case H₁.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), 0 ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
x : Ordinal.{u_4}
px : x ∈ p
⊢ f 0 ≤ o
[PROOFSTEP]
have := Ordinal.le_zero.1 ((H₂ _).1 (Ordinal.zero_le _) _ px)
[GOAL]
case H₁.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), 0 ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
x : Ordinal.{u_4}
px : x ∈ p
this : x = 0
⊢ f 0 ≤ o
[PROOFSTEP]
rw [this] at px 
[GOAL]
case H₁.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), 0 ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
x : Ordinal.{u_4}
px : 0 ∈ p
this : x = 0
⊢ f 0 ≤ o
[PROOFSTEP]
exact h _ px
[GOAL]
case H₂
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
S : Ordinal.{u_4}
a✝ : (∀ (o : Ordinal.{u_4}), S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o) → f S ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), succ S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
⊢ f (succ S) ≤ o
[PROOFSTEP]

| H₂ S _ =>
  rcases not_ball.1 (mt (H₂ S).2 <| (lt_succ S).not_le) with ⟨a, h₁, h₂⟩
  exact (H.le_iff.2 <| succ_le_of_lt <| not_le.1 h₂).trans (h _ h₁)
[GOAL]
case H₂
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
S : Ordinal.{u_4}
a✝ : (∀ (o : Ordinal.{u_4}), S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o) → f S ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), succ S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
⊢ f (succ S) ≤ o
[PROOFSTEP]
rcases not_ball.1 (mt (H₂ S).2 <| (lt_succ S).not_le) with ⟨a, h₁, h₂⟩
[GOAL]
case H₂.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
S : Ordinal.{u_4}
a✝ : (∀ (o : Ordinal.{u_4}), S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o) → f S ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), succ S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
a : Ordinal.{u_4}
h₁ : a ∈ p
h₂ : ¬a ≤ S
⊢ f (succ S) ≤ o
[PROOFSTEP]
exact (H.le_iff.2 <| succ_le_of_lt <| not_le.1 h₂).trans (h _ h₁)
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
S : Ordinal.{u_4}
L : IsLimit S
a✝ : ∀ (o' : Ordinal.{u_4}), o' < S → (∀ (o : Ordinal.{u_4}), o' ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o) → f o' ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
⊢ f S ≤ o
[PROOFSTEP]

| H₃ S L _ =>
  refine' (H.2 _ L _).2 fun a h' => _
  rcases not_ball.1 (mt (H₂ a).2 h'.not_le) with ⟨b, h₁, h₂⟩
  exact (H.le_iff.2 <| (not_le.1 h₂).le).trans (h _ h₁)
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
S : Ordinal.{u_4}
L : IsLimit S
a✝ : ∀ (o' : Ordinal.{u_4}), o' < S → (∀ (o : Ordinal.{u_4}), o' ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o) → f o' ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
⊢ f S ≤ o
[PROOFSTEP]
refine' (H.2 _ L _).2 fun a h' => _
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
S : Ordinal.{u_4}
L : IsLimit S
a✝ : ∀ (o' : Ordinal.{u_4}), o' < S → (∀ (o : Ordinal.{u_4}), o' ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o) → f o' ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
a : Ordinal.{u_4}
h' : a < S
⊢ f a ≤ o
[PROOFSTEP]
rcases not_ball.1 (mt (H₂ a).2 h'.not_le) with ⟨b, h₁, h₂⟩
[GOAL]
case H₃.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set Ordinal.{u_4}
p0 : Set.Nonempty p
h : ∀ (a : Ordinal.{u_4}), a ∈ p → f a ≤ o
S : Ordinal.{u_4}
L : IsLimit S
a✝ : ∀ (o' : Ordinal.{u_4}), o' < S → (∀ (o : Ordinal.{u_4}), o' ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o) → f o' ≤ o
H₂ : ∀ (o : Ordinal.{u_4}), S ≤ o ↔ ∀ (a : Ordinal.{u_4}), a ∈ p → a ≤ o
a : Ordinal.{u_4}
h' : a < S
b : Ordinal.{u_4}
h₁ : b ∈ p
h₂ : ¬b ≤ a
⊢ f a ≤ o
[PROOFSTEP]
exact (H.le_iff.2 <| (not_le.1 h₂).le).trans (h _ h₁)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u_4} → Ordinal.{u_5}
o : Ordinal.{u_5}
H : IsNormal f
p : Set α
p0 : Set.Nonempty p
g : α → Ordinal.{u_4}
b : Ordinal.{u_4}
H₂ : ∀ (o : Ordinal.{u_4}), b ≤ o ↔ ∀ (a : α), a ∈ p → g a ≤ o
⊢ f b ≤ o ↔ ∀ (a : α), a ∈ p → f (g a) ≤ o
[PROOFSTEP]
simpa [H₂] using H.le_set (g '' p) (p0.image g) b
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : IsLimit b
H : ∀ (b' : Ordinal.{u_4}), b' < b → a + b' ≤ c
⊢ ¬c < a + b
[PROOFSTEP]
induction a using inductionOn with
| H α r =>
  induction b using inductionOn with
  | H β s =>
    intro l
    suffices ∀ x : β, Sum.Lex r s (Sum.inr x) (enum _ _ l) by
      -- Porting note: `revert` & `intro` is required because `cases'` doesn't replace
                  --               `enum _ _ l` in `this`.
      revert this; cases' enum _ _ l with x x <;> intro this
      · cases this (enum s 0 h.pos)
      · exact irrefl _ (this _)
    intro x
    rw [← typein_lt_typein (Sum.Lex r s), typein_enum]
    have := H _ (h.2 _ (typein_lt_type s x))
    rw [add_succ, succ_le_iff] at this 
    refine' (RelEmbedding.ofMonotone (fun a => _) fun a b => _).ordinal_type_le.trans_lt this
    · rcases a with ⟨a | b, h⟩
      · exact Sum.inl a
      · exact Sum.inr ⟨b, by cases h; assumption⟩
    ·
      rcases a with ⟨a | a, h₁⟩ <;> rcases b with ⟨b | b, h₂⟩ <;> cases h₁ <;> cases h₂ <;> rintro ⟨⟩ <;>
          constructor <;>
        assumption
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : IsLimit b
H : ∀ (b' : Ordinal.{u_4}), b' < b → a + b' ≤ c
⊢ ¬c < a + b
[PROOFSTEP]
induction a using inductionOn with
| H α r =>
  induction b using inductionOn with
  | H β s =>
    intro l
    suffices ∀ x : β, Sum.Lex r s (Sum.inr x) (enum _ _ l) by
      -- Porting note: `revert` & `intro` is required because `cases'` doesn't replace
                  --               `enum _ _ l` in `this`.
      revert this; cases' enum _ _ l with x x <;> intro this
      · cases this (enum s 0 h.pos)
      · exact irrefl _ (this _)
    intro x
    rw [← typein_lt_typein (Sum.Lex r s), typein_enum]
    have := H _ (h.2 _ (typein_lt_type s x))
    rw [add_succ, succ_le_iff] at this 
    refine' (RelEmbedding.ofMonotone (fun a => _) fun a b => _).ordinal_type_le.trans_lt this
    · rcases a with ⟨a | b, h⟩
      · exact Sum.inl a
      · exact Sum.inr ⟨b, by cases h; assumption⟩
    ·
      rcases a with ⟨a | a, h₁⟩ <;> rcases b with ⟨b | b, h₂⟩ <;> cases h₁ <;> cases h₂ <;> rintro ⟨⟩ <;>
          constructor <;>
        assumption
[GOAL]
case H
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
h : IsLimit b
α : Type u_4
r : α → α → Prop
inst✝ : IsWellOrder α r
H : ∀ (b' : Ordinal.{u_4}), b' < b → type r + b' ≤ c
⊢ ¬c < type r + b
[PROOFSTEP]

| H α r =>
  induction b using inductionOn with
  | H β s =>
    intro l
    suffices ∀ x : β, Sum.Lex r s (Sum.inr x) (enum _ _ l) by
      -- Porting note: `revert` & `intro` is required because `cases'` doesn't replace
                  --               `enum _ _ l` in `this`.
      revert this; cases' enum _ _ l with x x <;> intro this
      · cases this (enum s 0 h.pos)
      · exact irrefl _ (this _)
    intro x
    rw [← typein_lt_typein (Sum.Lex r s), typein_enum]
    have := H _ (h.2 _ (typein_lt_type s x))
    rw [add_succ, succ_le_iff] at this 
    refine' (RelEmbedding.ofMonotone (fun a => _) fun a b => _).ordinal_type_le.trans_lt this
    · rcases a with ⟨a | b, h⟩
      · exact Sum.inl a
      · exact Sum.inr ⟨b, by cases h; assumption⟩
    ·
      rcases a with ⟨a | a, h₁⟩ <;> rcases b with ⟨b | b, h₂⟩ <;> cases h₁ <;> cases h₂ <;> rintro ⟨⟩ <;>
          constructor <;>
        assumption
[GOAL]
case H
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
h : IsLimit b
α : Type u_4
r : α → α → Prop
inst✝ : IsWellOrder α r
H : ∀ (b' : Ordinal.{u_4}), b' < b → type r + b' ≤ c
⊢ ¬c < type r + b
[PROOFSTEP]
induction b using inductionOn with
| H β s =>
  intro l
  suffices ∀ x : β, Sum.Lex r s (Sum.inr x) (enum _ _ l) by
    -- Porting note: `revert` & `intro` is required because `cases'` doesn't replace
                --               `enum _ _ l` in `this`.
    revert this; cases' enum _ _ l with x x <;> intro this
    · cases this (enum s 0 h.pos)
    · exact irrefl _ (this _)
  intro x
  rw [← typein_lt_typein (Sum.Lex r s), typein_enum]
  have := H _ (h.2 _ (typein_lt_type s x))
  rw [add_succ, succ_le_iff] at this 
  refine' (RelEmbedding.ofMonotone (fun a => _) fun a b => _).ordinal_type_le.trans_lt this
  · rcases a with ⟨a | b, h⟩
    · exact Sum.inl a
    · exact Sum.inr ⟨b, by cases h; assumption⟩
  ·
    rcases a with ⟨a | a, h₁⟩ <;> rcases b with ⟨b | b, h₂⟩ <;> cases h₁ <;> cases h₂ <;> rintro ⟨⟩ <;> constructor <;>
      assumption
[GOAL]
case H
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
h : IsLimit b
α : Type u_4
r : α → α → Prop
inst✝ : IsWellOrder α r
H : ∀ (b' : Ordinal.{u_4}), b' < b → type r + b' ≤ c
⊢ ¬c < type r + b
[PROOFSTEP]
induction b using inductionOn with
| H β s =>
  intro l
  suffices ∀ x : β, Sum.Lex r s (Sum.inr x) (enum _ _ l) by
    -- Porting note: `revert` & `intro` is required because `cases'` doesn't replace
                --               `enum _ _ l` in `this`.
    revert this; cases' enum _ _ l with x x <;> intro this
    · cases this (enum s 0 h.pos)
    · exact irrefl _ (this _)
  intro x
  rw [← typein_lt_typein (Sum.Lex r s), typein_enum]
  have := H _ (h.2 _ (typein_lt_type s x))
  rw [add_succ, succ_le_iff] at this 
  refine' (RelEmbedding.ofMonotone (fun a => _) fun a b => _).ordinal_type_le.trans_lt this
  · rcases a with ⟨a | b, h⟩
    · exact Sum.inl a
    · exact Sum.inr ⟨b, by cases h; assumption⟩
  ·
    rcases a with ⟨a | a, h₁⟩ <;> rcases b with ⟨b | b, h₂⟩ <;> cases h₁ <;> cases h₂ <;> rintro ⟨⟩ <;> constructor <;>
      assumption
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
⊢ ¬c < type r + type s
[PROOFSTEP]

| H β s =>
  intro l
  suffices ∀ x : β, Sum.Lex r s (Sum.inr x) (enum _ _ l) by
    -- Porting note: `revert` & `intro` is required because `cases'` doesn't replace
                --               `enum _ _ l` in `this`.
    revert this; cases' enum _ _ l with x x <;> intro this
    · cases this (enum s 0 h.pos)
    · exact irrefl _ (this _)
  intro x
  rw [← typein_lt_typein (Sum.Lex r s), typein_enum]
  have := H _ (h.2 _ (typein_lt_type s x))
  rw [add_succ, succ_le_iff] at this 
  refine' (RelEmbedding.ofMonotone (fun a => _) fun a b => _).ordinal_type_le.trans_lt this
  · rcases a with ⟨a | b, h⟩
    · exact Sum.inl a
    · exact Sum.inr ⟨b, by cases h; assumption⟩
  ·
    rcases a with ⟨a | a, h₁⟩ <;> rcases b with ⟨b | b, h₂⟩ <;> cases h₁ <;> cases h₂ <;> rintro ⟨⟩ <;> constructor <;>
      assumption
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
⊢ ¬c < type r + type s
[PROOFSTEP]
intro l
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
⊢ False
[PROOFSTEP]
suffices ∀ x : β, Sum.Lex r s (Sum.inr x) (enum _ _ l) by
  -- Porting note: `revert` & `intro` is required because `cases'` doesn't replace
              --               `enum _ _ l` in `this`.
  revert this; cases' enum _ _ l with x x <;> intro this
  · cases this (enum s 0 h.pos)
  · exact irrefl _ (this _)
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
this : ∀ (x : β), Sum.Lex r s (Sum.inr x) (enum (Sum.Lex r s) c l)
⊢ False
[PROOFSTEP]
revert this
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
⊢ (∀ (x : β), Sum.Lex r s (Sum.inr x) (enum (Sum.Lex r s) c l)) → False
[PROOFSTEP]
cases' enum _ _ l with x x
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : α
⊢ (∀ (x_1 : β), Sum.Lex r s (Sum.inr x_1) (Sum.inl x)) → False
[PROOFSTEP]
intro this
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
⊢ (∀ (x_1 : β), Sum.Lex r s (Sum.inr x_1) (Sum.inr x)) → False
[PROOFSTEP]
intro this
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : α
this : ∀ (x_1 : β), Sum.Lex r s (Sum.inr x_1) (Sum.inl x)
⊢ False
[PROOFSTEP]
cases this (enum s 0 h.pos)
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : ∀ (x_1 : β), Sum.Lex r s (Sum.inr x_1) (Sum.inr x)
⊢ False
[PROOFSTEP]
exact irrefl _ (this _)
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
⊢ ∀ (x : β), Sum.Lex r s (Sum.inr x) (enum (Sum.Lex r s) c l)
[PROOFSTEP]
intro x
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
⊢ Sum.Lex r s (Sum.inr x) (enum (Sum.Lex r s) c l)
[PROOFSTEP]
rw [← typein_lt_typein (Sum.Lex r s), typein_enum]
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
⊢ typein (Sum.Lex r s) (Sum.inr x) < c
[PROOFSTEP]
have := H _ (h.2 _ (typein_lt_type s x))
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + succ (typein s x) ≤ c
⊢ typein (Sum.Lex r s) (Sum.inr x) < c
[PROOFSTEP]
rw [add_succ, succ_le_iff] at this 
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
⊢ typein (Sum.Lex r s) (Sum.inr x) < c
[PROOFSTEP]
refine' (RelEmbedding.ofMonotone (fun a => _) fun a b => _).ordinal_type_le.trans_lt this
[GOAL]
case H.H.refine'_1
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : ↑{b | Sum.Lex r s b (Sum.inr x)}
⊢ α ⊕ ↑{b | s b x}
[PROOFSTEP]
rcases a with ⟨a | b, h⟩
[GOAL]
case H.H.refine'_1.mk.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : α
h : Sum.inl a ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ α ⊕ ↑{b | s b x}
[PROOFSTEP]
exact Sum.inl a
[GOAL]
case H.H.refine'_1.mk.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
b : β
h : Sum.inr b ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ α ⊕ ↑{b | s b x}
[PROOFSTEP]
exact Sum.inr ⟨b, by cases h; assumption⟩
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
b : β
h : Sum.inr b ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ b ∈ {b | s b x}
[PROOFSTEP]
cases h
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
b : β
h✝ : s b x
⊢ b ∈ {b | s b x}
[PROOFSTEP]
assumption
[GOAL]
case H.H.refine'_2
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : ↑{b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)} a b →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        a)
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        b)
[PROOFSTEP]
rcases a with ⟨a | a, h₁⟩
[GOAL]
case H.H.refine'_2.mk.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
b : ↑{b | Sum.Lex r s b (Sum.inr x)}
a : α
h₁ : Sum.inl a ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)} { val := Sum.inl a, property := h₁ } b →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl a, property := h₁ })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        b)
[PROOFSTEP]
rcases b with ⟨b | b, h₂⟩
[GOAL]
case H.H.refine'_2.mk.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
b : ↑{b | Sum.Lex r s b (Sum.inr x)}
a : β
h₁ : Sum.inr a ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)} { val := Sum.inr a, property := h₁ } b →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr a, property := h₁ })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        b)
[PROOFSTEP]
rcases b with ⟨b | b, h₂⟩
[GOAL]
case H.H.refine'_2.mk.inl.mk.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : α
h₁ : Sum.inl a ∈ {b | Sum.Lex r s b (Sum.inr x)}
b : α
h₂ : Sum.inl b ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)} { val := Sum.inl a, property := h₁ }
      { val := Sum.inl b, property := h₂ } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl a, property := h₁ })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl b, property := h₂ })
[PROOFSTEP]
cases h₁
[GOAL]
case H.H.refine'_2.mk.inl.mk.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : α
h₁ : Sum.inl a ∈ {b | Sum.Lex r s b (Sum.inr x)}
b : β
h₂ : Sum.inr b ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)} { val := Sum.inl a, property := h₁ }
      { val := Sum.inr b, property := h₂ } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl a, property := h₁ })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr b, property := h₂ })
[PROOFSTEP]
cases h₁
[GOAL]
case H.H.refine'_2.mk.inr.mk.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : β
h₁ : Sum.inr a ∈ {b | Sum.Lex r s b (Sum.inr x)}
b : α
h₂ : Sum.inl b ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)} { val := Sum.inr a, property := h₁ }
      { val := Sum.inl b, property := h₂ } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr a, property := h₁ })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl b, property := h₂ })
[PROOFSTEP]
cases h₁
[GOAL]
case H.H.refine'_2.mk.inr.mk.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : β
h₁ : Sum.inr a ∈ {b | Sum.Lex r s b (Sum.inr x)}
b : β
h₂ : Sum.inr b ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)} { val := Sum.inr a, property := h₁ }
      { val := Sum.inr b, property := h₂ } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr a, property := h₁ })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr b, property := h₂ })
[PROOFSTEP]
cases h₁
[GOAL]
case H.H.refine'_2.mk.inl.mk.inl.sep
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : α
h₂ : Sum.inl b ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)}
      { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) } { val := Sum.inl b, property := h₂ } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl b, property := h₂ })
[PROOFSTEP]
cases h₂
[GOAL]
case H.H.refine'_2.mk.inl.mk.inr.sep
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : α
b : β
h₂ : Sum.inr b ∈ {b | Sum.Lex r s b (Sum.inr x)}
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)}
      { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) } { val := Sum.inr b, property := h₂ } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr b, property := h₂ })
[PROOFSTEP]
cases h₂
[GOAL]
case H.H.refine'_2.mk.inr.mk.inl.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : β
b : α
h₂ : Sum.inl b ∈ {b | Sum.Lex r s b (Sum.inr x)}
h✝ : s a x
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)}
      { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) } { val := Sum.inl b, property := h₂ } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl b, property := h₂ })
[PROOFSTEP]
cases h₂
[GOAL]
case H.H.refine'_2.mk.inr.mk.inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : β
h₂ : Sum.inr b ∈ {b | Sum.Lex r s b (Sum.inr x)}
h✝ : s a x
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)}
      { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) } { val := Sum.inr b, property := h₂ } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr b, property := h₂ })
[PROOFSTEP]
cases h₂
[GOAL]
case H.H.refine'_2.mk.inl.mk.inl.sep.sep
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : α
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)}
      { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) }
      { val := Sum.inl b, property := (_ : Sum.Lex r s (Sum.inl b) (Sum.inr x)) } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl b, property := (_ : Sum.Lex r s (Sum.inl b) (Sum.inr x)) })
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case H.H.refine'_2.mk.inl.mk.inr.sep.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : α
b : β
h✝ : s b x
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)}
      { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) }
      { val := Sum.inr b, property := (_ : Sum.Lex r s (Sum.inr b) (Sum.inr x)) } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr b, property := (_ : Sum.Lex r s (Sum.inr b) (Sum.inr x)) })
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case H.H.refine'_2.mk.inr.mk.inl.inr.sep
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : β
b : α
h✝ : s a x
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)}
      { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) }
      { val := Sum.inl b, property := (_ : Sum.Lex r s (Sum.inl b) (Sum.inr x)) } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inl b, property := (_ : Sum.Lex r s (Sum.inl b) (Sum.inr x)) })
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case H.H.refine'_2.mk.inr.mk.inr.inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : β
h✝¹ : s a x
h✝ : s b x
⊢ Subrel (Sum.Lex r s) {b | Sum.Lex r s b (Sum.inr x)}
      { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) }
      { val := Sum.inr b, property := (_ : Sum.Lex r s (Sum.inr b) (Sum.inr x)) } →
    Sum.Lex r (Subrel s {b | s b x})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) })
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
              (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
        { val := Sum.inr b, property := (_ : Sum.Lex r s (Sum.inr b) (Sum.inr x)) })
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case H.H.refine'_2.mk.inl.mk.inl.sep.sep.inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : α
h✝ : r a b
⊢ Sum.Lex r (Subrel s {b | s b x})
    ((fun a =>
        Subtype.casesOn a fun val h =>
          Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
            (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
      { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) })
    ((fun a =>
        Subtype.casesOn a fun val h =>
          Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
            (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
      { val := Sum.inl b, property := (_ : Sum.Lex r s (Sum.inl b) (Sum.inr x)) })
[PROOFSTEP]
constructor
[GOAL]
case H.H.refine'_2.mk.inl.mk.inr.sep.inr.sep
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a : α
b : β
h✝ : s b x
⊢ Sum.Lex r (Subrel s {b | s b x})
    ((fun a =>
        Subtype.casesOn a fun val h =>
          Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
            (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
      { val := Sum.inl a, property := (_ : Sum.Lex r s (Sum.inl a) (Sum.inr x)) })
    ((fun a =>
        Subtype.casesOn a fun val h =>
          Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
            (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
      { val := Sum.inr b, property := (_ : Sum.Lex r s (Sum.inr b) (Sum.inr x)) })
[PROOFSTEP]
constructor
[GOAL]
case H.H.refine'_2.mk.inr.mk.inr.inr.inr.inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : β
h✝² : s a x
h✝¹ : s b x
h✝ : s a b
⊢ Sum.Lex r (Subrel s {b | s b x})
    ((fun a =>
        Subtype.casesOn a fun val h =>
          Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
            (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
      { val := Sum.inr a, property := (_ : Sum.Lex r s (Sum.inr a) (Sum.inr x)) })
    ((fun a =>
        Subtype.casesOn a fun val h =>
          Sum.casesOn (motive := fun x_1 => x_1 ∈ {b | Sum.Lex r s b (Sum.inr x)} → α ⊕ ↑{b | s b x}) val
            (fun a h => Sum.inl a) (fun b h => Sum.inr { val := b, property := (_ : b ∈ {b | s b x}) }) h)
      { val := Sum.inr b, property := (_ : Sum.Lex r s (Sum.inr b) (Sum.inr x)) })
[PROOFSTEP]
constructor
[GOAL]
case H.H.refine'_2.mk.inl.mk.inl.sep.sep.inl.h
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : α
h✝ : r a b
⊢ r a b
[PROOFSTEP]
assumption
[GOAL]
case H.H.refine'_2.mk.inr.mk.inr.inr.inr.inr.h
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r + b' ≤ c
l : c < type r + type s
x : β
this : type r + typein s x < c
a b : β
h✝² : s a x
h✝¹ : s b x
h✝ : s a b
⊢ Subrel s {b | s b x} { val := a, property := (_ : a ∈ {b | s b x}) } { val := b, property := (_ : b ∈ {b | s b x}) }
[PROOFSTEP]
assumption
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≤ a
⊢ b + (a - b) ≤ a
[PROOFSTEP]
rcases zero_or_succ_or_limit (a - b) with (e | ⟨c, e⟩ | l)
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≤ a
e : a - b = 0
⊢ b + (a - b) ≤ a
[PROOFSTEP]
simp only [e, add_zero, h]
[GOAL]
case inr.inl.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≤ a
c : Ordinal.{u_4}
e : a - b = succ c
⊢ b + (a - b) ≤ a
[PROOFSTEP]
rw [e, add_succ, succ_le_iff, ← lt_sub, e]
[GOAL]
case inr.inl.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≤ a
c : Ordinal.{u_4}
e : a - b = succ c
⊢ c < succ c
[PROOFSTEP]
exact lt_succ c
[GOAL]
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≤ a
l : IsLimit (a - b)
⊢ b + (a - b) ≤ a
[PROOFSTEP]
exact (add_le_of_limit l).2 fun c l => (lt_sub.1 l).le
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : b ≤ a
⊢ c ≤ a - b ↔ b + c ≤ a
[PROOFSTEP]
rw [← add_le_add_iff_left b, Ordinal.add_sub_cancel_of_le h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
⊢ a - 0 = a
[PROOFSTEP]
simpa only [zero_add] using add_sub_cancel 0 a
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
⊢ 0 - a = 0
[PROOFSTEP]
rw [← Ordinal.le_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
⊢ 0 - a ≤ 0
[PROOFSTEP]
apply sub_le_self
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
⊢ a - a = 0
[PROOFSTEP]
simpa only [add_zero] using add_sub_cancel a 0
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : a - b = 0
⊢ a ≤ b
[PROOFSTEP]
simpa only [h, add_zero] using le_add_sub a b
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : a ≤ b
⊢ a - b = 0
[PROOFSTEP]
rwa [← Ordinal.le_zero, sub_le, add_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c d : Ordinal.{u_4}
⊢ a - b - c ≤ d ↔ a - (b + c) ≤ d
[PROOFSTEP]
rw [sub_le, sub_le, sub_le, add_assoc]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
⊢ a + b - (a + c) = b - c
[PROOFSTEP]
rw [← sub_sub, add_sub_cancel]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
l : IsLimit a
h : b < a
⊢ b + 0 < a
[PROOFSTEP]
rwa [add_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
l : IsLimit a
h✝ : b < a
c : Ordinal.{u_4}
h : c < a - b
⊢ succ c < a - b
[PROOFSTEP]
rw [lt_sub, add_succ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
l : IsLimit a
h✝ : b < a
c : Ordinal.{u_4}
h : c < a - b
⊢ succ (b + c) < a
[PROOFSTEP]
exact l.2 _ (lt_sub.1 h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
⊢ 1 + ω = ω
[PROOFSTEP]
refine' le_antisymm _ (le_add_left _ _)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
⊢ 1 + ω ≤ ω
[PROOFSTEP]
rw [omega, ← lift_one.{_, 0}, ← lift_add, lift_le, ← type_unit, ← type_sum_lex]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
⊢ type (Sum.Lex EmptyRelation fun x x_1 => x < x_1) ≤ type fun x x_1 => x < x_1
[PROOFSTEP]
refine' ⟨RelEmbedding.collapse (RelEmbedding.ofMonotone _ _)⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
⊢ Unit ⊕ ℕ → ℕ
[PROOFSTEP]
apply Sum.rec
[GOAL]
case refine'_1.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
⊢ Unit → ℕ
case refine'_1.inr α : Type u_1 β : Type u_2 γ : Type u_3 r : α → α → Prop s : β → β → Prop t : γ → γ → Prop ⊢ ℕ → ℕ
[PROOFSTEP]
exact fun _ => 0
[GOAL]
case refine'_1.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
⊢ ℕ → ℕ
[PROOFSTEP]
exact Nat.succ
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
⊢ ∀ (a b : Unit ⊕ ℕ),
    Sum.Lex EmptyRelation (fun x x_1 => x < x_1) a b → Sum.rec (fun x => 0) Nat.succ a < Sum.rec (fun x => 0) Nat.succ b
[PROOFSTEP]
intro a b
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Unit ⊕ ℕ
⊢ Sum.Lex EmptyRelation (fun x x_1 => x < x_1) a b → Sum.rec (fun x => 0) Nat.succ a < Sum.rec (fun x => 0) Nat.succ b
[PROOFSTEP]
cases a <;> cases b <;> intro H <;> cases' H with _ _ H _ _ H <;> [exact H.elim; exact Nat.succ_pos _;
  exact Nat.succ_lt_succ H]
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Unit ⊕ ℕ
⊢ Sum.Lex EmptyRelation (fun x x_1 => x < x_1) a b → Sum.rec (fun x => 0) Nat.succ a < Sum.rec (fun x => 0) Nat.succ b
[PROOFSTEP]
cases a
[GOAL]
case refine'_2.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b : Unit ⊕ ℕ
val✝ : Unit
⊢ Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inl val✝) b →
    Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝) < Sum.rec (fun x => 0) Nat.succ b
[PROOFSTEP]
cases b
[GOAL]
case refine'_2.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b : Unit ⊕ ℕ
val✝ : ℕ
⊢ Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inr val✝) b →
    Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝) < Sum.rec (fun x => 0) Nat.succ b
[PROOFSTEP]
cases b
[GOAL]
case refine'_2.inl.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ val✝ : Unit
⊢ Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inl val✝¹) (Sum.inl val✝) →
    Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝)
[PROOFSTEP]
intro H
[GOAL]
case refine'_2.inl.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ : Unit
val✝ : ℕ
⊢ Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inl val✝¹) (Sum.inr val✝) →
    Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝)
[PROOFSTEP]
intro H
[GOAL]
case refine'_2.inr.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ : ℕ
val✝ : Unit
⊢ Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inr val✝¹) (Sum.inl val✝) →
    Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝)
[PROOFSTEP]
intro H
[GOAL]
case refine'_2.inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ val✝ : ℕ
⊢ Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inr val✝¹) (Sum.inr val✝) →
    Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝)
[PROOFSTEP]
intro H
[GOAL]
case refine'_2.inl.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ val✝ : Unit
H : Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inl val✝¹) (Sum.inl val✝)
⊢ Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝)
[PROOFSTEP]
cases' H with _ _ H _ _ H
[GOAL]
case refine'_2.inl.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ : Unit
val✝ : ℕ
H : Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inl val✝¹) (Sum.inr val✝)
⊢ Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝)
[PROOFSTEP]
cases' H with _ _ H _ _ H
[GOAL]
case refine'_2.inr.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ : ℕ
val✝ : Unit
H : Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inr val✝¹) (Sum.inl val✝)
⊢ Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝)
[PROOFSTEP]
cases' H with _ _ H _ _ H
[GOAL]
case refine'_2.inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ val✝ : ℕ
H : Sum.Lex EmptyRelation (fun x x_1 => x < x_1) (Sum.inr val✝¹) (Sum.inr val✝)
⊢ Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝)
[PROOFSTEP]
cases' H with _ _ H _ _ H
[GOAL]
case refine'_2.inl.inl.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ val✝ a₁✝ a₂✝ : Unit
H : EmptyRelation a₁✝ a₂✝
⊢ Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝)
[PROOFSTEP]
exact H.elim
[GOAL]
case refine'_2.inl.inr.sep
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ : Unit
val✝ : ℕ
a✝ : Unit
⊢ Sum.rec (fun x => 0) Nat.succ (Sum.inl val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝)
[PROOFSTEP]
exact Nat.succ_pos _
[GOAL]
case refine'_2.inr.inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
val✝¹ val✝ : ℕ
H : val✝¹ < val✝
⊢ Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝¹) < Sum.rec (fun x => 0) Nat.succ (Sum.inr val✝)
[PROOFSTEP]
exact Nat.succ_lt_succ H
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
h : ω ≤ o
⊢ 1 + o = o
[PROOFSTEP]
rw [← Ordinal.add_sub_cancel_of_le h, ← add_assoc, one_add_omega]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a✝ b✝ c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a b : (γ × β) × α
⊢ Prod.Lex t (Prod.Lex s r) (↑(prodAssoc γ β α) a) (↑(prodAssoc γ β α) b) ↔ Prod.Lex (Prod.Lex t s) r a b
[PROOFSTEP]
rcases a with ⟨⟨a₁, a₂⟩, a₃⟩
[GOAL]
case mk.mk
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b✝ c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
b : (γ × β) × α
a₃ : α
a₁ : γ
a₂ : β
⊢ Prod.Lex t (Prod.Lex s r) (↑(prodAssoc γ β α) ((a₁, a₂), a₃)) (↑(prodAssoc γ β α) b) ↔
    Prod.Lex (Prod.Lex t s) r ((a₁, a₂), a₃) b
[PROOFSTEP]
rcases b with ⟨⟨b₁, b₂⟩, b₃⟩
[GOAL]
case mk.mk.mk.mk
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₃ : α
a₁ : γ
a₂ : β
b₃ : α
b₁ : γ
b₂ : β
⊢ Prod.Lex t (Prod.Lex s r) (↑(prodAssoc γ β α) ((a₁, a₂), a₃)) (↑(prodAssoc γ β α) ((b₁, b₂), b₃)) ↔
    Prod.Lex (Prod.Lex t s) r ((a₁, a₂), a₃) ((b₁, b₂), b₃)
[PROOFSTEP]
simp [Prod.lex_def, and_or_left, or_assoc, and_assoc]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
a b : α × PUnit
⊢ r (↑(prodPUnit α) a) (↑(prodPUnit α) b) ↔ Prod.Lex r EmptyRelation a b
[PROOFSTEP]
rcases a with ⟨a, ⟨⟨⟩⟩⟩
[GOAL]
case mk.unit
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
b : α × PUnit
a : α
⊢ r (↑(prodPUnit α) (a, PUnit.unit)) (↑(prodPUnit α) b) ↔ Prod.Lex r EmptyRelation (a, PUnit.unit) b
[PROOFSTEP]
rcases b with ⟨b, ⟨⟨⟩⟩⟩
[GOAL]
case mk.unit.mk.unit
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
a b : α
⊢ r (↑(prodPUnit α) (a, PUnit.unit)) (↑(prodPUnit α) (b, PUnit.unit)) ↔
    Prod.Lex r EmptyRelation (a, PUnit.unit) (b, PUnit.unit)
[PROOFSTEP]
simp only [Prod.lex_def, EmptyRelation, and_false_iff, or_false_iff]
[GOAL]
case mk.unit.mk.unit
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
a b : α
⊢ r (↑(prodPUnit α) (a, PUnit.unit)) (↑(prodPUnit α) (b, PUnit.unit)) ↔ r a b
[PROOFSTEP]
rfl
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
a b : PUnit × α
⊢ r (↑(punitProd α) a) (↑(punitProd α) b) ↔ Prod.Lex EmptyRelation r a b
[PROOFSTEP]
rcases a with ⟨⟨⟨⟩⟩, a⟩
[GOAL]
case mk.unit
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
b : PUnit × α
a : α
⊢ r (↑(punitProd α) (PUnit.unit, a)) (↑(punitProd α) b) ↔ Prod.Lex EmptyRelation r (PUnit.unit, a) b
[PROOFSTEP]
rcases b with ⟨⟨⟨⟩⟩, b⟩
[GOAL]
case mk.unit.mk.unit
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
a b : α
⊢ r (↑(punitProd α) (PUnit.unit, a)) (↑(punitProd α) (PUnit.unit, b)) ↔
    Prod.Lex EmptyRelation r (PUnit.unit, a) (PUnit.unit, b)
[PROOFSTEP]
simp only [Prod.lex_def, EmptyRelation, false_or_iff]
[GOAL]
case mk.unit.mk.unit
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
a b : α
⊢ r (↑(punitProd α) (PUnit.unit, a)) (↑(punitProd α) (PUnit.unit, b)) ↔ True ∧ r a b
[PROOFSTEP]
simp only [eq_self_iff_true, true_and_iff]
[GOAL]
case mk.unit.mk.unit
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
a✝ : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
a b : α
⊢ r (↑(punitProd α) (PUnit.unit, a)) (↑(punitProd α) (PUnit.unit, b)) ↔ r a b
[PROOFSTEP]
rfl
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
α : Type u_4
x✝³ : α → α → Prop
x✝² : IsWellOrder α x✝³
β : Type u_4
x✝¹ : β → β → Prop
x✝ : IsWellOrder β x✝¹
⊢ type x✝³ * type x✝¹ = 0 ↔ type x✝³ = 0 ∨ type x✝¹ = 0
[PROOFSTEP]
simp_rw [← type_prod_lex, type_eq_zero_iff_isEmpty]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
α : Type u_4
x✝³ : α → α → Prop
x✝² : IsWellOrder α x✝³
β : Type u_4
x✝¹ : β → β → Prop
x✝ : IsWellOrder β x✝¹
⊢ IsEmpty (β × α) ↔ IsEmpty α ∨ IsEmpty β
[PROOFSTEP]
rw [or_comm]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
α : Type u_4
x✝³ : α → α → Prop
x✝² : IsWellOrder α x✝³
β : Type u_4
x✝¹ : β → β → Prop
x✝ : IsWellOrder β x✝¹
⊢ IsEmpty (β × α) ↔ IsEmpty β ∨ IsEmpty α
[PROOFSTEP]
exact isEmpty_prod
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
⊢ ∀ {a b : (β ⊕ γ) × α},
    Sum.Lex (Prod.Lex s r) (Prod.Lex t r) (↑(sumProdDistrib β γ α) a) (↑(sumProdDistrib β γ α) b) ↔
      Prod.Lex (Sum.Lex s t) r a b
[PROOFSTEP]
rintro ⟨a₁ | a₁, a₂⟩ ⟨b₁ | b₁, b₂⟩
[GOAL]
case mk.inl.mk.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₂ : α
a₁ : β
b₂ : α
b₁ : β
⊢ Sum.Lex (Prod.Lex s r) (Prod.Lex t r) (↑(sumProdDistrib β γ α) (Sum.inl a₁, a₂))
      (↑(sumProdDistrib β γ α) (Sum.inl b₁, b₂)) ↔
    Prod.Lex (Sum.Lex s t) r (Sum.inl a₁, a₂) (Sum.inl b₁, b₂)
[PROOFSTEP]
simp only [Prod.lex_def, Sum.lex_inl_inl, Sum.Lex.sep, Sum.lex_inr_inl, Sum.lex_inr_inr, sumProdDistrib_apply_left,
  sumProdDistrib_apply_right]
[GOAL]
case mk.inl.mk.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₂ : α
a₁ : β
b₂ : α
b₁ : γ
⊢ Sum.Lex (Prod.Lex s r) (Prod.Lex t r) (↑(sumProdDistrib β γ α) (Sum.inl a₁, a₂))
      (↑(sumProdDistrib β γ α) (Sum.inr b₁, b₂)) ↔
    Prod.Lex (Sum.Lex s t) r (Sum.inl a₁, a₂) (Sum.inr b₁, b₂)
[PROOFSTEP]
simp only [Prod.lex_def, Sum.lex_inl_inl, Sum.Lex.sep, Sum.lex_inr_inl, Sum.lex_inr_inr, sumProdDistrib_apply_left,
  sumProdDistrib_apply_right]
[GOAL]
case mk.inr.mk.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₂ : α
a₁ : γ
b₂ : α
b₁ : β
⊢ Sum.Lex (Prod.Lex s r) (Prod.Lex t r) (↑(sumProdDistrib β γ α) (Sum.inr a₁, a₂))
      (↑(sumProdDistrib β γ α) (Sum.inl b₁, b₂)) ↔
    Prod.Lex (Sum.Lex s t) r (Sum.inr a₁, a₂) (Sum.inl b₁, b₂)
[PROOFSTEP]
simp only [Prod.lex_def, Sum.lex_inl_inl, Sum.Lex.sep, Sum.lex_inr_inl, Sum.lex_inr_inr, sumProdDistrib_apply_left,
  sumProdDistrib_apply_right]
[GOAL]
case mk.inr.mk.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₂ : α
a₁ : γ
b₂ : α
b₁ : γ
⊢ Sum.Lex (Prod.Lex s r) (Prod.Lex t r) (↑(sumProdDistrib β γ α) (Sum.inr a₁, a₂))
      (↑(sumProdDistrib β γ α) (Sum.inr b₁, b₂)) ↔
    Prod.Lex (Sum.Lex s t) r (Sum.inr a₁, a₂) (Sum.inr b₁, b₂)
[PROOFSTEP]
simp only [Prod.lex_def, Sum.lex_inl_inl, Sum.Lex.sep, Sum.lex_inr_inl, Sum.lex_inr_inr, sumProdDistrib_apply_left,
  sumProdDistrib_apply_right]
[GOAL]
case mk.inl.mk.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₂ : α
a₁ : β
b₂ : α
b₁ : β
⊢ s a₁ b₁ ∨ a₁ = b₁ ∧ r a₂ b₂ ↔ s a₁ b₁ ∨ Sum.inl a₁ = Sum.inl b₁ ∧ r a₂ b₂
[PROOFSTEP]
simp only [Sum.inl.inj_iff, Sum.inr.inj_iff, true_or_iff, false_and_iff, false_or_iff]
[GOAL]
case mk.inl.mk.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₂ : α
a₁ : β
b₂ : α
b₁ : γ
⊢ True ↔ True ∨ False ∧ r a₂ b₂
[PROOFSTEP]
simp only [Sum.inl.inj_iff, Sum.inr.inj_iff, true_or_iff, false_and_iff, false_or_iff]
[GOAL]
case mk.inr.mk.inl
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₂ : α
a₁ : γ
b₂ : α
b₁ : β
⊢ False ↔ False ∨ False ∧ r a₂ b₂
[PROOFSTEP]
simp only [Sum.inl.inj_iff, Sum.inr.inj_iff, true_or_iff, false_and_iff, false_or_iff]
[GOAL]
case mk.inr.mk.inr
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
a b c : Ordinal.{u}
x✝² x✝¹ x✝ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
a₂ : α
a₁ : γ
b₂ : α
b₁ : γ
⊢ t a₁ b₁ ∨ a₁ = b₁ ∧ r a₂ b₂ ↔ t a₁ b₁ ∨ Sum.inr a₁ = Sum.inr b₁ ∧ r a₂ b₂
[PROOFSTEP]
simp only [Sum.inl.inj_iff, Sum.inr.inj_iff, true_or_iff, false_and_iff, false_or_iff]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
c a b : Ordinal.{u}
x✝³ x✝² x✝¹ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
x✝ : Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤ Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
f : r ≼i s
⊢ Quotient.mk isEquivalent { α := γ, r := t, wo := wo✝ } * Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤
    Quotient.mk isEquivalent { α := γ, r := t, wo := wo✝ } * Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
[PROOFSTEP]
refine' (RelEmbedding.ofMonotone (fun a : α × γ => (f a.1, a.2)) fun a b h => _).ordinal_type_le
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
c a✝ b✝ : Ordinal.{u}
x✝³ x✝² x✝¹ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
x✝ : Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤ Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
f : r ≼i s
a b : α × γ
h : Prod.Lex r t a b
⊢ Prod.Lex s t ((fun a => (↑f a.fst, a.snd)) a) ((fun a => (↑f a.fst, a.snd)) b)
[PROOFSTEP]
cases' h with a₁ b₁ a₂ b₂ h' a b₁ b₂ h'
[GOAL]
case left
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
c a b : Ordinal.{u}
x✝³ x✝² x✝¹ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
x✝ : Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤ Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
f : r ≼i s
a₁ : α
b₁ : γ
a₂ : α
b₂ : γ
h' : r a₁ a₂
⊢ Prod.Lex s t ((fun a => (↑f a.fst, a.snd)) (a₁, b₁)) ((fun a => (↑f a.fst, a.snd)) (a₂, b₂))
[PROOFSTEP]
exact Prod.Lex.left _ _ (f.toRelEmbedding.map_rel_iff.2 h')
[GOAL]
case right
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
c a✝ b : Ordinal.{u}
x✝³ x✝² x✝¹ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
x✝ : Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤ Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
f : r ≼i s
a : α
b₁ b₂ : γ
h' : t b₁ b₂
⊢ Prod.Lex s t ((fun a => (↑f a.fst, a.snd)) (a, b₁)) ((fun a => (↑f a.fst, a.snd)) (a, b₂))
[PROOFSTEP]
exact Prod.Lex.right _ h'
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
c a b : Ordinal.{u}
x✝³ x✝² x✝¹ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
x✝ : Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤ Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
f : r ≼i s
⊢ Function.swap (fun x x_1 => x * x_1) (Quotient.mk isEquivalent { α := γ, r := t, wo := wo✝ })
      (Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² }) ≤
    Function.swap (fun x x_1 => x * x_1) (Quotient.mk isEquivalent { α := γ, r := t, wo := wo✝ })
      (Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ })
[PROOFSTEP]
refine' (RelEmbedding.ofMonotone (fun a : γ × α => (a.1, f a.2)) fun a b h => _).ordinal_type_le
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
c a✝ b✝ : Ordinal.{u}
x✝³ x✝² x✝¹ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
x✝ : Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤ Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
f : r ≼i s
a b : γ × α
h : Prod.Lex t r a b
⊢ Prod.Lex t s ((fun a => (a.fst, ↑f a.snd)) a) ((fun a => (a.fst, ↑f a.snd)) b)
[PROOFSTEP]
cases' h with a₁ b₁ a₂ b₂ h' a b₁ b₂ h'
[GOAL]
case left
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
c a b : Ordinal.{u}
x✝³ x✝² x✝¹ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
x✝ : Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤ Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
f : r ≼i s
a₁ : γ
b₁ : α
a₂ : γ
b₂ : α
h' : t a₁ a₂
⊢ Prod.Lex t s ((fun a => (a.fst, ↑f a.snd)) (a₁, b₁)) ((fun a => (a.fst, ↑f a.snd)) (a₂, b₂))
[PROOFSTEP]
exact Prod.Lex.left _ _ h'
[GOAL]
case right
α✝ : Type u_1
β✝ : Type u_2
γ✝ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t✝ : γ✝ → γ✝ → Prop
c a✝ b : Ordinal.{u}
x✝³ x✝² x✝¹ : WellOrder
α : Type u
r : α → α → Prop
wo✝² : IsWellOrder α r
β : Type u
s : β → β → Prop
wo✝¹ : IsWellOrder β s
x✝ : Quotient.mk isEquivalent { α := α, r := r, wo := wo✝² } ≤ Quotient.mk isEquivalent { α := β, r := s, wo := wo✝¹ }
γ : Type u
t : γ → γ → Prop
wo✝ : IsWellOrder γ t
f : r ≼i s
a : γ
b₁ b₂ : α
h' : r b₁ b₂
⊢ Prod.Lex t s ((fun a => (a.fst, ↑f a.snd)) (a, b₁)) ((fun a => (a.fst, ↑f a.snd)) (a, b₂))
[PROOFSTEP]
exact Prod.Lex.right _ (f.toRelEmbedding.map_rel_iff.2 h')
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
hb : 0 < b
⊢ a ≤ a * b
[PROOFSTEP]
convert mul_le_mul_left' (one_le_iff_pos.2 hb) a
[GOAL]
case h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
hb : 0 < b
⊢ a = a * 1
[PROOFSTEP]
rw [mul_one a]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
hb : 0 < b
⊢ a ≤ b * a
[PROOFSTEP]
convert mul_le_mul_right' (one_le_iff_pos.2 hb) a
[GOAL]
case h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
hb : 0 < b
⊢ a = 1 * a
[PROOFSTEP]
rw [one_mul a]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
⊢ False
[PROOFSTEP]
suffices ∀ a b, Prod.Lex s r (b, a) (enum _ _ l)
  by
  cases' enum _ _ l with b a
  exact irrefl _ (this _ _)
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
this : ∀ (a : α) (b : β), Prod.Lex s r (b, a) (enum (Prod.Lex s r) c l)
⊢ False
[PROOFSTEP]
cases' enum _ _ l with b a
[GOAL]
case mk
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
this : ∀ (a : α) (b : β), Prod.Lex s r (b, a) (enum (Prod.Lex s r) c l)
b : β
a : α
⊢ False
[PROOFSTEP]
exact irrefl _ (this _ _)
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
⊢ ∀ (a : α) (b : β), Prod.Lex s r (b, a) (enum (Prod.Lex s r) c l)
[PROOFSTEP]
intro a b
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
⊢ Prod.Lex s r (b, a) (enum (Prod.Lex s r) c l)
[PROOFSTEP]
rw [← typein_lt_typein (Prod.Lex s r), typein_enum]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
⊢ typein (Prod.Lex s r) (b, a) < c
[PROOFSTEP]
have := H _ (h.2 _ (typein_lt_type s b))
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this : type r * succ (typein s b) ≤ c
⊢ typein (Prod.Lex s r) (b, a) < c
[PROOFSTEP]
rw [mul_succ] at this 
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this : type r * typein s b + type r ≤ c
⊢ typein (Prod.Lex s r) (b, a) < c
[PROOFSTEP]
have := ((add_lt_add_iff_left _).2 (typein_lt_type _ a)).trans_le this
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
⊢ typein (Prod.Lex s r) (b, a) < c
[PROOFSTEP]
refine' (RelEmbedding.ofMonotone (fun a => _) fun a b => _).ordinal_type_le.trans_lt this
[GOAL]
case refine'_1
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a✝ : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a✝ < c
a : ↑{b_1 | Prod.Lex s r b_1 (b, a✝)}
⊢ ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a✝}
[PROOFSTEP]
rcases a with ⟨⟨b', a'⟩, h⟩
[GOAL]
case refine'_1.mk.mk
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b' : β
a' : α
h : (b', a') ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
⊢ ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a}
[PROOFSTEP]
by_cases e : b = b'
[GOAL]
case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b' : β
a' : α
h : (b', a') ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
e : b = b'
⊢ ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a}
[PROOFSTEP]
refine' Sum.inr ⟨a', _⟩
[GOAL]
case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b' : β
a' : α
h : (b', a') ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
e : b = b'
⊢ a' ∈ {b | r b a}
[PROOFSTEP]
subst e
[GOAL]
case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a' : α
h : (b, a') ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
⊢ a' ∈ {b | r b a}
[PROOFSTEP]
cases' h with _ _ _ _ h _ _ _ h
[GOAL]
case pos.left
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a' : α
h : s b b
⊢ a' ∈ {b | r b a}
[PROOFSTEP]
exact (irrefl _ h).elim
[GOAL]
case pos.right
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a' : α
h : r a' a
⊢ a' ∈ {b | r b a}
[PROOFSTEP]
exact h
[GOAL]
case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b' : β
a' : α
h : (b', a') ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
e : ¬b = b'
⊢ ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a}
[PROOFSTEP]
refine' Sum.inl (⟨b', _⟩, a')
[GOAL]
case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b' : β
a' : α
h : (b', a') ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
e : ¬b = b'
⊢ b' ∈ {b_1 | s b_1 b}
[PROOFSTEP]
cases' h with _ _ _ _ h _ _ _ h
[GOAL]
case neg.left
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b' : β
a' : α
e : ¬b = b'
h : s b' b
⊢ b' ∈ {b_1 | s b_1 b}
[PROOFSTEP]
exact h
[GOAL]
case neg.right
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a' : α
e : ¬b = b
h : r a' a
⊢ b ∈ {b_1 | s b_1 b}
[PROOFSTEP]
exact (e rfl).elim
[GOAL]
case refine'_2
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a✝ : α
b✝ : β
this✝ : type r * typein s b✝ + type r ≤ c
this : type r * typein s b✝ + typein r a✝ < c
a b : ↑{b | Prod.Lex s r b (b✝, a✝)}
⊢ Subrel (Prod.Lex s r) {b | Prod.Lex s r b (b✝, a✝)} a b →
    Sum.Lex (Prod.Lex (Subrel s {b | s b b✝}) r) (Subrel r {b | r b a✝})
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Prod.casesOn (motive := fun x => x ∈ {b | Prod.Lex s r b (b✝, a✝)} → ↑{b | s b b✝} × α ⊕ ↑{b | r b a✝}) val
              (fun b' a' h =>
                if e : b✝ = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a✝}) }
                else Sum.inl ({ val := b', property := (_ : b' ∈ {b | s b b✝}) }, a'))
              h)
        a)
      ((fun a =>
          Subtype.casesOn a fun val h =>
            Prod.casesOn (motive := fun x => x ∈ {b | Prod.Lex s r b (b✝, a✝)} → ↑{b | s b b✝} × α ⊕ ↑{b | r b a✝}) val
              (fun b' a' h =>
                if e : b✝ = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a✝}) }
                else Sum.inl ({ val := b', property := (_ : b' ∈ {b | s b b✝}) }, a'))
              h)
        b)
[PROOFSTEP]
rcases a with ⟨⟨b₁, a₁⟩, h₁⟩
[GOAL]
case refine'_2.mk.mk
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b✝ : β
this✝ : type r * typein s b✝ + type r ≤ c
this : type r * typein s b✝ + typein r a < c
b : ↑{b | Prod.Lex s r b (b✝, a)}
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b | Prod.Lex s r b (b✝, a)}
⊢ Subrel (Prod.Lex s r) {b | Prod.Lex s r b (b✝, a)} { val := (b₁, a₁), property := h₁ } b →
    Sum.Lex (Prod.Lex (Subrel s {b | s b b✝}) r) (Subrel r {b | r b a})
      ((fun a_2 =>
          Subtype.casesOn a_2 fun val h =>
            Prod.casesOn (motive := fun x => x ∈ {b | Prod.Lex s r b (b✝, a)} → ↑{b | s b b✝} × α ⊕ ↑{b | r b a}) val
              (fun b' a' h =>
                if e : b✝ = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
                else Sum.inl ({ val := b', property := (_ : b' ∈ {b | s b b✝}) }, a'))
              h)
        { val := (b₁, a₁), property := h₁ })
      ((fun a_2 =>
          Subtype.casesOn a_2 fun val h =>
            Prod.casesOn (motive := fun x => x ∈ {b | Prod.Lex s r b (b✝, a)} → ↑{b | s b b✝} × α ⊕ ↑{b | r b a}) val
              (fun b' a' h =>
                if e : b✝ = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
                else Sum.inl ({ val := b', property := (_ : b' ∈ {b | s b b✝}) }, a'))
              h)
        b)
[PROOFSTEP]
rcases b with ⟨⟨b₂, a₂⟩, h₂⟩
[GOAL]
case refine'_2.mk.mk.mk.mk
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
⊢ Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b₁, a₁), property := h₁ }
      { val := (b₂, a₂), property := h₂ } →
    Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
      ((fun a_2 =>
          Subtype.casesOn a_2 fun val h =>
            Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
              val
              (fun b' a' h =>
                if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
                else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
              h)
        { val := (b₁, a₁), property := h₁ })
      ((fun a_2 =>
          Subtype.casesOn a_2 fun val h =>
            Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
              val
              (fun b' a' h =>
                if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
                else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
              h)
        { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
intro h
[GOAL]
case refine'_2.mk.mk.mk.mk
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b₁, a₁), property := h₁ }
    { val := (b₂, a₂), property := h₂ }
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₁, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
by_cases e₁ : b = b₁
[GOAL]
case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b₁, a₁), property := h₁ }
    { val := (b₂, a₂), property := h₂ }
e₁ : b = b₁
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₁, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
by_cases e₂ : b = b₂
[GOAL]
case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b₁, a₁), property := h₁ }
    { val := (b₂, a₂), property := h₂ }
e₁ : ¬b = b₁
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₁, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
by_cases e₂ : b = b₂
[GOAL]
case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b₁, a₁), property := h₁ }
    { val := (b₂, a₂), property := h₂ }
e₁ : b = b₁
e₂ : b = b₂
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₁, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
substs b₁ b₂
[GOAL]
case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a₁ a₂ : α
h₁ : (b, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h₂ : (b, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b, a₁), property := h₁ }
    { val := (b, a₂), property := h₂ }
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b, a₂), property := h₂ })
[PROOFSTEP]
simpa only [subrel_val, Prod.lex_def, @irrefl _ s _ b, true_and_iff, false_or_iff, eq_self_iff_true, dif_pos,
  Sum.lex_inr_inr] using h
[GOAL]
case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b₁, a₁), property := h₁ }
    { val := (b₂, a₂), property := h₂ }
e₁ : b = b₁
e₂ : ¬b = b₂
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₁, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
subst b₁
[GOAL]
case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a₁ : α
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
e₂ : ¬b = b₂
h₁ : (b, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b, a₁), property := h₁ }
    { val := (b₂, a₂), property := h₂ }
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
simp only [subrel_val, Prod.lex_def, e₂, Prod.lex_def, dif_pos, subrel_val, eq_self_iff_true, or_false_iff, dif_neg,
  not_false_iff, Sum.lex_inr_inl, false_and_iff] at h ⊢
[GOAL]
case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a₁ : α
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
e₂ : ¬b = b₂
h₁ : (b, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h : s b b₂
⊢ False
[PROOFSTEP]
cases' h₂ with _ _ _ _ h₂_h h₂_h <;> [exact asymm h h₂_h; exact e₂ rfl]
  -- Porting note: `cc` hadn't ported yet.
[GOAL]
case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a₁ : α
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
e₂ : ¬b = b₂
h₁ : (b, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h : s b b₂
⊢ False
[PROOFSTEP]
cases' h₂ with _ _ _ _ h₂_h h₂_h
[GOAL]
case neg.left
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a₁ : α
b₂ : β
a₂ : α
e₂ : ¬b = b₂
h₁ : (b, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h : s b b₂
h₂_h : s b₂ b
⊢ False
[PROOFSTEP]
exact asymm h h₂_h
[GOAL]
case neg.right
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝¹ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
a₁ a₂ : α
h₁ : (b, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
e₂ : ¬b = b
h : s b b
h✝ : r a₂ a
⊢ False
[PROOFSTEP]
exact e₂ rfl
[GOAL]
case pos
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b₁, a₁), property := h₁ }
    { val := (b₂, a₂), property := h₂ }
e₁ : ¬b = b₁
e₂ : b = b₂
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₁, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
simp [e₂, dif_neg e₁, show b₂ ≠ b₁ from e₂ ▸ e₁]
[GOAL]
case neg
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u_4
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsWellOrder α r
inst✝ : IsWellOrder β s
c : Ordinal.{u_4}
h✝ : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
l : c < type r * type s
a : α
b : β
this✝ : type r * typein s b + type r ≤ c
this : type r * typein s b + typein r a < c
b₁ : β
a₁ : α
h₁ : (b₁, a₁) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
b₂ : β
a₂ : α
h₂ : (b₂, a₂) ∈ {b_1 | Prod.Lex s r b_1 (b, a)}
h :
  Subrel (Prod.Lex s r) {b_1 | Prod.Lex s r b_1 (b, a)} { val := (b₁, a₁), property := h₁ }
    { val := (b₂, a₂), property := h₂ }
e₁ : ¬b = b₁
e₂ : ¬b = b₂
⊢ Sum.Lex (Prod.Lex (Subrel s {b_1 | s b_1 b}) r) (Subrel r {b | r b a})
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₁, a₁), property := h₁ })
    ((fun a_1 =>
        Subtype.casesOn a_1 fun val h =>
          Prod.casesOn (motive := fun x => x ∈ {b_1 | Prod.Lex s r b_1 (b, a)} → ↑{b_1 | s b_1 b} × α ⊕ ↑{b | r b a})
            val
            (fun b' a' h =>
              if e : b = b' then Sum.inr { val := a', property := (_ : a' ∈ {b | r b a}) }
              else Sum.inl ({ val := b', property := (_ : b' ∈ {b_1 | s b_1 b}) }, a'))
            h)
      { val := (b₂, a₂), property := h₂ })
[PROOFSTEP]
simpa only [dif_neg e₁, dif_neg e₂, Prod.lex_def, subrel_val, Subtype.mk_eq_mk, Sum.lex_inl_inl] using h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : IsLimit b
H : ∀ (b' : Ordinal.{u_4}), b' < b → a * b' ≤ c
⊢ ¬c < a * b
[PROOFSTEP]
induction a using inductionOn with
| H α r =>
  induction b using inductionOn with
  | H β s => exact mul_le_of_limit_aux h H
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : IsLimit b
H : ∀ (b' : Ordinal.{u_4}), b' < b → a * b' ≤ c
⊢ ¬c < a * b
[PROOFSTEP]
induction a using inductionOn with
| H α r =>
  induction b using inductionOn with
  | H β s => exact mul_le_of_limit_aux h H
[GOAL]
case H
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
h : IsLimit b
α : Type u_4
r : α → α → Prop
inst✝ : IsWellOrder α r
H : ∀ (b' : Ordinal.{u_4}), b' < b → type r * b' ≤ c
⊢ ¬c < type r * b
[PROOFSTEP]

| H α r =>
  induction b using inductionOn with
  | H β s => exact mul_le_of_limit_aux h H
[GOAL]
case H
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
h : IsLimit b
α : Type u_4
r : α → α → Prop
inst✝ : IsWellOrder α r
H : ∀ (b' : Ordinal.{u_4}), b' < b → type r * b' ≤ c
⊢ ¬c < type r * b
[PROOFSTEP]
induction b using inductionOn with
| H β s => exact mul_le_of_limit_aux h H
[GOAL]
case H
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
h : IsLimit b
α : Type u_4
r : α → α → Prop
inst✝ : IsWellOrder α r
H : ∀ (b' : Ordinal.{u_4}), b' < b → type r * b' ≤ c
⊢ ¬c < type r * b
[PROOFSTEP]
induction b using inductionOn with
| H β s => exact mul_le_of_limit_aux h H
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
⊢ ¬c < type r * type s
[PROOFSTEP]

| H β s => exact mul_le_of_limit_aux h H
[GOAL]
case H.H
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s✝ : β✝ → β✝ → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
α : Type u_4
r : α → α → Prop
inst✝¹ : IsWellOrder α r
β : Type u_4
s : β → β → Prop
inst✝ : IsWellOrder β s
h : IsLimit (type s)
H : ∀ (b' : Ordinal.{u_4}), b' < type s → type r * b' ≤ c
⊢ ¬c < type r * type s
[PROOFSTEP]
exact mul_le_of_limit_aux h H
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
h : 0 < a
b : Ordinal.{u_4}
⊢ (fun x x_1 => x * x_1) a b < (fun x x_1 => x * x_1) a (succ b)
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
h : 0 < a
b : Ordinal.{u_4}
⊢ a * b < a * succ b
[PROOFSTEP]
rw [mul_succ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
h : 0 < a
b : Ordinal.{u_4}
⊢ a * b < a * b + a
[PROOFSTEP]
simpa only [add_zero] using (add_lt_add_iff_left (a * b)).2 h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : IsLimit c
⊢ a < b * c ↔ ∃ c', c' < c ∧ a < b * c'
[PROOFSTEP]
simpa only [not_ball, not_le, bex_def] using not_congr (@mul_le_of_limit b c a h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h₁ : 0 < a
h₂ : 0 < b
⊢ 0 < a * b
[PROOFSTEP]
simpa only [mul_zero] using mul_lt_mul_of_pos_left h₂ h₁
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
⊢ a ≠ 0 → b ≠ 0 → a * b ≠ 0
[PROOFSTEP]
simpa only [Ordinal.pos_iff_ne_zero] using mul_pos
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
l : IsLimit a
b0 : 0 < b
⊢ IsLimit (a * b)
[PROOFSTEP]
rcases zero_or_succ_or_limit b with (rfl | ⟨b, rfl⟩ | lb)
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
l : IsLimit a
b0 : 0 < 0
⊢ IsLimit (a * 0)
[PROOFSTEP]
exact b0.false.elim
[GOAL]
case inr.inl.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
l : IsLimit a
b : Ordinal.{u_4}
b0 : 0 < succ b
⊢ IsLimit (a * succ b)
[PROOFSTEP]
rw [mul_succ]
[GOAL]
case inr.inl.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
l : IsLimit a
b : Ordinal.{u_4}
b0 : 0 < succ b
⊢ IsLimit (a * b + a)
[PROOFSTEP]
exact add_isLimit _ l
[GOAL]
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
l : IsLimit a
b0 : 0 < b
lb : IsLimit b
⊢ IsLimit (a * b)
[PROOFSTEP]
exact mul_isLimit l.pos lb
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
⊢ 0 • a = a * ↑0
[PROOFSTEP]
rw [zero_smul, Nat.cast_zero, mul_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
n : ℕ
a : Ordinal.{u_4}
⊢ (n + 1) • a = a * ↑(n + 1)
[PROOFSTEP]
rw [succ_nsmul', Nat.cast_add, mul_add, Nat.cast_one, mul_one, smul_eq_mul n]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≠ 0
⊢ succ a ≤ b * succ a
[PROOFSTEP]
simpa only [succ_zero, one_mul] using mul_le_mul_right' (succ_le_of_lt (Ordinal.pos_iff_ne_zero.2 h)) (succ a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≠ 0
⊢ a < b * succ (a / b)
[PROOFSTEP]
rw [div_def a h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≠ 0
⊢ a < b * succ (sInf {o | a < b * succ o})
[PROOFSTEP]
exact csInf_mem (div_nonempty h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≠ 0
⊢ a < b * (a / b) + b
[PROOFSTEP]
simpa only [mul_succ] using lt_mul_succ_div a h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
b0 : b ≠ 0
h : a < b * succ c
⊢ a / b ≤ c
[PROOFSTEP]
rw [div_def a b0]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
b0 : b ≠ 0
h : a < b * succ c
⊢ sInf {o | a < b * succ o} ≤ c
[PROOFSTEP]
exact csInf_le' h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : c ≠ 0
⊢ a < b / c ↔ c * succ a ≤ b
[PROOFSTEP]
rw [← not_le, div_le h, not_lt]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
h : c ≠ 0
⊢ 0 < b / c ↔ c ≤ b
[PROOFSTEP]
simp [lt_div h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
c0 : c ≠ 0
⊢ a ≤ b / c ↔ c * a ≤ b
[PROOFSTEP]
induction a using limitRecOn with
| H₁ => simp only [mul_zero, Ordinal.zero_le]
| H₂ _ _ => rw [succ_le_iff, lt_div c0]
| H₃ _ h₁ h₂ =>
  revert h₁ h₂
  simp (config := { contextual := true }) only [mul_le_of_limit, limit_le, iff_self_iff, forall_true_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
c0 : c ≠ 0
⊢ a ≤ b / c ↔ c * a ≤ b
[PROOFSTEP]
induction a using limitRecOn with
| H₁ => simp only [mul_zero, Ordinal.zero_le]
| H₂ _ _ => rw [succ_le_iff, lt_div c0]
| H₃ _ h₁ h₂ =>
  revert h₁ h₂
  simp (config := { contextual := true }) only [mul_le_of_limit, limit_le, iff_self_iff, forall_true_iff]
[GOAL]
case H₁
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
c0 : c ≠ 0
⊢ 0 ≤ b / c ↔ c * 0 ≤ b
[PROOFSTEP]

| H₁ => simp only [mul_zero, Ordinal.zero_le]
[GOAL]
case H₁
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
c0 : c ≠ 0
⊢ 0 ≤ b / c ↔ c * 0 ≤ b
[PROOFSTEP]
simp only [mul_zero, Ordinal.zero_le]
[GOAL]
case H₂
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
c0 : c ≠ 0
o✝ : Ordinal.{u_4}
a✝ : o✝ ≤ b / c ↔ c * o✝ ≤ b
⊢ succ o✝ ≤ b / c ↔ c * succ o✝ ≤ b
[PROOFSTEP]

| H₂ _ _ => rw [succ_le_iff, lt_div c0]
[GOAL]
case H₂
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
c0 : c ≠ 0
o✝ : Ordinal.{u_4}
a✝ : o✝ ≤ b / c ↔ c * o✝ ≤ b
⊢ succ o✝ ≤ b / c ↔ c * succ o✝ ≤ b
[PROOFSTEP]
rw [succ_le_iff, lt_div c0]
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
c0 : c ≠ 0
o✝ : Ordinal.{u_4}
h₁ : IsLimit o✝
h₂ : ∀ (o' : Ordinal.{u_4}), o' < o✝ → (o' ≤ b / c ↔ c * o' ≤ b)
⊢ o✝ ≤ b / c ↔ c * o✝ ≤ b
[PROOFSTEP]

| H₃ _ h₁ h₂ =>
  revert h₁ h₂
  simp (config := { contextual := true }) only [mul_le_of_limit, limit_le, iff_self_iff, forall_true_iff]
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
c0 : c ≠ 0
o✝ : Ordinal.{u_4}
h₁ : IsLimit o✝
h₂ : ∀ (o' : Ordinal.{u_4}), o' < o✝ → (o' ≤ b / c ↔ c * o' ≤ b)
⊢ o✝ ≤ b / c ↔ c * o✝ ≤ b
[PROOFSTEP]
revert h₁ h₂
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
c0 : c ≠ 0
o✝ : Ordinal.{u_4}
⊢ IsLimit o✝ → (∀ (o' : Ordinal.{u_4}), o' < o✝ → (o' ≤ b / c ↔ c * o' ≤ b)) → (o✝ ≤ b / c ↔ c * o✝ ≤ b)
[PROOFSTEP]
simp (config := { contextual := true }) only [mul_le_of_limit, limit_le, iff_self_iff, forall_true_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : a ≤ b * c
b0 : b = 0
⊢ a / b ≤ c
[PROOFSTEP]
simp only [b0, div_zero, Ordinal.zero_le]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : b = 0
⊢ b * (a / b) ≤ a
[PROOFSTEP]
simp only [b0, zero_mul, Ordinal.zero_le]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : b ≠ 0
c : Ordinal.{u_4}
⊢ (b * a + c) / b = a + c / b
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : b ≠ 0
c : Ordinal.{u_4}
⊢ (b * a + c) / b ≤ a + c / b
[PROOFSTEP]
apply (div_le b0).2
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : b ≠ 0
c : Ordinal.{u_4}
⊢ b * a + c < b * succ (a + c / b)
[PROOFSTEP]
rw [mul_succ, mul_add, add_assoc, add_lt_add_iff_left]
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : b ≠ 0
c : Ordinal.{u_4}
⊢ c < b * (c / b) + b
[PROOFSTEP]
apply lt_mul_div_add _ b0
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : b ≠ 0
c : Ordinal.{u_4}
⊢ a + c / b ≤ (b * a + c) / b
[PROOFSTEP]
rw [le_div b0, mul_add, add_le_add_iff_left]
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : b ≠ 0
c : Ordinal.{u_4}
⊢ b * (c / b) ≤ c
[PROOFSTEP]
apply mul_div_le
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : a < b
⊢ a / b = 0
[PROOFSTEP]
rw [← Ordinal.le_zero, div_le <| Ordinal.pos_iff_ne_zero.1 <| (Ordinal.zero_le _).trans_lt h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : a < b
⊢ a < b * succ 0
[PROOFSTEP]
simpa only [succ_zero, mul_one] using h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : b ≠ 0
⊢ b * a / b = a
[PROOFSTEP]
simpa only [add_zero, zero_div] using mul_add_div a b0 0
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
⊢ a / 1 = a
[PROOFSTEP]
simpa only [one_mul] using mul_div_cancel a Ordinal.one_ne_zero
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
h : a ≠ 0
⊢ a / a = 1
[PROOFSTEP]
simpa only [mul_one] using mul_div_cancel 1 h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
a0 : a = 0
⊢ a * (b - c) = a * b - a * c
[PROOFSTEP]
simp only [a0, zero_mul, sub_self]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
a0 : ¬a = 0
d : Ordinal.{u_4}
⊢ a * (b - c) ≤ d ↔ a * b - a * c ≤ d
[PROOFSTEP]
rw [sub_le, ← le_div a0, sub_le, ← le_div a0, mul_add_div _ a0]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
⊢ IsLimit (a + b) ↔ IsLimit b ∨ b = 0 ∧ IsLimit a
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
⊢ IsLimit (a + b) → IsLimit b ∨ b = 0 ∧ IsLimit a
[PROOFSTEP]
intro h
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
⊢ IsLimit b ∨ b = 0 ∧ IsLimit a → IsLimit (a + b)
[PROOFSTEP]
intro h
[GOAL]
case mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
⊢ IsLimit b ∨ b = 0 ∧ IsLimit a
[PROOFSTEP]
by_cases h' : b = 0
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
h' : b = 0
⊢ IsLimit b ∨ b = 0 ∧ IsLimit a
[PROOFSTEP]
rw [h', add_zero] at h 
[GOAL]
case pos
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit a
h' : b = 0
⊢ IsLimit b ∨ b = 0 ∧ IsLimit a
[PROOFSTEP]
right
[GOAL]
case pos.h
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit a
h' : b = 0
⊢ b = 0 ∧ IsLimit a
[PROOFSTEP]
exact ⟨h', h⟩
[GOAL]
case neg
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
h' : ¬b = 0
⊢ IsLimit b ∨ b = 0 ∧ IsLimit a
[PROOFSTEP]
left
[GOAL]
case neg.h
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
h' : ¬b = 0
⊢ IsLimit b
[PROOFSTEP]
rw [← add_sub_cancel a b]
[GOAL]
case neg.h
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
h' : ¬b = 0
⊢ IsLimit (a + b - a)
[PROOFSTEP]
apply sub_isLimit h
[GOAL]
case neg.h
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
h' : ¬b = 0
⊢ a < a + b
[PROOFSTEP]
suffices : a + 0 < a + b
[GOAL]
case neg.h
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
h' : ¬b = 0
this : a + 0 < a + b
⊢ a < a + b
case this
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
h' : ¬b = 0
⊢ a + 0 < a + b
[PROOFSTEP]
simpa only [add_zero] using this
[GOAL]
case this
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit (a + b)
h' : ¬b = 0
⊢ a + 0 < a + b
[PROOFSTEP]
rwa [add_lt_add_iff_left, Ordinal.pos_iff_ne_zero]
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit b ∨ b = 0 ∧ IsLimit a
⊢ IsLimit (a + b)
[PROOFSTEP]
rcases h with (h | ⟨rfl, h⟩)
[GOAL]
case mpr.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : IsLimit b
⊢ IsLimit (a + b)
case mpr.inr.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
h : IsLimit a
⊢ IsLimit (a + 0)
[PROOFSTEP]
exact add_isLimit a h
[GOAL]
case mpr.inr.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
h : IsLimit a
⊢ IsLimit (a + 0)
[PROOFSTEP]
simpa only [add_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a c b : Ordinal.{u_4}
x✝ : a ∣ a * b + c
d : Ordinal.{u_4}
e : a * b + c = a * d
⊢ c = a * (d - b)
[PROOFSTEP]
rw [mul_sub, ← e, add_sub_cancel]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a c b : Ordinal.{u_4}
x✝ : a ∣ c
d : Ordinal.{u_4}
e : c = a * d
⊢ a ∣ a * b + c
[PROOFSTEP]
rw [e, ← mul_add]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a c b : Ordinal.{u_4}
x✝ : a ∣ c
d : Ordinal.{u_4}
e : c = a * d
⊢ a ∣ a * (b + d)
[PROOFSTEP]
apply dvd_mul_right
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
a0 : a ≠ 0
b : Ordinal.{u_4}
⊢ a * (a * b / a) = a * b
[PROOFSTEP]
rw [mul_div_cancel _ a0]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a x✝ : Ordinal.{u_4}
b0 : x✝ ≠ 0
b : Ordinal.{u_4}
e : x✝ = a * b
⊢ a ≤ x✝
[PROOFSTEP]
subst e
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : a * b ≠ 0
⊢ a ≤ a * b
[PROOFSTEP]
simpa only [mul_one] using
  mul_le_mul_left' (one_le_iff_ne_zero.2 fun h : b = 0 => by simp only [h, mul_zero, Ne] at b0 ) a
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
b0 : a * b ≠ 0
h : b = 0
⊢ False
[PROOFSTEP]
simp only [h, mul_zero, Ne] at b0 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h₁ : a ∣ b
h₂ : b ∣ a
a0 : a = 0
⊢ a = b
[PROOFSTEP]
subst a
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b : Ordinal.{u_4}
h₁ : 0 ∣ b
h₂ : b ∣ 0
⊢ 0 = b
[PROOFSTEP]
exact (eq_zero_of_zero_dvd h₁).symm
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h₁ : a ∣ b
h₂ : b ∣ a
a0 : ¬a = 0
b0 : b = 0
⊢ a = b
[PROOFSTEP]
subst b
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
a0 : ¬a = 0
h₁ : a ∣ 0
h₂ : 0 ∣ a
⊢ a = 0
[PROOFSTEP]
exact eq_zero_of_zero_dvd h₂
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
⊢ a % 0 = a
[PROOFSTEP]
simp only [mod_def, div_zero, zero_mul, sub_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : a < b
⊢ a % b = a
[PROOFSTEP]
simp only [mod_def, div_eq_zero_of_lt h, mul_zero, sub_zero]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b : Ordinal.{u_4}
⊢ 0 % b = 0
[PROOFSTEP]
simp only [mod_def, zero_div, mul_zero, sub_self]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≠ 0
⊢ b * (a / b) + a % b < b * (a / b) + b
[PROOFSTEP]
rw [div_add_mod]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
h : b ≠ 0
⊢ a < b * (a / b) + b
[PROOFSTEP]
exact lt_mul_div_add a h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
a0 : a = 0
⊢ a % a = 0
[PROOFSTEP]
simp only [a0, zero_mod]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
a0 : ¬a = 0
⊢ a % a = 0
[PROOFSTEP]
simp only [mod_def, div_self a0, mul_one, sub_self]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a : Ordinal.{u_4}
⊢ a % 1 = 0
[PROOFSTEP]
simp only [mod_def, div_one, one_mul, sub_self]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
H : a % b = 0
⊢ a = b * (a / b)
[PROOFSTEP]
simpa [H] using (div_add_mod a b).symm
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b : Ordinal.{u_4}
H : b ∣ a
⊢ a % b = 0
[PROOFSTEP]
rcases H with ⟨c, rfl⟩
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
⊢ b * c % b = 0
[PROOFSTEP]
rcases eq_or_ne b 0 with (rfl | hb)
[GOAL]
case intro.inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
c : Ordinal.{u_4}
⊢ 0 * c % 0 = 0
[PROOFSTEP]
simp
[GOAL]
case intro.inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
b c : Ordinal.{u_4}
hb : b ≠ 0
⊢ b * c % b = 0
[PROOFSTEP]
simp [mod_def, hb]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
x y z : Ordinal.{u_4}
⊢ (x * y + z) % x = z % x
[PROOFSTEP]
rcases eq_or_ne x 0 with rfl | hx
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
y z : Ordinal.{u_4}
⊢ (0 * y + z) % 0 = z % 0
[PROOFSTEP]
simp
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
x y z : Ordinal.{u_4}
hx : x ≠ 0
⊢ (x * y + z) % x = z % x
[PROOFSTEP]
rwa [mod_def, mul_add_div, mul_add, ← sub_sub, add_sub_cancel, mod_def]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
x y : Ordinal.{u_4}
⊢ x * y % x = 0
[PROOFSTEP]
simpa using mul_add_mod_self x y 0
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : c ∣ b
⊢ a % b % c = a % c
[PROOFSTEP]
nth_rw 2 [← div_add_mod a b]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a b c : Ordinal.{u_4}
h : c ∣ b
⊢ a % b % c = (b * (a / b) + a % b) % c
[PROOFSTEP]
rcases h with ⟨d, rfl⟩
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
a c d : Ordinal.{u_4}
⊢ a % (c * d) % c = (c * d * (a / (c * d)) + a % (c * d)) % c
[PROOFSTEP]
rw [mul_assoc, mul_add_mod_self]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
i : ι
⊢ typein r i < o
[PROOFSTEP]
rw [← ho]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
i : ι
⊢ typein r i < type r
[PROOFSTEP]
exact typein_lt_type r i
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u_4
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
f : ι → α
i : ι
⊢ bfamilyOfFamily' r f (typein r i) (_ : typein r i < type r) = f i
[PROOFSTEP]
simp only [bfamilyOfFamily', enum_typein]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
i : Ordinal.{u}
hi : i < o
⊢ i < type r
[PROOFSTEP]
rwa [ho]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
i : Ordinal.{u}
hi : i < o
⊢ familyOfBFamily' r ho f (enum r i (_ : i < type r)) = f i hi
[PROOFSTEP]
simp only [familyOfBFamily', typein_enum]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{?u.274180}
f : (a : Ordinal.{?u.274180}) → a < o → α
i : Ordinal.{?u.274180}
hi : i < o
⊢ i < type fun x x_1 => x < x_1
[PROOFSTEP]
convert hi
[GOAL]
case h.e'_4
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{?u.274180}
f : (a : Ordinal.{?u.274180}) → a < o → α
i : Ordinal.{?u.274180}
hi : i < o
⊢ (type fun x x_1 => x < x_1) = o
[PROOFSTEP]
exact type_lt _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
⊢ range (familyOfBFamily' r ho f) = brange o f
[PROOFSTEP]
refine' Set.ext fun a => ⟨_, _⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
a : α
⊢ a ∈ range (familyOfBFamily' r ho f) → a ∈ brange o f
[PROOFSTEP]
rintro ⟨b, rfl⟩
[GOAL]
case refine'_1.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
b : ι
⊢ familyOfBFamily' r ho f b ∈ brange o f
[PROOFSTEP]
apply mem_brange_self
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
a : α
⊢ a ∈ brange o f → a ∈ range (familyOfBFamily' r ho f)
[PROOFSTEP]
rintro ⟨i, hi, rfl⟩
[GOAL]
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
o : Ordinal.{u}
ho : type r = o
f : (a : Ordinal.{u}) → a < o → α
i : Ordinal.{u}
hi : i < o
⊢ f i hi ∈ range (familyOfBFamily' r ho f)
[PROOFSTEP]
exact ⟨_, familyOfBFamily'_enum _ _ _ _ _⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
f : ι → α
⊢ brange (type r) (bfamilyOfFamily' r f) = range f
[PROOFSTEP]
refine' Set.ext fun a => ⟨_, _⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
f : ι → α
a : α
⊢ a ∈ brange (type r) (bfamilyOfFamily' r f) → a ∈ range f
[PROOFSTEP]
rintro ⟨i, hi, rfl⟩
[GOAL]
case refine'_1.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
f : ι → α
i : Ordinal.{u}
hi : i < type r
⊢ bfamilyOfFamily' r f i hi ∈ range f
[PROOFSTEP]
apply mem_range_self
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
f : ι → α
a : α
⊢ a ∈ range f → a ∈ brange (type r) (bfamilyOfFamily' r f)
[PROOFSTEP]
rintro ⟨b, rfl⟩
[GOAL]
case refine'_2.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
f : ι → α
b : ι
⊢ f b ∈ brange (type r) (bfamilyOfFamily' r f)
[PROOFSTEP]
exact ⟨_, _, bfamilyOfFamily'_typein _ _ _⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
ho : o ≠ 0
c : α
⊢ (brange o fun x x => c) = {c}
[PROOFSTEP]
rw [← range_familyOfBFamily]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
ho : o ≠ 0
c : α
⊢ range (familyOfBFamily o fun x x => c) = {c}
[PROOFSTEP]
exact @Set.range_const _ o.out.α (out_nonempty_iff_ne_zero.2 ho) c
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
⊢ ord (iSup (succ ∘ card ∘ f)) ∈ upperBounds (range f)
[PROOFSTEP]
rintro a ⟨i, rfl⟩
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
i : ι
⊢ f i ≤ ord (iSup (succ ∘ card ∘ f))
[PROOFSTEP]
exact le_of_lt (Cardinal.lt_ord.2 ((lt_succ _).trans_le (le_ciSup (Cardinal.bddAbove_range.{_, v} _) _)))
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
a : Ordinal.{max u v}
⊢ (∀ (x : Ordinal.{max u v}), x ∈ range f → x ≤ a) ↔ ∀ (i : ι), f i ≤ a
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
a : Ordinal.{max u v}
⊢ a < sup f ↔ ∃ i, a < f i
[PROOFSTEP]
simpa only [not_forall, not_le] using not_congr (@sup_le_iff.{_, v} _ f a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (i : ι), f i ≠ sup f
a : Ordinal.{max u v}
hao : a < sup f
⊢ succ a < sup f
[PROOFSTEP]
by_contra' hoa
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (i : ι), f i ≠ sup f
a : Ordinal.{max u v}
hao : a < sup f
hoa : sup f ≤ succ a
⊢ False
[PROOFSTEP]
exact hao.not_le (sup_le fun i => le_of_lt_succ <| (lt_of_le_of_ne (le_sup _ _) (hf i)).trans_le hoa)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
⊢ sup f = 0 ↔ ∀ (i : ι), f i = 0
[PROOFSTEP]
refine' ⟨fun h i => _, fun h => le_antisymm (sup_le fun i => Ordinal.le_zero.2 (h i)) (Ordinal.zero_le _)⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : sup f = 0
i : ι
⊢ f i = 0
[PROOFSTEP]
rw [← Ordinal.le_zero, ← h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : sup f = 0
i : ι
⊢ f i ≤ sup f
[PROOFSTEP]
exact le_sup f i
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
ι : Type u
g : ι → Ordinal.{max u v}
inst✝ : Nonempty ι
a : Ordinal.{max u w}
⊢ f (Ordinal.sup g) ≤ a ↔ Ordinal.sup (f ∘ g) ≤ a
[PROOFSTEP]
rw [sup_le_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
ι : Type u
g : ι → Ordinal.{max u v}
inst✝ : Nonempty ι
a : Ordinal.{max u w}
⊢ f (Ordinal.sup g) ≤ a ↔ ∀ (i : ι), (f ∘ g) i ≤ a
[PROOFSTEP]
simp only [comp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
ι : Type u
g : ι → Ordinal.{max u v}
inst✝ : Nonempty ι
a : Ordinal.{max u w}
⊢ f (Ordinal.sup g) ≤ a ↔ ∀ (i : ι), f (g i) ≤ a
[PROOFSTEP]
rw [H.le_set' Set.univ Set.univ_nonempty g]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
ι : Type u
g : ι → Ordinal.{max u v}
inst✝ : Nonempty ι
a : Ordinal.{max u w}
⊢ (∀ (a_1 : ι), a_1 ∈ Set.univ → f (g a_1) ≤ a) ↔ ∀ (i : ι), f (g i) ≤ a
[PROOFSTEP]
simp [sup_le_iff]
[GOAL]
case H₂
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
ι : Type u
g : ι → Ordinal.{max u v}
inst✝ : Nonempty ι
a : Ordinal.{max u w}
⊢ ∀ (o : Ordinal.{max u v}), Ordinal.sup g ≤ o ↔ ∀ (a : ι), a ∈ Set.univ → g a ≤ o
[PROOFSTEP]
simp [sup_le_iff]
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
⊢ sup f = max (sup fun a => f (Sum.inl a)) (sup fun b => f (Sum.inr b))
[PROOFSTEP]
apply (sup_le_iff.2 _).antisymm (max_le_iff.2 ⟨_, _⟩)
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
⊢ ∀ (i : α ⊕ β), f i ≤ max (sup fun a => f (Sum.inl a)) (sup fun b => f (Sum.inr b))
[PROOFSTEP]
rintro (i | i)
[GOAL]
case inl
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
i : α
⊢ f (Sum.inl i) ≤ max (sup fun a => f (Sum.inl a)) (sup fun b => f (Sum.inr b))
[PROOFSTEP]
exact le_max_of_le_left (le_sup _ i)
[GOAL]
case inr
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
i : β
⊢ f (Sum.inr i) ≤ max (sup fun a => f (Sum.inl a)) (sup fun b => f (Sum.inr b))
[PROOFSTEP]
exact le_max_of_le_right (le_sup _ i)
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
⊢ (sup fun a => f (Sum.inl a)) ≤ sup f
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
⊢ (sup fun b => f (Sum.inr b)) ≤ sup f
[PROOFSTEP]
all_goals
  apply sup_le_of_range_subset.{_, max u v, w}
  rintro i ⟨a, rfl⟩
  apply mem_range_self
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
⊢ (sup fun a => f (Sum.inl a)) ≤ sup f
[PROOFSTEP]
apply sup_le_of_range_subset.{_, max u v, w}
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
⊢ (range fun a => f (Sum.inl a)) ⊆ range f
[PROOFSTEP]
rintro i ⟨a, rfl⟩
[GOAL]
case intro
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
a : α
⊢ (fun a => f (Sum.inl a)) a ∈ range f
[PROOFSTEP]
apply mem_range_self
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
⊢ (sup fun b => f (Sum.inr b)) ≤ sup f
[PROOFSTEP]
apply sup_le_of_range_subset.{_, max u v, w}
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
⊢ (range fun b => f (Sum.inr b)) ⊆ range f
[PROOFSTEP]
rintro i ⟨a, rfl⟩
[GOAL]
case intro
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α : Type u
β : Type v
f : α ⊕ β → Ordinal.{max (max u v) w}
a : β
⊢ (fun b => f (Sum.inr b)) a ∈ range f
[PROOFSTEP]
apply mem_range_self
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s✝ : β → β → Prop
t : γ → γ → Prop
s : Set Ordinal.{u}
hs : Small.{u, u + 1} ↑s
a : Ordinal.{u}
ha : a ∈ s
⊢ a ≤ sup fun x => ↑(↑(equivShrink ↑s).symm x)
[PROOFSTEP]
convert le_sup.{u, u} (fun x => ((@equivShrink s hs).symm x).val) ((@equivShrink s hs) ⟨a, ha⟩)
[GOAL]
case h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s✝ : β → β → Prop
t : γ → γ → Prop
s : Set Ordinal.{u}
hs : Small.{u, u + 1} ↑s
a : Ordinal.{u}
ha : a ∈ s
⊢ a = ↑(↑(equivShrink ↑s).symm (↑(equivShrink ↑s) { val := a, property := ha }))
[PROOFSTEP]
rw [symm_apply_apply]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (Quotient.out o).α → ↑(Iio o) :=
  fun x => { val := typein (fun x x_1 => x < x_1) x, property := (_ : typein (fun x x_1 => x < x_1) x < o) }
b : ↑(Iio o)
⊢ ↑b < type fun x x_1 => x < x_1
[PROOFSTEP]
rw [type_lt]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (Quotient.out o).α → ↑(Iio o) :=
  fun x => { val := typein (fun x x_1 => x < x_1) x, property := (_ : typein (fun x x_1 => x < x_1) x < o) }
b : ↑(Iio o)
⊢ ↑b < o
[PROOFSTEP]
exact b.prop
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
⊢ Small.{u, u + 1} ↑(Iic o)
[PROOFSTEP]
rw [← Iio_succ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
⊢ Small.{u, u + 1} ↑(Iio (succ o))
[PROOFSTEP]
infer_instance
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s✝ : β → β → Prop
t : γ → γ → Prop
s : Set Cardinal.{u}
hs : BddAbove s
a : Ordinal.{u}
⊢ ord (sSup s) ≤ a ↔ sSup (ord '' s) ≤ a
[PROOFSTEP]
rw [csSup_le_iff' (bddAbove_iff_small.2 (@small_image _ _ _ s (Cardinal.bddAbove_iff_small.1 hs))), ord_le,
  csSup_le_iff' hs]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s✝ : β → β → Prop
t : γ → γ → Prop
s : Set Cardinal.{u}
hs : BddAbove s
a : Ordinal.{u}
⊢ (∀ (x : Cardinal.{u}), x ∈ s → x ≤ card a) ↔ ∀ (x : Ordinal.{u}), x ∈ ord '' s → x ≤ a
[PROOFSTEP]
simp [ord_le]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Sort u_4
f : ι → Cardinal.{u_5}
hf : BddAbove (range f)
⊢ ord (iSup f) = ⨆ (i : ι), ord (f i)
[PROOFSTEP]
unfold iSup
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Sort u_4
f : ι → Cardinal.{u_5}
hf : BddAbove (range f)
⊢ ord (sSup (range f)) = sSup (range fun i => ord (f i))
[PROOFSTEP]
convert sSup_ord hf
[GOAL]
case h.e'_3.h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Sort u_4
f : ι → Cardinal.{u_5}
hf : BddAbove (range f)
⊢ (range fun i => ord (f i)) = ord '' range f
[PROOFSTEP]
conv_lhs => change range (ord ∘ f)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Sort u_4
f : ι → Cardinal.{u_5}
hf : BddAbove (range f)
| range fun i => ord (f i)
[PROOFSTEP]
change range (ord ∘ f)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Sort u_4
f : ι → Cardinal.{u_5}
hf : BddAbove (range f)
| range fun i => ord (f i)
[PROOFSTEP]
change range (ord ∘ f)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Sort u_4
f : ι → Cardinal.{u_5}
hf : BddAbove (range f)
| range fun i => ord (f i)
[PROOFSTEP]
change range (ord ∘ f)
[GOAL]
case h.e'_3.h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Sort u_4
f : ι → Cardinal.{u_5}
hf : BddAbove (range f)
⊢ range (ord ∘ f) = ord '' range f
[PROOFSTEP]
rw [range_comp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : ι
⊢ familyOfBFamily' r ho f i ≤ sup (familyOfBFamily' r' ho' f)
[PROOFSTEP]
cases'
  typein_surj r'
    (by
      rw [ho', ← ho]
      exact typein_lt_type r i) with
  j hj
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : ι
⊢ ?m.307394 < type r'
[PROOFSTEP]
rw [ho', ← ho]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : ι
⊢ ?m.307394 < type r
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : ι
⊢ Ordinal.{u}
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : ι
⊢ Ordinal.{u}
[PROOFSTEP]
exact typein_lt_type r i
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : ι
j : ι'
hj : typein r' j = typein r i
⊢ familyOfBFamily' r ho f i ≤ sup (familyOfBFamily' r' ho' f)
[PROOFSTEP]
simp_rw [familyOfBFamily', ← hj]
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : ι
j : ι'
hj : typein r' j = typein r i
⊢ f (typein r' j) (_ : typein r' j < o) ≤ sup fun i => f (typein r' i) (_ : typein r' i < o)
[PROOFSTEP]
apply le_sup
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ range (familyOfBFamily' r ho f) = range (familyOfBFamily' r' ho' f)
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ sSup (brange o f) = bsup o f
[PROOFSTEP]
congr
[GOAL]
case e_a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ brange o f = range (familyOfBFamily o f)
[PROOFSTEP]
rw [range_familyOfBFamily]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r : ι → ι → Prop
inst✝ : IsWellOrder ι r
f : ι → Ordinal.{max u v}
⊢ bsup (type r) (bfamilyOfFamily' r f) = sup f
[PROOFSTEP]
simp only [← sup_eq_bsup' r, enum_typein, familyOfBFamily', bfamilyOfFamily']
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r r' : ι → ι → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι r'
f : ι → Ordinal.{max u v}
⊢ bsup (type r) (bfamilyOfFamily' r f) = bsup (type r') (bfamilyOfFamily' r' f)
[PROOFSTEP]
rw [bsup_eq_sup', bsup_eq_sup']
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o₁ o₂ : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o₁ → Ordinal.{max u v}
ho : o₁ = o₂
⊢ bsup o₁ f = bsup o₂ fun a h => f a (_ : a < o₁)
[PROOFSTEP]
subst ho
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o₁ : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o₁ → Ordinal.{max u v}
⊢ bsup o₁ f = bsup o₁ fun a h => f a (_ : a < o₁)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
a : Ordinal.{max u v}
h : ∀ (i : (Quotient.out o).α), familyOfBFamily o f i ≤ a
i : Ordinal.{u}
hi : i < o
⊢ f i hi ≤ a
[PROOFSTEP]
rw [← familyOfBFamily_enum o f]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
a : Ordinal.{max u v}
h : ∀ (i : (Quotient.out o).α), familyOfBFamily o f i ≤ a
i : Ordinal.{u}
hi : i < o
⊢ familyOfBFamily o f (enum (fun x x_1 => x < x_1) i (_ : i < type fun x x_1 => x < x_1)) ≤ a
[PROOFSTEP]
exact h _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
a : Ordinal.{max u v}
⊢ a < bsup o f ↔ ∃ i hi, a < f i hi
[PROOFSTEP]
simpa only [not_forall, not_le] using not_congr (@bsup_le_iff.{_, v} _ f a)
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
o : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
g : (a : Ordinal.{u}) → a < type r → Ordinal.{max u v}
h : type r ≠ 0
⊢ f (Ordinal.bsup (type r) g) = Ordinal.bsup (type r) fun a h => f (g a h)
[PROOFSTEP]
haveI := type_ne_zero_iff_nonempty.1 h
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
o : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
g : (a : Ordinal.{u}) → a < type r → Ordinal.{max u v}
h : type r ≠ 0
this : Nonempty α
⊢ f (Ordinal.bsup (type r) g) = Ordinal.bsup (type r) fun a h => f (g a h)
[PROOFSTEP]
rw [← sup_eq_bsup' r, IsNormal.sup.{_, v, w} H, ← sup_eq_bsup' r]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
o : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
g : (a : Ordinal.{u}) → a < type r → Ordinal.{max u v}
h : type r ≠ 0
this : Nonempty α
⊢ Ordinal.sup (f ∘ familyOfBFamily' r ?ho g) = Ordinal.sup (familyOfBFamily' r ?ho fun a h => f (g a h))
[PROOFSTEP]
rfl
[GOAL]
case ho
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
o : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
g : (a : Ordinal.{u}) → a < type r → Ordinal.{max u v}
h : type r ≠ 0
this : Nonempty α
⊢ type r = type r
[PROOFSTEP]
rfl
[GOAL]
case ho
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{max u v} → Ordinal.{max u w}
H : IsNormal f
o : Ordinal.{u}
α : Type u
r : α → α → Prop
x✝ : IsWellOrder α r
g : (a : Ordinal.{u}) → a < type r → Ordinal.{max u v}
h : type r ≠ 0
this : Nonempty α
⊢ type r = type r
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
hf : ∀ {i : Ordinal.{u}} (h : i < o), f i h ≠ bsup o f
a : Ordinal.{max u v}
⊢ a < bsup o f → succ a < bsup o f
[PROOFSTEP]
rw [← sup_eq_bsup] at *
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
hf : ∀ {i : Ordinal.{u}} (h : i < o), f i h ≠ sup (familyOfBFamily o f)
a : Ordinal.{max u v}
⊢ a < sup (familyOfBFamily o f) → succ a < sup (familyOfBFamily o f)
[PROOFSTEP]
exact sup_not_succ_of_ne_sup fun i => hf _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_5 u_4}
⊢ bsup o f = 0 ↔ ∀ (i : Ordinal.{u_4}) (hi : i < o), f i hi = 0
[PROOFSTEP]
refine' ⟨fun h i hi => _, fun h => le_antisymm (bsup_le fun i hi => Ordinal.le_zero.2 (h i hi)) (Ordinal.zero_le _)⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_5 u_4}
h : bsup o f = 0
i : Ordinal.{u_4}
hi : i < o
⊢ f i hi = 0
[PROOFSTEP]
rw [← Ordinal.le_zero, ← h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_5 u_4}
h : bsup o f = 0
i : Ordinal.{u_4}
hi : i < o
⊢ f i hi ≤ bsup o f
[PROOFSTEP]
exact le_bsup f i hi
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : (a : Ordinal.{u_4}) → a < 1 → Ordinal.{max u_4 u_5}
⊢ bsup 1 f = f 0 (_ : 0 < 1)
[PROOFSTEP]
simp_rw [← sup_eq_bsup, sup_unique, familyOfBFamily, familyOfBFamily', typein_one_out]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
o' : Ordinal.{v}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max (max u v) w}
g : (a : Ordinal.{v}) → a < o' → Ordinal.{max (max u v) w}
h : brange o f ⊆ brange o' g
i : Ordinal.{u}
hi : i < o
⊢ f i hi ≤ bsup o' g
[PROOFSTEP]
obtain ⟨j, hj, hj'⟩ := h ⟨i, hi, rfl⟩
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
o' : Ordinal.{v}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max (max u v) w}
g : (a : Ordinal.{v}) → a < o' → Ordinal.{max (max u v) w}
h : brange o f ⊆ brange o' g
i : Ordinal.{u}
hi : i < o
j : Ordinal.{v}
hj : j < o'
hj' : g j hj = f i hi
⊢ f i hi ≤ bsup o' g
[PROOFSTEP]
rw [← hj']
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
o' : Ordinal.{v}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max (max u v) w}
g : (a : Ordinal.{v}) → a < o' → Ordinal.{max (max u v) w}
h : brange o f ⊆ brange o' g
i : Ordinal.{u}
hi : i < o
j : Ordinal.{v}
hj : j < o'
hj' : g j hj = f i hi
⊢ g j hj ≤ bsup o' g
[PROOFSTEP]
apply le_bsup
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
a : Ordinal.{max v u}
⊢ lsub f ≤ a ↔ ∀ (i : ι), f i < a
[PROOFSTEP]
convert sup_le_iff.{_, v} (f := succ ∘ f) (a := a) using 2
  -- Porting note: `comp_apply` is required.
[GOAL]
case h.e'_2.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
a : Ordinal.{max v u}
a✝ : ι
⊢ f a✝ < a ↔ (succ ∘ f) a✝ ≤ a
[PROOFSTEP]
simp only [comp_apply, succ_le_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
a : Ordinal.{max v u}
⊢ a < lsub f ↔ ∃ i, a ≤ f i
[PROOFSTEP]
simpa only [not_forall, not_lt, not_le] using not_congr (@lsub_le_iff.{_, v} _ f a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
⊢ sup f = lsub f ∨ succ (sup f) = lsub f
[PROOFSTEP]
cases' eq_or_lt_of_le (sup_le_lsub.{_, v} f) with h h
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : sup f = lsub f
⊢ sup f = lsub f ∨ succ (sup f) = lsub f
[PROOFSTEP]
exact Or.inl h
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : sup f < lsub f
⊢ sup f = lsub f ∨ succ (sup f) = lsub f
[PROOFSTEP]
exact Or.inr ((succ_le_of_lt h).antisymm (lsub_le_sup_succ f))
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
⊢ succ (sup f) ≤ lsub f ↔ ∃ i, f i = sup f
[PROOFSTEP]
refine' ⟨fun h => _, _⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : succ (sup f) ≤ lsub f
⊢ ∃ i, f i = sup f
[PROOFSTEP]
by_contra' hf
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : succ (sup f) ≤ lsub f
hf : ∀ (i : ι), f i ≠ sup f
⊢ False
[PROOFSTEP]
exact (succ_le_iff.1 h).ne ((sup_le_lsub f).antisymm (lsub_le (ne_sup_iff_lt_sup.1 hf)))
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
⊢ (∃ i, f i = sup f) → succ (sup f) ≤ lsub f
[PROOFSTEP]
rintro ⟨_, hf⟩
[GOAL]
case refine'_2.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
w✝ : ι
hf : f w✝ = sup f
⊢ succ (sup f) ≤ lsub f
[PROOFSTEP]
rw [succ_le_iff, ← hf]
[GOAL]
case refine'_2.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
w✝ : ι
hf : f w✝ = sup f
⊢ f w✝ < lsub f
[PROOFSTEP]
exact lt_lsub _ _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
⊢ sup f = lsub f ↔ ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
[PROOFSTEP]
refine' ⟨fun h => _, fun hf => le_antisymm (sup_le_lsub f) (lsub_le fun i => _)⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : sup f = lsub f
⊢ ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
[PROOFSTEP]
rw [← h]
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : sup f = lsub f
⊢ ∀ (a : Ordinal.{max v u}), a < sup f → succ a < sup f
[PROOFSTEP]
exact fun a => sup_not_succ_of_ne_sup fun i => (lsub_le_iff.1 (le_of_eq h.symm) i).ne
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
i : ι
⊢ f i < sup f
[PROOFSTEP]
by_contra' hle
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
i : ι
hle : sup f ≤ f i
⊢ False
[PROOFSTEP]
have heq := (sup_succ_eq_lsub f).2 ⟨i, le_antisymm (le_sup _ _) hle⟩
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
i : ι
hle : sup f ≤ f i
heq : succ (sup f) = lsub f
⊢ False
[PROOFSTEP]
have :=
  hf _
    (by
      rw [← heq]
      exact lt_succ (sup f))
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
i : ι
hle : sup f ≤ f i
heq : succ (sup f) = lsub f
⊢ ?m.327001 < lsub f
[PROOFSTEP]
rw [← heq]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
i : ι
hle : sup f ≤ f i
heq : succ (sup f) = lsub f
⊢ ?m.327001 < succ (sup f)
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
i : ι
hle : sup f ≤ f i
heq : succ (sup f) = lsub f
⊢ Ordinal.{max v u}
[PROOFSTEP]
exact lt_succ (sup f)
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
i : ι
hle : sup f ≤ f i
heq : succ (sup f) = lsub f
this : succ (sup f) < lsub f
⊢ False
[PROOFSTEP]
rw [heq] at this 
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{max v u}), a < lsub f → succ a < lsub f
i : ι
hle : sup f ≤ f i
heq : succ (sup f) = lsub f
this : lsub f < lsub f
⊢ False
[PROOFSTEP]
exact this.false
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : sup f = lsub f
i : ι
⊢ f i < sup f
[PROOFSTEP]
rw [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : sup f = lsub f
i : ι
⊢ f i < lsub f
[PROOFSTEP]
apply lt_lsub
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u_4
h : IsEmpty ι
f : ι → Ordinal.{max u_5 u_4}
⊢ lsub f = 0
[PROOFSTEP]
rw [← Ordinal.le_zero, lsub_le_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u_4
h : IsEmpty ι
f : ι → Ordinal.{max u_5 u_4}
⊢ ∀ (i : ι), f i < 0
[PROOFSTEP]
exact h.elim
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
⊢ lsub f = 0 ↔ IsEmpty ι
[PROOFSTEP]
refine' ⟨fun h => ⟨fun i => _⟩, fun h => @lsub_empty _ h _⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : lsub f = 0
i : ι
⊢ False
[PROOFSTEP]
have := @lsub_pos.{_, v} _ ⟨i⟩ f
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : lsub f = 0
i : ι
this : 0 < lsub f
⊢ False
[PROOFSTEP]
rw [h] at this 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
h : lsub f = 0
i : ι
this : 0 < 0
⊢ False
[PROOFSTEP]
exact this.false
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
ι' : Type v
f : ι → Ordinal.{max (max u v) w}
g : ι' → Ordinal.{max (max u v) w}
h : range f ⊆ range g
⊢ range (succ ∘ f) ⊆ range (succ ∘ g)
[PROOFSTEP]
convert Set.image_subset succ h
[GOAL]
case h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
ι' : Type v
f : ι → Ordinal.{max (max u v) w}
g : ι' → Ordinal.{max (max u v) w}
h : range f ⊆ range g
⊢ range (succ ∘ f) = succ '' range f
[PROOFSTEP]
apply Set.range_comp
[GOAL]
case h.e'_4
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
ι' : Type v
f : ι → Ordinal.{max (max u v) w}
g : ι' → Ordinal.{max (max u v) w}
h : range f ⊆ range g
⊢ range (succ ∘ g) = succ '' range g
[PROOFSTEP]
apply Set.range_comp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
⊢ o ≤ lsub fun i => typein (fun x x_1 => x < x_1) i
[PROOFSTEP]
by_contra' h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : (lsub fun i => typein (fun x x_1 => x < x_1) i) < o
⊢ False
[PROOFSTEP]
conv_rhs at h => rw [← type_lt o]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : (lsub fun i => typein (fun x x_1 => x < x_1) i) < o
| o
[PROOFSTEP]
rw [← type_lt o]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : (lsub fun i => typein (fun x x_1 => x < x_1) i) < o
| o
[PROOFSTEP]
rw [← type_lt o]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : (lsub fun i => typein (fun x x_1 => x < x_1) i) < o
| o
[PROOFSTEP]
rw [← type_lt o]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : (lsub fun i => typein (fun x x_1 => x < x_1) i) < type fun x x_1 => x < x_1
⊢ False
[PROOFSTEP]
simpa [typein_enum] using lt_lsub.{u, u} (typein (· < ·)) (enum (· < ·) _ h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
ho : ∀ (a : Ordinal.{u}), a < o → succ a < o
⊢ sup (typein fun x x_1 => x < x_1) = o
[PROOFSTEP]
rw [(sup_eq_lsub_iff_succ.{u, u} (typein (· < ·))).2]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
ho : ∀ (a : Ordinal.{u}), a < o → succ a < o
⊢ lsub (typein fun x x_1 => x < x_1) = o
[PROOFSTEP]
rw [lsub_typein o]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
ho : ∀ (a : Ordinal.{u}), a < o → succ a < o
⊢ ∀ (a : Ordinal.{u}), a < lsub (typein fun x x_1 => x < x_1) → succ a < lsub (typein fun x x_1 => x < x_1)
[PROOFSTEP]
rw [lsub_typein o]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
ho : ∀ (a : Ordinal.{u}), a < o → succ a < o
⊢ ∀ (a : Ordinal.{u}), a < o → succ a < o
[PROOFSTEP]
assumption
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
⊢ sup (typein fun x x_1 => x < x_1) = o
[PROOFSTEP]
cases' sup_eq_lsub_or_sup_succ_eq_lsub.{u, u} (typein ((· < ·) : (succ o).out.α → (succ o).out.α → Prop)) with h h
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : sup (typein fun x x_1 => x < x_1) = lsub (typein fun x x_1 => x < x_1)
⊢ sup (typein fun x x_1 => x < x_1) = o
[PROOFSTEP]
rw [sup_eq_lsub_iff_succ] at h 
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : ∀ (a : Ordinal.{u}), a < lsub (typein fun x x_1 => x < x_1) → succ a < lsub (typein fun x x_1 => x < x_1)
⊢ sup (typein fun x x_1 => x < x_1) = o
[PROOFSTEP]
simp only [lsub_typein] at h 
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : ∀ (a : Ordinal.{u}), a < succ o → succ a < succ o
⊢ sup (typein fun x x_1 => x < x_1) = o
[PROOFSTEP]
exact (h o (lt_succ o)).false.elim
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : succ (sup (typein fun x x_1 => x < x_1)) = lsub (typein fun x x_1 => x < x_1)
⊢ sup (typein fun x x_1 => x < x_1) = o
[PROOFSTEP]
rw [← succ_eq_succ_iff, h]
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
h : succ (sup (typein fun x x_1 => x < x_1)) = lsub (typein fun x x_1 => x < x_1)
⊢ lsub (typein fun x x_1 => x < x_1) = succ o
[PROOFSTEP]
apply lsub_typein
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι ι' : Type u
r : ι → ι → Prop
r' : ι' → ι' → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι' r'
o : Ordinal.{u}
ho : type r = o
ho' : type r' = o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ lsub (familyOfBFamily' r ho f) = lsub (familyOfBFamily' r' ho' f)
[PROOFSTEP]
rw [lsub_eq_blsub', lsub_eq_blsub']
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
r r' : ι → ι → Prop
inst✝¹ : IsWellOrder ι r
inst✝ : IsWellOrder ι r'
f : ι → Ordinal.{max u v}
⊢ blsub (type r) (bfamilyOfFamily' r f) = blsub (type r') (bfamilyOfFamily' r' f)
[PROOFSTEP]
rw [blsub_eq_lsub', blsub_eq_lsub']
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o₁ o₂ : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o₁ → Ordinal.{max u v}
ho : o₁ = o₂
⊢ blsub o₁ f = blsub o₂ fun a h => f a (_ : a < o₁)
[PROOFSTEP]
subst ho
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o₁ : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o₁ → Ordinal.{max u v}
⊢ blsub o₁ f = blsub o₁ fun a h => f a (_ : a < o₁)
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
a : Ordinal.{max u v}
⊢ blsub o f ≤ a ↔ ∀ (i : Ordinal.{u}) (h : i < o), f i h < a
[PROOFSTEP]
convert bsup_le_iff.{_, v} (f := fun a ha => succ (f a ha)) (a := a) using 2
[GOAL]
case h.e'_2.h.a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
a : Ordinal.{max u v}
a✝ : Ordinal.{u}
⊢ (∀ (h : a✝ < o), f a✝ h < a) ↔ ∀ (h : a✝ < o), succ (f a✝ h) ≤ a
[PROOFSTEP]
simp_rw [succ_le_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (b : Ordinal.{u}) → b < o → Ordinal.{max u v}
a : Ordinal.{max u v}
⊢ a < blsub o f ↔ ∃ i hi, a ≤ f i hi
[PROOFSTEP]
simpa only [not_forall, not_lt, not_le] using not_congr (@blsub_le_iff.{_, v} _ f a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ bsup o f = blsub o f ∨ succ (bsup o f) = blsub o f
[PROOFSTEP]
rw [← sup_eq_bsup, ← lsub_eq_blsub]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ sup (familyOfBFamily o f) = lsub (familyOfBFamily o f) ∨ succ (sup (familyOfBFamily o f)) = lsub (familyOfBFamily o f)
[PROOFSTEP]
exact sup_eq_lsub_or_sup_succ_eq_lsub _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ succ (bsup o f) ≤ blsub o f ↔ ∃ i hi, f i hi = bsup o f
[PROOFSTEP]
refine' ⟨fun h => _, _⟩
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
h : succ (bsup o f) ≤ blsub o f
⊢ ∃ i hi, f i hi = bsup o f
[PROOFSTEP]
by_contra' hf
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
h : succ (bsup o f) ≤ blsub o f
hf : ∀ (i : Ordinal.{u}) (hi : i < o), f i hi ≠ bsup o f
⊢ False
[PROOFSTEP]
exact ne_of_lt (succ_le_iff.1 h) (le_antisymm (bsup_le_blsub f) (blsub_le (lt_bsup_of_ne_bsup.1 hf)))
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ (∃ i hi, f i hi = bsup o f) → succ (bsup o f) ≤ blsub o f
[PROOFSTEP]
rintro ⟨_, _, hf⟩
[GOAL]
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
w✝¹ : Ordinal.{u}
w✝ : w✝¹ < o
hf : f w✝¹ w✝ = bsup o f
⊢ succ (bsup o f) ≤ blsub o f
[PROOFSTEP]
rw [succ_le_iff, ← hf]
[GOAL]
case refine'_2.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
w✝¹ : Ordinal.{u}
w✝ : w✝¹ < o
hf : f w✝¹ w✝ = bsup o f
⊢ f w✝¹ w✝ < blsub o f
[PROOFSTEP]
exact lt_blsub _ _ _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ bsup o f = blsub o f ↔ ∀ (a : Ordinal.{max u v}), a < blsub o f → succ a < blsub o f
[PROOFSTEP]
rw [← sup_eq_bsup, ← lsub_eq_blsub]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
⊢ sup (familyOfBFamily o f) = lsub (familyOfBFamily o f) ↔
    ∀ (a : Ordinal.{max u v}), a < lsub (familyOfBFamily o f) → succ a < lsub (familyOfBFamily o f)
[PROOFSTEP]
apply sup_eq_lsub_iff_succ
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
h : bsup o f = blsub o f
i : Ordinal.{u}
⊢ ∀ (hi : i < o), f i hi < bsup o f
[PROOFSTEP]
rw [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
h : bsup o f = blsub o f
i : Ordinal.{u}
⊢ ∀ (hi : i < o), f i hi < blsub o f
[PROOFSTEP]
apply lt_blsub
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
ho : IsLimit o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{u}) (ha : a < o), f a ha < f (succ a) (_ : succ a < o)
⊢ bsup o f = blsub o f
[PROOFSTEP]
rw [bsup_eq_blsub_iff_lt_bsup]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
ho : IsLimit o
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
hf : ∀ (a : Ordinal.{u}) (ha : a < o), f a ha < f (succ a) (_ : succ a < o)
⊢ ∀ (i : Ordinal.{u}) (hi : i < o), f i hi < bsup o f
[PROOFSTEP]
exact fun i hi => (hf i hi).trans_le (le_bsup f _ _)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_5 u_4}
⊢ blsub o f = 0 ↔ o = 0
[PROOFSTEP]
rw [← lsub_eq_blsub, lsub_eq_zero_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_5 u_4}
⊢ IsEmpty (Quotient.out o).α ↔ o = 0
[PROOFSTEP]
exact out_empty_iff_eq_zero
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : (a : Ordinal.{u_4}) → a < 0 → Ordinal.{max u_4 u_5}
⊢ blsub 0 f = 0
[PROOFSTEP]
rw [blsub_eq_zero_iff]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
α : Type u
r : α → α → Prop
inst✝ : IsWellOrder α r
f : (a : Ordinal.{u}) → a < type r → Ordinal.{max u v}
o : Ordinal.{max u v}
⊢ blsub (type r) f ≤ o ↔ (lsub fun a => f (typein r a) (_ : typein r a < type r)) ≤ o
[PROOFSTEP]
rw [blsub_le_iff, lsub_le_iff]
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
α : Type u
r : α → α → Prop
inst✝ : IsWellOrder α r
f : (a : Ordinal.{u}) → a < type r → Ordinal.{max u v}
o : Ordinal.{max u v}
⊢ (∀ (i : Ordinal.{u}) (h : i < type r), f i h < o) ↔ ∀ (i : α), f (typein r i) (_ : typein r i < type r) < o
[PROOFSTEP]
exact ⟨fun H b => H _ _, fun H i h => by simpa only [typein_enum] using H (enum r i h)⟩
[GOAL]
α✝ : Type u_1
β : Type u_2
γ : Type u_3
r✝ : α✝ → α✝ → Prop
s : β → β → Prop
t : γ → γ → Prop
α : Type u
r : α → α → Prop
inst✝ : IsWellOrder α r
f : (a : Ordinal.{u}) → a < type r → Ordinal.{max u v}
o : Ordinal.{max u v}
H : ∀ (i : α), f (typein r i) (_ : typein r i < type r) < o
i : Ordinal.{u}
h : i < type r
⊢ f i h < o
[PROOFSTEP]
simpa only [typein_enum] using H (enum r i h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
o' : Ordinal.{v}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max (max u v) w}
g : (a : Ordinal.{v}) → a < o' → Ordinal.{max (max u v) w}
h : brange o f ⊆ brange o' g
a : Ordinal.{max (max u v) w}
x✝ : a ∈ brange o fun a ha => succ (f a ha)
b : Ordinal.{u}
hb : b < o
hb' : (fun a ha => succ (f a ha)) b hb = a
⊢ a ∈ brange o' fun a ha => succ (g a ha)
[PROOFSTEP]
obtain ⟨c, hc, hc'⟩ := h ⟨b, hb, rfl⟩
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
o' : Ordinal.{v}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max (max u v) w}
g : (a : Ordinal.{v}) → a < o' → Ordinal.{max (max u v) w}
h : brange o f ⊆ brange o' g
a : Ordinal.{max (max u v) w}
x✝ : a ∈ brange o fun a ha => succ (f a ha)
b : Ordinal.{u}
hb : b < o
hb' : (fun a ha => succ (f a ha)) b hb = a
c : Ordinal.{v}
hc : c < o'
hc' : g c hc = f b hb
⊢ a ∈ brange o' fun a ha => succ (g a ha)
[PROOFSTEP]
simp_rw [← hc'] at hb' 
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
o' : Ordinal.{v}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max (max u v) w}
g : (a : Ordinal.{v}) → a < o' → Ordinal.{max (max u v) w}
h : brange o f ⊆ brange o' g
a : Ordinal.{max (max u v) w}
x✝ : a ∈ brange o fun a ha => succ (f a ha)
b : Ordinal.{u}
hb : b < o
c : Ordinal.{v}
hc : c < o'
hc' : g c hc = f b hb
hb' : succ (g c hc) = a
⊢ a ∈ brange o' fun a ha => succ (g a ha)
[PROOFSTEP]
exact ⟨c, hc, hb'⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
a : Ordinal.{max u v}
ha : a < o'
⊢ g a ha < o
[PROOFSTEP]
rw [← hg]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
a : Ordinal.{max u v}
ha : a < o'
⊢ g a ha < blsub o' g
[PROOFSTEP]
apply lt_blsub
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
⊢ (bsup o' fun a ha => f (g a ha) (_ : g a ha < o)) = bsup o f
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
⊢ (bsup o' fun a ha => f (g a ha) (_ : g a ha < o)) ≤ bsup o f
[PROOFSTEP]
refine' bsup_le fun i hi => _
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
⊢ bsup o f ≤ bsup o' fun a ha => f (g a ha) (_ : g a ha < o)
[PROOFSTEP]
refine' bsup_le fun i hi => _
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
i : Ordinal.{max u v}
hi : i < o'
⊢ f (g i hi) (_ : g i hi < o) ≤ bsup o f
[PROOFSTEP]
apply le_bsup
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
i : Ordinal.{max u v}
hi : i < o
⊢ f i hi ≤ bsup o' fun a ha => f (g a ha) (_ : g a ha < o)
[PROOFSTEP]
rw [← hg, lt_blsub_iff] at hi 
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
i : Ordinal.{max u v}
hi✝ : i < o
hi : ∃ i_1 hi, i ≤ g i_1 hi
⊢ f i hi✝ ≤ bsup o' fun a ha => f (g a ha) (_ : g a ha < o)
[PROOFSTEP]
rcases hi with ⟨j, hj, hj'⟩
[GOAL]
case a.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
i : Ordinal.{max u v}
hi : i < o
j : Ordinal.{max u v}
hj : j < o'
hj' : i ≤ g j hj
⊢ f i hi ≤ bsup o' fun a ha => f (g a ha) (_ : g a ha < o)
[PROOFSTEP]
exact (hf _ _ hj').trans (le_bsup _ _ _)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
a : Ordinal.{max u v}
ha : a < o'
⊢ g a ha < o
[PROOFSTEP]
rw [← hg]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{max u v}
f : (a : Ordinal.{max u v}) → a < o → Ordinal.{max u v w}
hf : ∀ {i j : Ordinal.{max u v}} (hi : i < o) (hj : j < o), i ≤ j → f i hi ≤ f j hj
g : (a : Ordinal.{max u v}) → a < o' → Ordinal.{max u v}
hg : blsub o' g = o
a : Ordinal.{max u v}
ha : a < o'
⊢ g a ha < blsub o' g
[PROOFSTEP]
apply lt_blsub
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
H : IsNormal f
o : Ordinal.{u}
h : IsLimit o
⊢ (Ordinal.bsup o fun x x_1 => f x) = f o
[PROOFSTEP]
rw [← IsNormal.bsup.{u, u, v} H (fun x _ => x) h.1, bsup_id_limit h.2]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
H : IsNormal f
o : Ordinal.{u}
h : IsLimit o
⊢ (blsub o fun x x_1 => f x) = f o
[PROOFSTEP]
rw [← IsNormal.bsup_eq.{u, v} H h, bsup_eq_blsub_of_lt_succ_limit h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
H : IsNormal f
o : Ordinal.{u}
h : IsLimit o
⊢ ∀ (a : Ordinal.{u}), a < o → f a < f (succ a)
[PROOFSTEP]
exact fun a _ => H.1 a
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
x✝ : (∀ (a : Ordinal.{u}), f a < f (succ a)) ∧ ∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o
h₁ : ∀ (a : Ordinal.{u}), f a < f (succ a)
h₂ : ∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o
o : Ordinal.{u}
ho : IsLimit o
a : Ordinal.{max u v}
⊢ f o ≤ a ↔ ∀ (b : Ordinal.{u}), b < o → f b ≤ a
[PROOFSTEP]
rw [← h₂ o ho]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
x✝ : (∀ (a : Ordinal.{u}), f a < f (succ a)) ∧ ∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o
h₁ : ∀ (a : Ordinal.{u}), f a < f (succ a)
h₂ : ∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o
o : Ordinal.{u}
ho : IsLimit o
a : Ordinal.{max u v}
⊢ (bsup o fun x x_1 => f x) ≤ a ↔ ∀ (b : Ordinal.{u}), b < o → f b ≤ a
[PROOFSTEP]
exact bsup_le_iff
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
⊢ IsNormal f ↔
    (∀ (a : Ordinal.{u}), f a < f (succ a)) ∧ ∀ (o : Ordinal.{u}), IsLimit o → (blsub o fun x x_1 => f x) = f o
[PROOFSTEP]
rw [isNormal_iff_lt_succ_and_bsup_eq.{u, v}, and_congr_right_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
⊢ (∀ (a : Ordinal.{u}), f a < f (succ a)) →
    ((∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o) ↔
      ∀ (o : Ordinal.{u}), IsLimit o → (blsub o fun x x_1 => f x) = f o)
[PROOFSTEP]
intro h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
h : ∀ (a : Ordinal.{u}), f a < f (succ a)
⊢ (∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o) ↔
    ∀ (o : Ordinal.{u}), IsLimit o → (blsub o fun x x_1 => f x) = f o
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
h : ∀ (a : Ordinal.{u}), f a < f (succ a)
⊢ (∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o) →
    ∀ (o : Ordinal.{u}), IsLimit o → (blsub o fun x x_1 => f x) = f o
[PROOFSTEP]
intro H o ho
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
h : ∀ (a : Ordinal.{u}), f a < f (succ a)
⊢ (∀ (o : Ordinal.{u}), IsLimit o → (blsub o fun x x_1 => f x) = f o) →
    ∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o
[PROOFSTEP]
intro H o ho
[GOAL]
case mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
h : ∀ (a : Ordinal.{u}), f a < f (succ a)
H : ∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o
o : Ordinal.{u}
ho : IsLimit o
⊢ (blsub o fun x x_1 => f x) = f o
[PROOFSTEP]
have := H o ho
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
h : ∀ (a : Ordinal.{u}), f a < f (succ a)
H : ∀ (o : Ordinal.{u}), IsLimit o → (blsub o fun x x_1 => f x) = f o
o : Ordinal.{u}
ho : IsLimit o
⊢ (bsup o fun x x_1 => f x) = f o
[PROOFSTEP]
have := H o ho
[GOAL]
case mp
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
h : ∀ (a : Ordinal.{u}), f a < f (succ a)
H : ∀ (o : Ordinal.{u}), IsLimit o → (bsup o fun x x_1 => f x) = f o
o : Ordinal.{u}
ho : IsLimit o
this : (bsup o fun x x_1 => f x) = f o
⊢ (blsub o fun x x_1 => f x) = f o
[PROOFSTEP]
rwa [← bsup_eq_blsub_of_lt_succ_limit ho fun a _ => h a] at *
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f : Ordinal.{u} → Ordinal.{max u v}
h : ∀ (a : Ordinal.{u}), f a < f (succ a)
H : ∀ (o : Ordinal.{u}), IsLimit o → (blsub o fun x x_1 => f x) = f o
o : Ordinal.{u}
ho : IsLimit o
this : (blsub o fun x x_1 => f x) = f o
⊢ (bsup o fun x x_1 => f x) = f o
[PROOFSTEP]
rwa [← bsup_eq_blsub_of_lt_succ_limit ho fun a _ => h a] at *
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
h : f = g
⊢ f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
[PROOFSTEP]
simp [h]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
a : Ordinal.{u}
⊢ f a = g a
[PROOFSTEP]
induction' a using limitRecOn with _ _ _ ho H
[GOAL]
case H₁
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
⊢ f 0 = g 0
case H₂
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
o✝ : Ordinal.{u}
a✝ : f o✝ = g o✝
⊢ f (succ o✝) = g (succ o✝)
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
o✝ : Ordinal.{u}
ho : IsLimit o✝
H : ∀ (o' : Ordinal.{u}), o' < o✝ → f o' = g o'
⊢ f o✝ = g o✝
[PROOFSTEP]
any_goals solve_by_elim
[GOAL]
case H₁
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
⊢ f 0 = g 0
[PROOFSTEP]
solve_by_elim
[GOAL]
case H₂
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
o✝ : Ordinal.{u}
a✝ : f o✝ = g o✝
⊢ f (succ o✝) = g (succ o✝)
[PROOFSTEP]
solve_by_elim
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
o✝ : Ordinal.{u}
ho : IsLimit o✝
H : ∀ (o' : Ordinal.{u}), o' < o✝ → f o' = g o'
⊢ f o✝ = g o✝
[PROOFSTEP]
solve_by_elim
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
o✝ : Ordinal.{u}
ho : IsLimit o✝
H : ∀ (o' : Ordinal.{u}), o' < o✝ → f o' = g o'
⊢ f o✝ = g o✝
[PROOFSTEP]
rw [← IsNormal.bsup_eq.{u, u} hf ho, ← IsNormal.bsup_eq.{u, u} hg ho]
[GOAL]
case H₃
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
o✝ : Ordinal.{u}
ho : IsLimit o✝
H : ∀ (o' : Ordinal.{u}), o' < o✝ → f o' = g o'
⊢ (Ordinal.bsup o✝ fun x x_1 => f x) = Ordinal.bsup o✝ fun x x_1 => g x
[PROOFSTEP]
congr
[GOAL]
case H₃.e_f
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
o✝ : Ordinal.{u}
ho : IsLimit o✝
H : ∀ (o' : Ordinal.{u}), o' < o✝ → f o' = g o'
⊢ (fun x x_1 => f x) = fun x x_1 => g x
[PROOFSTEP]
ext b hb
[GOAL]
case H₃.e_f.h.h
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
f g : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
hg : IsNormal g
x✝ : f 0 = g 0 ∧ ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
h₁ : f 0 = g 0
h₂ : ∀ (a : Ordinal.{u}), f a = g a → f (succ a) = g (succ a)
o✝ : Ordinal.{u}
ho : IsLimit o✝
H : ∀ (o' : Ordinal.{u}), o' < o✝ → f o' = g o'
b : Ordinal.{u}
hb : b < o✝
⊢ f b = g b
[PROOFSTEP]
exact H b hb
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o₁ : Ordinal.{u_4}
o₂ : Ordinal.{u_5}
op : {a : Ordinal.{u_4}} → a < o₁ → {b : Ordinal.{u_5}} → b < o₂ → Ordinal.{max (max u_4 u_5) u_6}
a : Ordinal.{u_4}
b : Ordinal.{u_5}
ha : a < o₁
hb : b < o₂
⊢ op ha hb < blsub₂ o₁ o₂ fun {a} => op
[PROOFSTEP]
convert lt_lsub _ (Prod.mk (enum (· < ·) a (by rwa [type_lt])) (enum (· < ·) b (by rwa [type_lt])))
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o₁ : Ordinal.{u_4}
o₂ : Ordinal.{u_5}
op : {a : Ordinal.{u_4}} → a < o₁ → {b : Ordinal.{u_5}} → b < o₂ → Ordinal.{max (max u_4 u_5) u_6}
a : Ordinal.{u_4}
b : Ordinal.{u_5}
ha : a < o₁
hb : b < o₂
⊢ a < type fun x x_1 => x < x_1
[PROOFSTEP]
rwa [type_lt]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o₁ : Ordinal.{u_4}
o₂ : Ordinal.{u_5}
op : {a : Ordinal.{u_4}} → a < o₁ → {b : Ordinal.{u_5}} → b < o₂ → Ordinal.{max (max u_4 u_5) u_6}
a : Ordinal.{u_4}
b : Ordinal.{u_5}
ha : a < o₁
hb : b < o₂
⊢ b < type fun x x_1 => x < x_1
[PROOFSTEP]
rwa [type_lt]
[GOAL]
case h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o₁ : Ordinal.{u_4}
o₂ : Ordinal.{u_5}
op : {a : Ordinal.{u_4}} → a < o₁ → {b : Ordinal.{u_5}} → b < o₂ → Ordinal.{max (max u_4 u_5) u_6}
a : Ordinal.{u_4}
b : Ordinal.{u_5}
ha : a < o₁
hb : b < o₂
⊢ op ha hb =
    (fun {a} => op)
      (_ :
        typein (fun x x_1 => x < x_1)
            (enum (fun x x_1 => x < x_1) a (_ : a < type fun x x_1 => x < x_1),
                enum (fun x x_1 => x < x_1) b (_ : b < type fun x x_1 => x < x_1)).fst <
          o₁)
      (_ :
        typein (fun x x_1 => x < x_1)
            (enum (fun x x_1 => x < x_1) a (_ : a < type fun x x_1 => x < x_1),
                enum (fun x x_1 => x < x_1) b (_ : b < type fun x x_1 => x < x_1)).snd <
          o₂)
[PROOFSTEP]
simp only [typein_enum]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
a : Ordinal.{max u v}
H : ∀ (b : Ordinal.{max u v}), b < a → ∃ i, f i = b
⊢ a ≤ mex f
[PROOFSTEP]
by_contra' h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
a : Ordinal.{max u v}
H : ∀ (b : Ordinal.{max u v}), b < a → ∃ i, f i = b
h : mex f < a
⊢ False
[PROOFSTEP]
exact mex_not_mem_range f (H _ h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{max u v}
⊢ ∀ (i : ι), f i ≠ mex f
[PROOFSTEP]
simpa using mex_not_mem_range.{_, v} f
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u_4
f : ι → Ordinal.{max u_5 u_4}
a : Ordinal.{max u_5 u_4}
ha : ∀ (i : ι), f i ≠ a
⊢ a ∈ (range f)ᶜ
[PROOFSTEP]
simp [ha]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u_4
f : ι → Ordinal.{max u_5 u_4}
a : Ordinal.{max u_4 u_5}
ha : a < mex f
⊢ ∃ i, f i = a
[PROOFSTEP]
by_contra' ha'
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u_4
f : ι → Ordinal.{max u_5 u_4}
a : Ordinal.{max u_4 u_5}
ha : a < mex f
ha' : ∀ (i : ι), f i ≠ a
⊢ False
[PROOFSTEP]
exact ha.not_le (mex_le_of_ne ha')
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u
f : α → Ordinal.{max u v}
g : β → Ordinal.{max u v}
h : range f ⊆ range g
⊢ mex f ≤ mex g
[PROOFSTEP]
refine' mex_le_of_ne fun i hi => _
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u
f : α → Ordinal.{max u v}
g : β → Ordinal.{max u v}
h : range f ⊆ range g
i : α
hi : f i = mex g
⊢ False
[PROOFSTEP]
cases' h ⟨i, rfl⟩ with j hj
[GOAL]
case intro
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u
f : α → Ordinal.{max u v}
g : β → Ordinal.{max u v}
h : range f ⊆ range g
i : α
hi : f i = mex g
j : β
hj : g j = f i
⊢ False
[PROOFSTEP]
rw [← hj] at hi 
[GOAL]
case intro
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
r : α✝ → α✝ → Prop
s : β✝ → β✝ → Prop
t : γ → γ → Prop
α β : Type u
f : α → Ordinal.{max u v}
g : β → Ordinal.{max u v}
h : range f ⊆ range g
i : α
j : β
hi : g j = mex g
hj : g j = f i
⊢ False
[PROOFSTEP]
exact ne_mex g j hi
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
⊢ mex f < ord (succ #ι)
[PROOFSTEP]
by_contra' h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
⊢ False
[PROOFSTEP]
apply (lt_succ #ι).not_le
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
⊢ succ #ι ≤ #ι
[PROOFSTEP]
have H := fun a => exists_of_lt_mex ((typein_lt_self a).trans_le h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
H : ∀ (a : (Quotient.out (ord (succ #ι))).α), ∃ i, f i = typein (fun x x_1 => x < x_1) a
⊢ succ #ι ≤ #ι
[PROOFSTEP]
let g : (succ #ι).ord.out.α → ι := fun a => Classical.choose (H a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
H : ∀ (a : (Quotient.out (ord (succ #ι))).α), ∃ i, f i = typein (fun x x_1 => x < x_1) a
g : (Quotient.out (ord (succ #ι))).α → ι := fun a => choose (_ : ∃ i, f i = typein (fun x x_1 => x < x_1) a)
⊢ succ #ι ≤ #ι
[PROOFSTEP]
have hg : Injective g := fun a b h' =>
  by
  have Hf : ∀ x, f (g x) = typein ((· < ·) : (succ #ι).ord.out.α → (succ #ι).ord.out.α → Prop) x := fun a =>
    Classical.choose_spec (H a)
  apply_fun f at h' 
  rwa [Hf, Hf, typein_inj] at h' 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
H : ∀ (a : (Quotient.out (ord (succ #ι))).α), ∃ i, f i = typein (fun x x_1 => x < x_1) a
g : (Quotient.out (ord (succ #ι))).α → ι := fun a => choose (_ : ∃ i, f i = typein (fun x x_1 => x < x_1) a)
a b : (Quotient.out (ord (succ #ι))).α
h' : g a = g b
⊢ a = b
[PROOFSTEP]
have Hf : ∀ x, f (g x) = typein ((· < ·) : (succ #ι).ord.out.α → (succ #ι).ord.out.α → Prop) x := fun a =>
  Classical.choose_spec (H a)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
H : ∀ (a : (Quotient.out (ord (succ #ι))).α), ∃ i, f i = typein (fun x x_1 => x < x_1) a
g : (Quotient.out (ord (succ #ι))).α → ι := fun a => choose (_ : ∃ i, f i = typein (fun x x_1 => x < x_1) a)
a b : (Quotient.out (ord (succ #ι))).α
h' : g a = g b
Hf : ∀ (x : (Quotient.out (ord (succ #ι))).α), f (g x) = typein (fun x x_1 => x < x_1) x
⊢ a = b
[PROOFSTEP]
apply_fun f at h' 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
H : ∀ (a : (Quotient.out (ord (succ #ι))).α), ∃ i, f i = typein (fun x x_1 => x < x_1) a
g : (Quotient.out (ord (succ #ι))).α → ι := fun a => choose (_ : ∃ i, f i = typein (fun x x_1 => x < x_1) a)
a b : (Quotient.out (ord (succ #ι))).α
Hf : ∀ (x : (Quotient.out (ord (succ #ι))).α), f (g x) = typein (fun x x_1 => x < x_1) x
h' : f (g a) = f (g b)
⊢ a = b
[PROOFSTEP]
rwa [Hf, Hf, typein_inj] at h' 
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
H : ∀ (a : (Quotient.out (ord (succ #ι))).α), ∃ i, f i = typein (fun x x_1 => x < x_1) a
g : (Quotient.out (ord (succ #ι))).α → ι := fun a => choose (_ : ∃ i, f i = typein (fun x x_1 => x < x_1) a)
hg : Injective g
⊢ succ #ι ≤ #ι
[PROOFSTEP]
convert Cardinal.mk_le_of_injective hg
[GOAL]
case h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
ι : Type u
f : ι → Ordinal.{u}
h : ord (succ #ι) ≤ mex f
H : ∀ (a : (Quotient.out (ord (succ #ι))).α), ∃ i, f i = typein (fun x x_1 => x < x_1) a
g : (Quotient.out (ord (succ #ι))).α → ι := fun a => choose (_ : ∃ i, f i = typein (fun x x_1 => x < x_1) a)
hg : Injective g
⊢ succ #ι = #(Quotient.out (ord (succ #ι))).α
[PROOFSTEP]
rw [Cardinal.mk_ord_out (succ #ι)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_4 u_5}
⊢ ¬bmex o f ∈ brange o f
[PROOFSTEP]
rw [← range_familyOfBFamily]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_4 u_5}
⊢ ¬bmex o f ∈ range (familyOfBFamily o f)
[PROOFSTEP]
apply mex_not_mem_range
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_4 u_5}
a : Ordinal.{max u_4 u_5}
H : ∀ (b : Ordinal.{max u_4 u_5}), b < a → ∃ i hi, f i hi = b
⊢ a ≤ bmex o f
[PROOFSTEP]
by_contra' h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_4 u_5}
a : Ordinal.{max u_4 u_5}
H : ∀ (b : Ordinal.{max u_4 u_5}), b < a → ∃ i hi, f i hi = b
h : bmex o f < a
⊢ False
[PROOFSTEP]
exact bmex_not_mem_brange f (H _ h)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : Ordinal.{u}
hi : i < o
⊢ f i hi ≠ bmex o f
[PROOFSTEP]
convert (config := { transparency := .default })
  ne_mex.{_, v} (familyOfBFamily o f) (enum (· < ·) i (by rwa [type_lt])) using 2
  -- Porting note: `familyOfBFamily_enum` → `typein_enum`
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : Ordinal.{u}
hi : i < o
⊢ i < type fun x x_1 => x < x_1
[PROOFSTEP]
rwa [type_lt]
[GOAL]
case h.e'_2.h.e'_1
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
i : Ordinal.{u}
hi : i < o
⊢ i = typein (fun x x_1 => x < x_1) (enum (fun x x_1 => x < x_1) i (_ : i < type fun x x_1 => x < x_1))
[PROOFSTEP]
rw [typein_enum]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_4 u_5}
a : Ordinal.{max u_5 u_4}
ha : a < bmex o f
⊢ ∃ i hi, f i hi = a
[PROOFSTEP]
cases' exists_of_lt_mex ha with i hi
[GOAL]
case intro
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u_4}
f : (a : Ordinal.{u_4}) → a < o → Ordinal.{max u_4 u_5}
a : Ordinal.{max u_5 u_4}
ha : a < bmex o f
i : (Quotient.out o).α
hi : familyOfBFamily o f i = a
⊢ ∃ i hi, f i hi = a
[PROOFSTEP]
exact ⟨_, typein_lt_self i, hi⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o o' : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{max u v}
g : (a : Ordinal.{u}) → a < o' → Ordinal.{max u v}
h : brange o f ⊆ brange o' g
⊢ range (familyOfBFamily o f) ⊆ range (familyOfBFamily o' g)
[PROOFSTEP]
rwa [range_familyOfBFamily, range_familyOfBFamily]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{u}
⊢ bmex o f < ord (succ (card o))
[PROOFSTEP]
rw [← mk_ordinal_out]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
r : α → α → Prop
s : β → β → Prop
t : γ → γ → Prop
o : Ordinal.{u}
f : (a : Ordinal.{u}) → a < o → Ordinal.{u}
⊢ bmex o f < ord (succ #(Quotient.out o).α)
[PROOFSTEP]
exact mex_lt_ord_succ_mk (familyOfBFamily o f)
[GOAL]
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
o : Ordinal.{u}
⊢ enumOrd S o ∈ S ∩ Ici (blsub o fun c x => enumOrd S c)
[PROOFSTEP]
rw [enumOrd_def']
[GOAL]
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
o : Ordinal.{u}
⊢ sInf (S ∩ Ici (blsub o fun a x => enumOrd S a)) ∈ S ∩ Ici (blsub o fun c x => enumOrd S c)
[PROOFSTEP]
exact csInf_mem (enumOrd_def'_nonempty hS _)
[GOAL]
S : Set Ordinal.{u}
o : Ordinal.{u}
⊢ enumOrd S o = sInf (S ∩ {b | ∀ (c : Ordinal.{u}), c < o → enumOrd S c < b})
[PROOFSTEP]
rw [enumOrd_def']
[GOAL]
S : Set Ordinal.{u}
o : Ordinal.{u}
⊢ sInf (S ∩ Ici (blsub o fun a x => enumOrd S a)) = sInf (S ∩ {b | ∀ (c : Ordinal.{u}), c < o → enumOrd S c < b})
[PROOFSTEP]
congr
[GOAL]
case e_a.e_a
S : Set Ordinal.{u}
o : Ordinal.{u}
⊢ Ici (blsub o fun a x => enumOrd S a) = {b | ∀ (c : Ordinal.{u}), c < o → enumOrd S c < b}
[PROOFSTEP]
ext
[GOAL]
case e_a.e_a.h
S : Set Ordinal.{u}
o x✝ : Ordinal.{u}
⊢ x✝ ∈ Ici (blsub o fun a x => enumOrd S a) ↔ x✝ ∈ {b | ∀ (c : Ordinal.{u}), c < o → enumOrd S c < b}
[PROOFSTEP]
exact ⟨fun h a hao => (lt_blsub.{u, u} _ _ hao).trans_le h, blsub_le⟩
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o : Ordinal.{u_1}
⊢ enumOrd (range f) o = f o
[PROOFSTEP]
apply Ordinal.induction o
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o : Ordinal.{u_1}
⊢ ∀ (j : Ordinal.{u_1}), (∀ (k : Ordinal.{u_1}), k < j → enumOrd (range f) k = f k) → enumOrd (range f) j = f j
[PROOFSTEP]
intro a H
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
⊢ enumOrd (range f) a = f a
[PROOFSTEP]
rw [enumOrd_def a]
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
⊢ sInf (range f ∩ {b | ∀ (c : Ordinal.{u_1}), c < a → enumOrd (range f) c < b}) = f a
[PROOFSTEP]
have Hfa : f a ∈ range f ∩ {b | ∀ c, c < a → enumOrd (range f) c < b} :=
  ⟨mem_range_self a, fun b hb => by
    rw [H b hb]
    exact hf hb⟩
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
b : Ordinal.{u_1}
hb : b < a
⊢ enumOrd (range f) b < f a
[PROOFSTEP]
rw [H b hb]
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
b : Ordinal.{u_1}
hb : b < a
⊢ f b < f a
[PROOFSTEP]
exact hf hb
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
Hfa : f a ∈ range f ∩ {b | ∀ (c : Ordinal.{u_1}), c < a → enumOrd (range f) c < b}
⊢ sInf (range f ∩ {b | ∀ (c : Ordinal.{u_1}), c < a → enumOrd (range f) c < b}) = f a
[PROOFSTEP]
refine' (csInf_le' Hfa).antisymm ((le_csInf_iff'' ⟨_, Hfa⟩).2 _)
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
Hfa : f a ∈ range f ∩ {b | ∀ (c : Ordinal.{u_1}), c < a → enumOrd (range f) c < b}
⊢ ∀ (b : Ordinal.{u_1}), b ∈ range f ∩ {b | ∀ (c : Ordinal.{u_1}), c < a → enumOrd (range f) c < b} → f a ≤ b
[PROOFSTEP]
rintro _ ⟨⟨c, rfl⟩, hc : ∀ b < a, enumOrd (range f) b < f c⟩
[GOAL]
case intro.intro
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
Hfa : f a ∈ range f ∩ {b | ∀ (c : Ordinal.{u_1}), c < a → enumOrd (range f) c < b}
c : Ordinal.{u_1}
hc : ∀ (b : Ordinal.{u_1}), b < a → enumOrd (range f) b < f c
⊢ f a ≤ f c
[PROOFSTEP]
rw [hf.le_iff_le]
[GOAL]
case intro.intro
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
Hfa : f a ∈ range f ∩ {b | ∀ (c : Ordinal.{u_1}), c < a → enumOrd (range f) c < b}
c : Ordinal.{u_1}
hc : ∀ (b : Ordinal.{u_1}), b < a → enumOrd (range f) b < f c
⊢ a ≤ c
[PROOFSTEP]
contrapose! hc
[GOAL]
case intro.intro
S : Set Ordinal.{u}
f : Ordinal.{u_1} → Ordinal.{u_1}
hf : StrictMono f
o a : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < a → enumOrd (range f) k = f k
Hfa : f a ∈ range f ∩ {b | ∀ (c : Ordinal.{u_1}), c < a → enumOrd (range f) c < b}
c : Ordinal.{u_1}
hc : c < a
⊢ ∃ b, b < a ∧ f c ≤ enumOrd (range f) b
[PROOFSTEP]
exact ⟨c, hc, (H c hc).ge⟩
[GOAL]
S : Set Ordinal.{u}
⊢ enumOrd Set.univ = id
[PROOFSTEP]
rw [← range_id]
[GOAL]
S : Set Ordinal.{u}
⊢ enumOrd (range id) = id
[PROOFSTEP]
exact enumOrd_range strictMono_id
[GOAL]
S : Set Ordinal.{u}
⊢ enumOrd S 0 = sInf S
[PROOFSTEP]
rw [enumOrd_def]
[GOAL]
S : Set Ordinal.{u}
⊢ sInf (S ∩ {b | ∀ (c : Ordinal.{u}), c < 0 → enumOrd S c < b}) = sInf S
[PROOFSTEP]
simp [Ordinal.not_lt_zero]
[GOAL]
S : Set Ordinal.{u}
a b : Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
ha : a ∈ S
hb : enumOrd S b < a
⊢ enumOrd S (succ b) ≤ a
[PROOFSTEP]
rw [enumOrd_def]
[GOAL]
S : Set Ordinal.{u}
a b : Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
ha : a ∈ S
hb : enumOrd S b < a
⊢ sInf (S ∩ {b_1 | ∀ (c : Ordinal.{u}), c < succ b → enumOrd S c < b_1}) ≤ a
[PROOFSTEP]
exact csInf_le' ⟨ha, fun c hc => ((enumOrd_strictMono hS).monotone (le_of_lt_succ hc)).trans_lt hb⟩
[GOAL]
S✝ : Set Ordinal.{u}
S T : Set Ordinal.{u_1}
hS : Unbounded (fun x x_1 => x < x_1) S
hST : S ⊆ T
a : Ordinal.{u_1}
⊢ enumOrd T a ≤ enumOrd S a
[PROOFSTEP]
apply Ordinal.induction a
[GOAL]
S✝ : Set Ordinal.{u}
S T : Set Ordinal.{u_1}
hS : Unbounded (fun x x_1 => x < x_1) S
hST : S ⊆ T
a : Ordinal.{u_1}
⊢ ∀ (j : Ordinal.{u_1}), (∀ (k : Ordinal.{u_1}), k < j → enumOrd T k ≤ enumOrd S k) → enumOrd T j ≤ enumOrd S j
[PROOFSTEP]
intro b H
[GOAL]
S✝ : Set Ordinal.{u}
S T : Set Ordinal.{u_1}
hS : Unbounded (fun x x_1 => x < x_1) S
hST : S ⊆ T
a b : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < b → enumOrd T k ≤ enumOrd S k
⊢ enumOrd T b ≤ enumOrd S b
[PROOFSTEP]
rw [enumOrd_def]
[GOAL]
S✝ : Set Ordinal.{u}
S T : Set Ordinal.{u_1}
hS : Unbounded (fun x x_1 => x < x_1) S
hST : S ⊆ T
a b : Ordinal.{u_1}
H : ∀ (k : Ordinal.{u_1}), k < b → enumOrd T k ≤ enumOrd S k
⊢ sInf (T ∩ {b_1 | ∀ (c : Ordinal.{u_1}), c < b → enumOrd T c < b_1}) ≤ enumOrd S b
[PROOFSTEP]
exact csInf_le' ⟨hST (enumOrd_mem hS b), fun c h => (H c h).trans_lt (enumOrd_strictMono hS h)⟩
[GOAL]
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
⊢ enumOrd S (sSup {a | enumOrd S a ≤ s}) = s
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
⊢ enumOrd S (sSup {a | enumOrd S a ≤ s}) ≤ s
[PROOFSTEP]
rw [enumOrd_def]
[GOAL]
case a
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
⊢ sInf (S ∩ {b | ∀ (c : Ordinal.{u}), c < sSup {a | enumOrd S a ≤ s} → enumOrd S c < b}) ≤ s
[PROOFSTEP]
refine' csInf_le' ⟨hs, fun a ha => _⟩
[GOAL]
case a
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
a : Ordinal.{u}
ha : a < sSup {a | enumOrd S a ≤ s}
⊢ enumOrd S a < s
[PROOFSTEP]
have : enumOrd S 0 ≤ s := by
  rw [enumOrd_zero]
  exact csInf_le' hs
[GOAL]
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
a : Ordinal.{u}
ha : a < sSup {a | enumOrd S a ≤ s}
⊢ enumOrd S 0 ≤ s
[PROOFSTEP]
rw [enumOrd_zero]
[GOAL]
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
a : Ordinal.{u}
ha : a < sSup {a | enumOrd S a ≤ s}
⊢ sInf S ≤ s
[PROOFSTEP]
exact csInf_le' hs
[GOAL]
case a
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
a : Ordinal.{u}
ha : a < sSup {a | enumOrd S a ≤ s}
this : enumOrd S 0 ≤ s
⊢ enumOrd S a < s
[PROOFSTEP]
rcases flip exists_lt_of_lt_csSup ha ⟨0, this⟩ with ⟨b, hb, hab⟩
[GOAL]
case a.intro.intro
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
a : Ordinal.{u}
ha : a < sSup {a | enumOrd S a ≤ s}
this : enumOrd S 0 ≤ s
b : Ordinal.{u}
hb : b ∈ {a | enumOrd S a ≤ s}
hab : a < b
⊢ enumOrd S a < s
[PROOFSTEP]
exact (enumOrd_strictMono hS hab).trans_le hb
[GOAL]
case a
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
⊢ s ≤ enumOrd S (sSup {a | enumOrd S a ≤ s})
[PROOFSTEP]
by_contra' h
[GOAL]
case a
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
s : Ordinal.{u}
hs : s ∈ S
h : enumOrd S (sSup {a | enumOrd S a ≤ s}) < s
⊢ False
[PROOFSTEP]
exact
  (le_csSup ⟨s, fun a => (lt_wf.self_le_of_strictMono (enumOrd_strictMono hS) a).trans⟩
        (enumOrd_succ_le hS hs h)).not_lt
    (lt_succ _)
[GOAL]
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
⊢ range (enumOrd S) = S
[PROOFSTEP]
rw [range_eq_iff]
[GOAL]
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
⊢ (∀ (a : Ordinal.{u}), enumOrd S a ∈ S) ∧ ∀ (b : Ordinal.{u}), b ∈ S → ∃ a, enumOrd S a = b
[PROOFSTEP]
exact ⟨enumOrd_mem hS, enumOrd_surjective hS⟩
[GOAL]
S : Set Ordinal.{u}
f : Ordinal.{u} → Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
⊢ StrictMono f ∧ range f = S ↔ f = enumOrd S
[PROOFSTEP]
constructor
[GOAL]
case mp
S : Set Ordinal.{u}
f : Ordinal.{u} → Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
⊢ StrictMono f ∧ range f = S → f = enumOrd S
[PROOFSTEP]
rintro ⟨h₁, h₂⟩
[GOAL]
case mp.intro
S : Set Ordinal.{u}
f : Ordinal.{u} → Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
h₁ : StrictMono f
h₂ : range f = S
⊢ f = enumOrd S
[PROOFSTEP]
rwa [← lt_wf.eq_strictMono_iff_eq_range h₁ (enumOrd_strictMono hS), range_enumOrd hS]
[GOAL]
case mpr
S : Set Ordinal.{u}
f : Ordinal.{u} → Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
⊢ f = enumOrd S → StrictMono f ∧ range f = S
[PROOFSTEP]
rintro rfl
[GOAL]
case mpr
S : Set Ordinal.{u}
hS : Unbounded (fun x x_1 => x < x_1) S
⊢ StrictMono (enumOrd S) ∧ range (enumOrd S) = S
[PROOFSTEP]
exact ⟨enumOrd_strictMono hS, range_enumOrd hS⟩
[GOAL]
m : ℕ
⊢ 1 + ↑m = ↑(succ m)
[PROOFSTEP]
rw [← Nat.cast_one, ← Nat.cast_add, add_comm]
[GOAL]
m : ℕ
⊢ ↑(m + 1) = ↑(succ m)
[PROOFSTEP]
rfl
[GOAL]
m : ℕ
⊢ ↑(m * 0) = ↑m * ↑0
[PROOFSTEP]
simp
[GOAL]
m n : ℕ
⊢ ↑(m * (n + 1)) = ↑m * ↑(n + 1)
[PROOFSTEP]
rw [Nat.mul_succ, Nat.cast_add, nat_cast_mul m n, Nat.cast_succ, mul_add_one]
[GOAL]
m n : ℕ
⊢ ↑m ≤ ↑n ↔ m ≤ n
[PROOFSTEP]
rw [← Cardinal.ord_nat, ← Cardinal.ord_nat, Cardinal.ord_le_ord, Cardinal.natCast_le]
[GOAL]
m n : ℕ
⊢ ↑m < ↑n ↔ m < n
[PROOFSTEP]
simp only [lt_iff_le_not_le, nat_cast_le]
[GOAL]
m n : ℕ
⊢ ↑m = ↑n ↔ m = n
[PROOFSTEP]
simp only [le_antisymm_iff, nat_cast_le]
[GOAL]
m n : ℕ
⊢ ↑(m - n) = ↑m - ↑n
[PROOFSTEP]
cases' le_total m n with h h
[GOAL]
case inl
m n : ℕ
h : m ≤ n
⊢ ↑(m - n) = ↑m - ↑n
[PROOFSTEP]
rw [tsub_eq_zero_iff_le.2 h, Ordinal.sub_eq_zero_iff_le.2 (nat_cast_le.2 h)]
[GOAL]
case inl
m n : ℕ
h : m ≤ n
⊢ ↑0 = 0
[PROOFSTEP]
rfl
[GOAL]
case inr
m n : ℕ
h : n ≤ m
⊢ ↑(m - n) = ↑m - ↑n
[PROOFSTEP]
apply (add_left_cancel n).1
[GOAL]
case inr
m n : ℕ
h : n ≤ m
⊢ ↑n + ↑(m - n) = ↑n + (↑m - ↑n)
[PROOFSTEP]
rw [← Nat.cast_add, add_tsub_cancel_of_le h, Ordinal.add_sub_cancel_of_le (nat_cast_le.2 h)]
[GOAL]
m n : ℕ
⊢ ↑(m / n) = ↑m / ↑n
[PROOFSTEP]
rcases eq_or_ne n 0 with (rfl | hn)
[GOAL]
case inl
m : ℕ
⊢ ↑(m / 0) = ↑m / ↑0
[PROOFSTEP]
simp
[GOAL]
case inr
m n : ℕ
hn : n ≠ 0
⊢ ↑(m / n) = ↑m / ↑n
[PROOFSTEP]
have hn' := nat_cast_ne_zero.2 hn
[GOAL]
case inr
m n : ℕ
hn : n ≠ 0
hn' : ↑n ≠ 0
⊢ ↑(m / n) = ↑m / ↑n
[PROOFSTEP]
apply le_antisymm
[GOAL]
case inr.a
m n : ℕ
hn : n ≠ 0
hn' : ↑n ≠ 0
⊢ ↑(m / n) ≤ ↑m / ↑n
[PROOFSTEP]
rw [le_div hn', ← nat_cast_mul, nat_cast_le, mul_comm]
[GOAL]
case inr.a
m n : ℕ
hn : n ≠ 0
hn' : ↑n ≠ 0
⊢ m / n * n ≤ m
[PROOFSTEP]
apply Nat.div_mul_le_self
[GOAL]
case inr.a
m n : ℕ
hn : n ≠ 0
hn' : ↑n ≠ 0
⊢ ↑m / ↑n ≤ ↑(m / n)
[PROOFSTEP]
rw [div_le hn', ← add_one_eq_succ, ← Nat.cast_succ, ← nat_cast_mul, nat_cast_lt, mul_comm, ←
  Nat.div_lt_iff_lt_mul (Nat.pos_of_ne_zero hn)]
[GOAL]
case inr.a
m n : ℕ
hn : n ≠ 0
hn' : ↑n ≠ 0
⊢ m / n < Nat.succ (m / n)
[PROOFSTEP]
apply Nat.lt_succ_self
[GOAL]
m n : ℕ
⊢ ↑(m % n) = ↑m % ↑n
[PROOFSTEP]
rw [← add_left_cancel, div_add_mod, ← nat_cast_div, ← nat_cast_mul, ← Nat.cast_add, Nat.div_add_mod]
[GOAL]
⊢ lift ↑0 = ↑0
[PROOFSTEP]
simp
[GOAL]
n : ℕ
⊢ lift ↑(n + 1) = ↑(n + 1)
[PROOFSTEP]
simp [lift_nat_cast n]
[GOAL]
o : Ordinal.{u}
h : o < ω
⊢ o < ord ℵ₀
[PROOFSTEP]
rcases Ordinal.lt_lift_iff.1 h with ⟨o, rfl, h'⟩
[GOAL]
case intro.intro
o : Ordinal.{0}
h' : o < type fun x x_1 => x < x_1
h : Ordinal.lift o < ω
⊢ Ordinal.lift o < ord ℵ₀
[PROOFSTEP]
rw [lt_ord, ← lift_card, lift_lt_aleph0, ← typein_enum (· < ·) h']
[GOAL]
case intro.intro
o : Ordinal.{0}
h' : o < type fun x x_1 => x < x_1
h : Ordinal.lift o < ω
⊢ card (typein (fun x x_1 => x < x_1) (enum (fun x x_1 => x < x_1) o h')) < ℵ₀
[PROOFSTEP]
exact lt_aleph0_iff_fintype.2 ⟨Set.fintypeLTNat _⟩
[GOAL]
c : Cardinal.{u_1}
h : ℵ₀ ≤ c
⊢ c + 1 = c
[PROOFSTEP]
rw [add_comm, ← card_ord c, ← card_one, ← card_add, one_add_of_omega_le]
[GOAL]
c : Cardinal.{u_1}
h : ℵ₀ ≤ c
⊢ ω ≤ ord c
[PROOFSTEP]
rwa [← ord_aleph0, ord_le_ord]
[GOAL]
a b c : Ordinal.{u}
h : IsLimit c
⊢ a < b + c ↔ ∃ c', c' < c ∧ a < b + c'
[PROOFSTEP]
have := IsNormal.bsup_eq.{u, u} (add_isNormal b) h
[GOAL]
a b c : Ordinal.{u}
h : IsLimit c
this : (bsup c fun x x_1 => (fun x x_2 => x + x_2) b x) = (fun x x_1 => x + x_1) b c
⊢ a < b + c ↔ ∃ c', c' < c ∧ a < b + c'
[PROOFSTEP]
dsimp only at this 
[GOAL]
a b c : Ordinal.{u}
h : IsLimit c
this : (bsup c fun x x_1 => b + x) = b + c
⊢ a < b + c ↔ ∃ c', c' < c ∧ a < b + c'
[PROOFSTEP]
rw [← this, lt_bsup, bex_def]
[GOAL]
o : Ordinal.{u_1}
⊢ o < ω ↔ ∃ n, o = ↑n
[PROOFSTEP]
simp_rw [← Cardinal.ord_aleph0, Cardinal.lt_ord, lt_aleph0, card_eq_nat]
[GOAL]
⊢ 1 < ω
[PROOFSTEP]
simpa only [Nat.cast_one] using nat_lt_omega 1
[GOAL]
o : Ordinal.{u_1}
h : o < ω
⊢ succ o < ω
[PROOFSTEP]
let ⟨n, e⟩ := lt_omega.1 h
[GOAL]
o : Ordinal.{u_1}
h : o < ω
n : ℕ
e : o = ↑n
⊢ succ o < ω
[PROOFSTEP]
rw [e]
[GOAL]
o : Ordinal.{u_1}
h : o < ω
n : ℕ
e : o = ↑n
⊢ succ ↑n < ω
[PROOFSTEP]
exact nat_lt_omega (n + 1)
[GOAL]
o : Ordinal.{u_1}
H : ∀ (n : ℕ), ↑n ≤ o
a : Ordinal.{u_1}
h : a < ω
⊢ a < o
[PROOFSTEP]
let ⟨n, e⟩ := lt_omega.1 h
[GOAL]
o : Ordinal.{u_1}
H : ∀ (n : ℕ), ↑n ≤ o
a : Ordinal.{u_1}
h : a < ω
n : ℕ
e : a = ↑n
⊢ a < o
[PROOFSTEP]
rw [e, ← succ_le_iff]
[GOAL]
o : Ordinal.{u_1}
H : ∀ (n : ℕ), ↑n ≤ o
a : Ordinal.{u_1}
h : a < ω
n : ℕ
e : a = ↑n
⊢ succ ↑n ≤ o
[PROOFSTEP]
exact H (n + 1)
[GOAL]
a : Ordinal.{u_1}
⊢ IsLimit a ↔ a ≠ 0 ∧ ω ∣ a
[PROOFSTEP]
refine' ⟨fun l => ⟨l.1, ⟨a / ω, le_antisymm _ (mul_div_le _ _)⟩⟩, fun h => _⟩
[GOAL]
case refine'_1
a : Ordinal.{u_1}
l : IsLimit a
⊢ a ≤ ω * (a / ω)
[PROOFSTEP]
refine' (limit_le l).2 fun x hx => le_of_lt _
[GOAL]
case refine'_1
a : Ordinal.{u_1}
l : IsLimit a
x : Ordinal.{u_1}
hx : x < a
⊢ x < ω * (a / ω)
[PROOFSTEP]
rw [← div_lt omega_ne_zero, ← succ_le_iff, le_div omega_ne_zero, mul_succ, add_le_of_limit omega_isLimit]
[GOAL]
case refine'_1
a : Ordinal.{u_1}
l : IsLimit a
x : Ordinal.{u_1}
hx : x < a
⊢ ∀ (b' : Ordinal.{u_1}), b' < ω → ω * (x / ω) + b' ≤ a
[PROOFSTEP]
intro b hb
[GOAL]
case refine'_1
a : Ordinal.{u_1}
l : IsLimit a
x : Ordinal.{u_1}
hx : x < a
b : Ordinal.{u_1}
hb : b < ω
⊢ ω * (x / ω) + b ≤ a
[PROOFSTEP]
rcases lt_omega.1 hb with ⟨n, rfl⟩
[GOAL]
case refine'_1.intro
a : Ordinal.{u_1}
l : IsLimit a
x : Ordinal.{u_1}
hx : x < a
n : ℕ
hb : ↑n < ω
⊢ ω * (x / ω) + ↑n ≤ a
[PROOFSTEP]
exact (add_le_add_right (mul_div_le _ _) _).trans (lt_sub.1 <| nat_lt_limit (sub_isLimit l hx) _).le
[GOAL]
case refine'_2
a : Ordinal.{u_1}
h : a ≠ 0 ∧ ω ∣ a
⊢ IsLimit a
[PROOFSTEP]
rcases h with ⟨a0, b, rfl⟩
[GOAL]
case refine'_2.intro.intro
b : Ordinal.{u_1}
a0 : ω * b ≠ 0
⊢ IsLimit (ω * b)
[PROOFSTEP]
refine' mul_isLimit_left omega_isLimit (Ordinal.pos_iff_ne_zero.2 <| mt _ a0)
[GOAL]
case refine'_2.intro.intro
b : Ordinal.{u_1}
a0 : ω * b ≠ 0
⊢ b = 0 → ω * b = 0
[PROOFSTEP]
intro e
[GOAL]
case refine'_2.intro.intro
b : Ordinal.{u_1}
a0 : ω * b ≠ 0
e : b = 0
⊢ ω * b = 0
[PROOFSTEP]
simp only [e, mul_zero]
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
l : IsLimit c
IH : ∀ (c' : Ordinal.{u_1}), c' < c → (a + b) * succ c' = a * succ c' + b
c' : Ordinal.{u_1}
h : c' < c
⊢ (a + b) * c' ≤ a * c
[PROOFSTEP]
apply (mul_le_mul_left' (le_succ c') _).trans
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
l : IsLimit c
IH : ∀ (c' : Ordinal.{u_1}), c' < c → (a + b) * succ c' = a * succ c' + b
c' : Ordinal.{u_1}
h : c' < c
⊢ (a + b) * succ c' ≤ a * c
[PROOFSTEP]
rw [IH _ h]
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
l : IsLimit c
IH : ∀ (c' : Ordinal.{u_1}), c' < c → (a + b) * succ c' = a * succ c' + b
c' : Ordinal.{u_1}
h : c' < c
⊢ a * succ c' + b ≤ a * c
[PROOFSTEP]
apply (add_le_add_left _ _).trans
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
l : IsLimit c
IH : ∀ (c' : Ordinal.{u_1}), c' < c → (a + b) * succ c' = a * succ c' + b
c' : Ordinal.{u_1}
h : c' < c
⊢ a * succ c' + ?m.440069 ≤ a * c
[PROOFSTEP]
rw [← mul_succ]
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
l : IsLimit c
IH : ∀ (c' : Ordinal.{u_1}), c' < c → (a + b) * succ c' = a * succ c' + b
c' : Ordinal.{u_1}
h : c' < c
⊢ a * succ (succ c') ≤ a * c
[PROOFSTEP]
exact mul_le_mul_left' (succ_le_of_lt <| l.2 _ h) _
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
l : IsLimit c
IH : ∀ (c' : Ordinal.{u_1}), c' < c → (a + b) * succ c' = a * succ c' + b
c' : Ordinal.{u_1}
h : c' < c
⊢ b ≤ a
[PROOFSTEP]
rw [← ba]
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
l : IsLimit c
IH : ∀ (c' : Ordinal.{u_1}), c' < c → (a + b) * succ c' = a * succ c' + b
c' : Ordinal.{u_1}
h : c' < c
⊢ b ≤ b + a
[PROOFSTEP]
exact le_add_right _ _
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
⊢ (a + b) * succ c = a * succ c + b
[PROOFSTEP]
induction c using limitRecOn with
| H₁ => simp only [succ_zero, mul_one]
| H₂ c IH => rw [mul_succ, IH, ← add_assoc, add_assoc _ b, ba, ← mul_succ]
| H₃ c l IH =>
  -- Porting note: Unused.
      -- have := add_mul_limit_aux ba l IHrw [mul_succ, add_mul_limit_aux ba l IH, mul_succ, add_assoc]
[GOAL]
a b c : Ordinal.{u_1}
ba : b + a = a
⊢ (a + b) * succ c = a * succ c + b
[PROOFSTEP]
induction c using limitRecOn with
| H₁ => simp only [succ_zero, mul_one]
| H₂ c IH => rw [mul_succ, IH, ← add_assoc, add_assoc _ b, ba, ← mul_succ]
| H₃ c l IH =>
  -- Porting note: Unused.
      -- have := add_mul_limit_aux ba l IHrw [mul_succ, add_mul_limit_aux ba l IH, mul_succ, add_assoc]
[GOAL]
case H₁
a b : Ordinal.{u_1}
ba : b + a = a
⊢ (a + b) * succ 0 = a * succ 0 + b
[PROOFSTEP]

| H₁ => simp only [succ_zero, mul_one]
[GOAL]
case H₁
a b : Ordinal.{u_1}
ba : b + a = a
⊢ (a + b) * succ 0 = a * succ 0 + b
[PROOFSTEP]
simp only [succ_zero, mul_one]
[GOAL]
case H₂
a b : Ordinal.{u_1}
ba : b + a = a
c : Ordinal.{u_1}
IH : (a + b) * succ c = a * succ c + b
⊢ (a + b) * succ (succ c) = a * succ (succ c) + b
[PROOFSTEP]

| H₂ c IH => rw [mul_succ, IH, ← add_assoc, add_assoc _ b, ba, ← mul_succ]
[GOAL]
case H₂
a b : Ordinal.{u_1}
ba : b + a = a
c : Ordinal.{u_1}
IH : (a + b) * succ c = a * succ c + b
⊢ (a + b) * succ (succ c) = a * succ (succ c) + b
[PROOFSTEP]
rw [mul_succ, IH, ← add_assoc, add_assoc _ b, ba, ← mul_succ]
[GOAL]
case H₃
a b : Ordinal.{u_1}
ba : b + a = a
c : Ordinal.{u_1}
l : IsLimit c
IH : ∀ (o' : Ordinal.{u_1}), o' < c → (a + b) * succ o' = a * succ o' + b
⊢ (a + b) * succ c = a * succ c + b
[PROOFSTEP]

| H₃ c l IH =>
  -- Porting note: Unused.
      -- have := add_mul_limit_aux ba l IHrw [mul_succ, add_mul_limit_aux ba l IH, mul_succ, add_assoc]
[GOAL]
case H₃
a b : Ordinal.{u_1}
ba : b + a = a
c : Ordinal.{u_1}
l : IsLimit c
IH : ∀ (o' : Ordinal.{u_1}), o' < c → (a + b) * succ o' = a * succ o' + b
⊢ (a + b) * succ c = a * succ c + b
[PROOFSTEP]
rw [mul_succ, add_mul_limit_aux ba l IH, mul_succ, add_assoc]
[GOAL]
a b c : Ordinal.{u_1}
hb : 0 < b
h : ∀ (d : Ordinal.{u_1}), d < b → a + d < c
⊢ a + b ≤ c
[PROOFSTEP]
have H : a + (c - a) = c :=
  Ordinal.add_sub_cancel_of_le
    (by
      rw [← add_zero a]
      exact (h _ hb).le)
[GOAL]
a b c : Ordinal.{u_1}
hb : 0 < b
h : ∀ (d : Ordinal.{u_1}), d < b → a + d < c
⊢ a ≤ c
[PROOFSTEP]
rw [← add_zero a]
[GOAL]
a b c : Ordinal.{u_1}
hb : 0 < b
h : ∀ (d : Ordinal.{u_1}), d < b → a + d < c
⊢ a + 0 ≤ c
[PROOFSTEP]
exact (h _ hb).le
[GOAL]
a b c : Ordinal.{u_1}
hb : 0 < b
h : ∀ (d : Ordinal.{u_1}), d < b → a + d < c
H : a + (c - a) = c
⊢ a + b ≤ c
[PROOFSTEP]
rw [← H]
[GOAL]
a b c : Ordinal.{u_1}
hb : 0 < b
h : ∀ (d : Ordinal.{u_1}), d < b → a + d < c
H : a + (c - a) = c
⊢ a + b ≤ a + (c - a)
[PROOFSTEP]
apply add_le_add_left _ a
[GOAL]
a b c : Ordinal.{u_1}
hb : 0 < b
h : ∀ (d : Ordinal.{u_1}), d < b → a + d < c
H : a + (c - a) = c
⊢ b ≤ c - a
[PROOFSTEP]
by_contra' hb
[GOAL]
a b c : Ordinal.{u_1}
hb✝ : 0 < b
h : ∀ (d : Ordinal.{u_1}), d < b → a + d < c
H : a + (c - a) = c
hb : c - a < b
⊢ False
[PROOFSTEP]
exact (h _ hb).ne H
[GOAL]
f : Ordinal.{u} → Ordinal.{u}
hf : IsNormal f
⊢ Ordinal.sup (f ∘ Nat.cast) = f ω
[PROOFSTEP]
rw [← sup_nat_cast, IsNormal.sup.{0, u, u} hf]
[GOAL]
o : Ordinal.{u_1}
⊢ (sup fun n => o * ↑n) = o * ω
[PROOFSTEP]
rcases eq_zero_or_pos o with (rfl | ho)
[GOAL]
case inl
⊢ (sup fun n => 0 * ↑n) = 0 * ω
[PROOFSTEP]
rw [zero_mul]
[GOAL]
case inl
⊢ (sup fun n => 0 * ↑n) = 0
[PROOFSTEP]
exact sup_eq_zero_iff.2 fun n => zero_mul (n : Ordinal)
[GOAL]
case inr
o : Ordinal.{u_1}
ho : 0 < o
⊢ (sup fun n => o * ↑n) = o * ω
[PROOFSTEP]
exact (mul_isNormal ho).apply_omega
[GOAL]
α : Type u
r : α → α → Prop
a b : α
h : Acc r a
⊢ rank h = sup fun b => succ (rank (_ : Acc r ↑b))
[PROOFSTEP]
change (Acc.intro a fun _ => h.inv).rank = _
[GOAL]
α : Type u
r : α → α → Prop
a b : α
h : Acc r a
⊢ rank (_ : Acc (fun x => r x) a) = sup fun b => succ (rank (_ : Acc r ↑b))
[PROOFSTEP]
rfl
[GOAL]
α : Type u
r : α → α → Prop
a b : α
hb : Acc r b
h : r a b
⊢ succ (rank (_ : Acc r a)) ≤ rank hb
[PROOFSTEP]
rw [hb.rank_eq]
[GOAL]
α : Type u
r : α → α → Prop
a b : α
hb : Acc r b
h : r a b
⊢ succ (rank (_ : Acc r a)) ≤ sup fun b_1 => succ (rank (_ : Acc r ↑b_1))
[PROOFSTEP]
refine' le_trans _ (Ordinal.le_sup _ ⟨a, h⟩)
[GOAL]
α : Type u
r : α → α → Prop
a b : α
hb : Acc r b
h : r a b
⊢ succ (rank (_ : Acc r a)) ≤ succ (rank (_ : Acc r ↑{ val := a, property := h }))
[PROOFSTEP]
rfl
[GOAL]
α : Type u
r : α → α → Prop
a b : α
hwf : WellFounded r
⊢ rank hwf a = sup fun b => succ (rank hwf ↑b)
[PROOFSTEP]
rw [rank, Acc.rank_eq]
[GOAL]
α : Type u
r : α → α → Prop
a b : α
hwf : WellFounded r
⊢ (sup fun b => succ (Acc.rank (_ : Acc r ↑b))) = sup fun b => succ (rank hwf ↑b)
[PROOFSTEP]
rfl
