Theorem: Cardinal.ciSup_mul
File: Mathlib/SetTheory/Cardinal/Ordinal.lean

tactic: cases isEmpty_or_nonempty ι
state_before: ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
⊢ (⨆ i, f i) * c = ⨆ i, f i * c
state_after: case inl
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : IsEmpty ι
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

case inr
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

tactic: obtain rfl | h0 := eq_or_ne c 0
state_before: case inr
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
⊢ (⨆ i, f i) * c = ⨆ i, f i * c
state_after: case inr.inl
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
h✝ : Nonempty ι
⊢ (⨆ i, f i) * 0 = ⨆ i, f i * 0

case inr.inr
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

tactic: by_cases hf : BddAbove (range f)
state_before: case inr.inr
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
⊢ (⨆ i, f i) * c = ⨆ i, f i * c
state_after: case pos
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

case neg
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : ¬BddAbove (range f)
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

tactic: swap
state_before: case pos
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

case neg
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : ¬BddAbove (range f)
⊢ (⨆ i, f i) * c = ⨆ i, f i * c
state_after: case neg
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : ¬BddAbove (range f)
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

case pos
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

tactic: have : ∀ i, f i * c ≤ (⨆ i, f i) * c := fun i ↦ mul_le_mul_right' (le_ciSup hf i) c
state_before: case pos
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
⊢ (⨆ i, f i) * c = ⨆ i, f i * c
state_after: case pos
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
⊢ (⨆ i, f i) * c = ⨆ i, f i * c

tactic: refine le_antisymm ?_ (ciSup_le' this)
state_before: case pos
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
⊢ (⨆ i, f i) * c = ⨆ i, f i * c
state_after: case pos
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
⊢ (⨆ i, f i) * c ≤ ⨆ i, f i * c

tactic: obtain hs | hs := lt_or_le (⨆ i, f i) ℵ₀
state_before: case pos
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
⊢ (⨆ i, f i) * c ≤ ⨆ i, f i * c
state_after: case pos.inl
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ⨆ i, f i < ℵ₀
⊢ (⨆ i, f i) * c ≤ ⨆ i, f i * c

case pos.inr
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ℵ₀ ≤ ⨆ i, f i
⊢ (⨆ i, f i) * c ≤ ⨆ i, f i * c

tactic: rw [mul_eq_max_of_aleph0_le_left hs h0, max_le_iff]
state_before: case pos.inr
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ℵ₀ ≤ ⨆ i, f i
⊢ (⨆ i, f i) * c ≤ ⨆ i, f i * c
state_after: case pos.inr
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ℵ₀ ≤ ⨆ i, f i
⊢ ⨆ i, f i ≤ ⨆ i, f i * c ∧ c ≤ ⨆ i, f i * c

tactic: obtain ⟨i, hi⟩ := exists_lt_of_lt_ciSup' (one_lt_aleph0.trans_le hs)
state_before: case pos.inr
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ℵ₀ ≤ ⨆ i, f i
⊢ ⨆ i, f i ≤ ⨆ i, f i * c ∧ c ≤ ⨆ i, f i * c
state_after: case pos.inr.intro
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ℵ₀ ≤ ⨆ i, f i
i : ι
hi : 1 < f i
⊢ ⨆ i, f i ≤ ⨆ i, f i * c ∧ c ≤ ⨆ i, f i * c

tactic: exact ⟨ciSup_mono bdd fun i ↦ le_mul_right h0,
  (le_mul_left (zero_lt_one.trans hi).ne').trans (le_ciSup bdd i)⟩
state_before: case pos.inr.intro
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ℵ₀ ≤ ⨆ i, f i
i : ι
hi : 1 < f i
⊢ ⨆ i, f i ≤ ⨆ i, f i * c ∧ c ≤ ⨆ i, f i * c
state_after: no goals

tactic: simp
state_before: case inl
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : IsEmpty ι
⊢ (⨆ i, f i) * c = ⨆ i, f i * c
state_after: no goals

tactic: simp
state_before: case inr.inl
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
h✝ : Nonempty ι
⊢ (⨆ i, f i) * 0 = ⨆ i, f i * 0
state_after: no goals

tactic: simp [iSup, csSup_of_not_bddAbove, hf, hfc]
state_before: case neg
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : ¬BddAbove (range f)
hfc : ¬BddAbove (range fun x => f x * c)
⊢ (⨆ i, f i) * c = ⨆ i, f i * c
state_after: no goals

tactic: obtain ⟨i, hi⟩ := exists_eq_of_iSup_eq_of_not_isLimit
  f hf _ (fun h ↦ hs.not_le h.aleph0_le) rfl
state_before: case pos.inl
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ⨆ i, f i < ℵ₀
⊢ (⨆ i, f i) * c ≤ ⨆ i, f i * c
state_after: case pos.inl.intro
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ⨆ i, f i < ℵ₀
i : ι
hi : f i = ⨆ i, f i
⊢ (⨆ i, f i) * c ≤ ⨆ i, f i * c

tactic: exact hi ▸ le_ciSup bdd i
state_before: case pos.inl.intro
ι : Type u
ι' : Type w
f : ι → Cardinal.{v}
c : Cardinal.{v}
h✝ : Nonempty ι
h0 : c ≠ 0
hf : BddAbove (range f)
this : ∀ (i : ι), f i * c ≤ (⨆ i, f i) * c
bdd : BddAbove (range fun x => f x * c)
hs : ⨆ i, f i < ℵ₀
i : ι
hi : f i = ⨆ i, f i
⊢ (⨆ i, f i) * c ≤ ⨆ i, f i * c
state_after: no goals