File: Mathlib/SetTheory/Ordinal/Principal.lean

full_name: Ordinal.Principal
code: /-- An ordinal `o` is said to be principal or indecomposable under an operation when the set of
ordinals less than it is closed under that operation. In standard mathematical usage, this term is
almost exclusively used for additive and multiplicative principal ordinals.

For simplicity, we break usual convention and regard 0 as principal. -/
def Principal (op : Ordinal → Ordinal → Ordinal) (o : Ordinal) : Prop 
goal: Prop

full_name: Ordinal.principal_iff_principal_swap
code: theorem principal_iff_principal_swap {op : Ordinal → Ordinal → Ordinal} {o : Ordinal} :
    Principal op o ↔ Principal (Function.swap op) o 
goal: Ordinal.Principal op o ↔ Ordinal.Principal (Function.swap op) o

full_name: Ordinal.principal_zero
code: theorem principal_zero {op : Ordinal → Ordinal → Ordinal} : Principal op 0 
goal: Ordinal.Principal op 0

full_name: Ordinal.principal_one_iff
code: @[simp]
theorem principal_one_iff {op : Ordinal → Ordinal → Ordinal} : Principal op 1 ↔ op 0 0 = 0 
goal: Ordinal.Principal op 1 ↔ op 0 0 = 0

full_name: Ordinal.Principal.iterate_lt
code: theorem Principal.iterate_lt {op : Ordinal → Ordinal → Ordinal} {a o : Ordinal} (hao : a < o)
    (ho : Principal op o) (n : ℕ) : (op a)^[n] a < o 
goal: (op a)^[n] a < o

full_name: Ordinal.op_eq_self_of_principal
code: theorem op_eq_self_of_principal {op : Ordinal → Ordinal → Ordinal} {a o : Ordinal.{u}} (hao : a < o)
    (H : IsNormal (op a)) (ho : Principal op o) (ho' : IsLimit o) : op a o = o 
goal: op a o = o

full_name: Ordinal.nfp_le_of_principal
code: theorem nfp_le_of_principal {op : Ordinal → Ordinal → Ordinal} {a o : Ordinal} (hao : a < o)
    (ho : Principal op o) : nfp (op a) a ≤ o 
goal: Ordinal.nfp (op a) a ≤ o

full_name: Ordinal.principal_nfp_blsub₂
code: theorem principal_nfp_blsub₂ (op : Ordinal → Ordinal → Ordinal) (o : Ordinal) :
    Principal op (nfp (fun o' => blsub₂.{u, u, u} o' o' (@fun a _ b _ => op a b)) o) 
goal: Ordinal.Principal op (Ordinal.nfp (fun o' => o'.blsub₂ o' fun a x b x => op a b) o)

full_name: Ordinal.unbounded_principal
code: theorem unbounded_principal (op : Ordinal → Ordinal → Ordinal) :
    Set.Unbounded (· < ·) { o | Principal op o } 
goal: Set.Unbounded (fun x x_1 => x < x_1) {o | Ordinal.Principal op o}

full_name: Ordinal.principal_add_one
code: theorem principal_add_one : Principal (· + ·) 1 
goal: Ordinal.Principal (fun x x_1 => x + x_1) 1

full_name: Ordinal.principal_add_of_le_one
code: theorem principal_add_of_le_one {o : Ordinal} (ho : o ≤ 1) : Principal (· + ·) o 
goal: Ordinal.Principal (fun x x_1 => x + x_1) o

full_name: Ordinal.principal_add_isLimit
code: theorem principal_add_isLimit {o : Ordinal} (ho₁ : 1 < o) (ho : Principal (· + ·) o) :
    o.IsLimit 
goal: o.IsLimit

full_name: Ordinal.principal_add_iff_add_left_eq_self
code: theorem principal_add_iff_add_left_eq_self {o : Ordinal} :
    Principal (· + ·) o ↔ ∀ a < o, a + o = o 
goal: Ordinal.Principal (fun x x_1 => x + x_1) o ↔ ∀ a < o, a + o = o

full_name: Ordinal.exists_lt_add_of_not_principal_add
code: theorem exists_lt_add_of_not_principal_add {a} (ha : ¬Principal (· + ·) a) :
    ∃ b c, b < a ∧ c < a ∧ b + c = a 
goal: ∃ b c, b < a ∧ c < a ∧ b + c = a

full_name: Ordinal.principal_add_iff_add_lt_ne_self
code: theorem principal_add_iff_add_lt_ne_self {a} :
    Principal (· + ·) a ↔ ∀ ⦃b c⦄, b < a → c < a → b + c ≠ a 
goal: Ordinal.Principal (fun x x_1 => x + x_1) a ↔ ∀ ⦃b c : Ordinal.{u_1}⦄, b < a → c < a → b + c ≠ a

full_name: Ordinal.add_omega
code: theorem add_omega {a : Ordinal} (h : a < omega) : a + omega = omega 
goal: a + Ordinal.omega = Ordinal.omega

full_name: Ordinal.principal_add_omega
code: theorem principal_add_omega : Principal (· + ·) omega 
goal: Ordinal.Principal (fun x x_1 => x + x_1) Ordinal.omega

full_name: Ordinal.add_omega_opow
code: theorem add_omega_opow {a b : Ordinal} (h : a < (omega^b)) : a + (omega^b) = (omega^b) 
goal: a + Ordinal.omega ^ b = Ordinal.omega ^ b

full_name: Ordinal.principal_add_omega_opow
code: theorem principal_add_omega_opow (o : Ordinal) : Principal (· + ·) (omega^o) 
goal: Ordinal.Principal (fun x x_1 => x + x_1) (Ordinal.omega ^ o)

full_name: Ordinal.principal_add_iff_zero_or_omega_opow
code: /-- The main characterization theorem for additive principal ordinals. -/
theorem principal_add_iff_zero_or_omega_opow {o : Ordinal} :
    Principal (· + ·) o ↔ o = 0 ∨ ∃ a : Ordinal, o = (omega^a) 
goal: Ordinal.Principal (fun x x_1 => x + x_1) o ↔ o = 0 ∨ ∃ a, o = Ordinal.omega ^ a

full_name: Ordinal.opow_principal_add_of_principal_add
code: theorem opow_principal_add_of_principal_add {a} (ha : Principal (· + ·) a) (b : Ordinal) :
    Principal (· + ·) (a^b) 
goal: Ordinal.Principal (fun x x_1 => x + x_1) (a ^ b)

full_name: Ordinal.add_absorp
code: theorem add_absorp {a b c : Ordinal} (h₁ : a < (omega^b)) (h₂ : (omega^b) ≤ c) : a + c = c 
goal: a + c = c

full_name: Ordinal.mul_principal_add_is_principal_add
code: theorem mul_principal_add_is_principal_add (a : Ordinal.{u}) {b : Ordinal.{u}} (hb₁ : b ≠ 1)
    (hb : Principal (· + ·) b) : Principal (· + ·) (a * b) 
goal: Ordinal.Principal (fun x x_1 => x + x_1) (a * b)

full_name: Ordinal.principal_mul_one
code: theorem principal_mul_one : Principal (· * ·) 1 
goal: Ordinal.Principal (fun x x_1 => x * x_1) 1

full_name: Ordinal.principal_mul_two
code: theorem principal_mul_two : Principal (· * ·) 2 
goal: Ordinal.Principal (fun x x_1 => x * x_1) 2

full_name: Ordinal.principal_mul_of_le_two
code: theorem principal_mul_of_le_two {o : Ordinal} (ho : o ≤ 2) : Principal (· * ·) o 
goal: Ordinal.Principal (fun x x_1 => x * x_1) o

full_name: Ordinal.principal_add_of_principal_mul
code: theorem principal_add_of_principal_mul {o : Ordinal} (ho : Principal (· * ·) o) (ho₂ : o ≠ 2) :
    Principal (· + ·) o 
goal: Ordinal.Principal (fun x x_1 => x + x_1) o

full_name: Ordinal.principal_mul_isLimit
code: theorem principal_mul_isLimit {o : Ordinal.{u}} (ho₂ : 2 < o) (ho : Principal (· * ·) o) :
    o.IsLimit 
goal: o.IsLimit

full_name: Ordinal.principal_mul_iff_mul_left_eq
code: theorem principal_mul_iff_mul_left_eq {o : Ordinal} :
    Principal (· * ·) o ↔ ∀ a, 0 < a → a < o → a * o = o 
goal: Ordinal.Principal (fun x x_1 => x * x_1) o ↔ ∀ (a : Ordinal.{u_1}), 0 < a → a < o → a * o = o

full_name: Ordinal.principal_mul_omega
code: theorem principal_mul_omega : Principal (· * ·) omega 
goal: Ordinal.Principal (fun x x_1 => x * x_1) Ordinal.omega

full_name: Ordinal.mul_omega
code: theorem mul_omega {a : Ordinal} (a0 : 0 < a) (ha : a < omega) : a * omega = omega 
goal: a * Ordinal.omega = Ordinal.omega

full_name: Ordinal.mul_lt_omega_opow
code: theorem mul_lt_omega_opow {a b c : Ordinal} (c0 : 0 < c) (ha : a < (omega^c)) (hb : b < omega) :
    a * b < (omega^c) 
goal: a * b < Ordinal.omega ^ c

full_name: Ordinal.mul_omega_opow_opow
code: theorem mul_omega_opow_opow {a b : Ordinal} (a0 : 0 < a) (h : a < (omega^omega^b)) :
    a * (omega^omega^b) = (omega^omega^b) 
goal: a * Ordinal.omega ^ Ordinal.omega ^ b = Ordinal.omega ^ Ordinal.omega ^ b

full_name: Ordinal.principal_mul_omega_opow_opow
code: theorem principal_mul_omega_opow_opow (o : Ordinal) : Principal (· * ·) (omega^omega^o) 
goal: Ordinal.Principal (fun x x_1 => x * x_1) (Ordinal.omega ^ Ordinal.omega ^ o)

full_name: Ordinal.principal_add_of_principal_mul_opow
code: theorem principal_add_of_principal_mul_opow {o b : Ordinal} (hb : 1 < b)
    (ho : Principal (· * ·) (b^o)) : Principal (· + ·) o 
goal: Ordinal.Principal (fun x x_1 => x + x_1) o

full_name: Ordinal.principal_mul_iff_le_two_or_omega_opow_opow
code: /-- The main characterization theorem for multiplicative principal ordinals. -/
theorem principal_mul_iff_le_two_or_omega_opow_opow {o : Ordinal} :
    Principal (· * ·) o ↔ o ≤ 2 ∨ ∃ a : Ordinal, o = (omega^omega^a) 
goal: Ordinal.Principal (fun x x_1 => x * x_1) o ↔ o ≤ 2 ∨ ∃ a, o = Ordinal.omega ^ Ordinal.omega ^ a

full_name: Ordinal.mul_omega_dvd
code: theorem mul_omega_dvd {a : Ordinal} (a0 : 0 < a) (ha : a < omega) : ∀ {b}, omega ∣ b → a * b = b
  
goal: Ordinal.omega ∣ b → a * b = b

full_name: Ordinal.mul_eq_opow_log_succ
code: theorem mul_eq_opow_log_succ {a b : Ordinal.{u}} (ha : a ≠ 0) (hb : Principal (· * ·) b)
    (hb₂ : 2 < b) : a * b = (b^succ (log b a)) 
goal: a * b = b ^ Order.succ (Ordinal.log b a)

full_name: Ordinal.principal_opow_omega
code: theorem principal_opow_omega : Principal (·^·) omega 
goal: Ordinal.Principal (fun x x_1 => x ^ x_1) Ordinal.omega

full_name: Ordinal.opow_omega
code: theorem opow_omega {a : Ordinal} (a1 : 1 < a) (h : a < omega) : (a^omega) = omega 
goal: a ^ Ordinal.omega = Ordinal.omega