Theorem: FirstOrder.Language.Term.card_sigma
File: Mathlib/ModelTheory/Encoding.lean

tactic: refine le_antisymm ?_ ?_
state_before: L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ #((n : ℕ) × L.Term (α ⊕ Fin n)) = max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ #((n : ℕ) × L.Term (α ⊕ Fin n)) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)

case refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i) ≤ #((n : ℕ) × L.Term (α ⊕ Fin n))

tactic: rw [mk_sigma]
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ #((n : ℕ) × L.Term (α ⊕ Fin n)) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ (Cardinal.sum fun i => #(L.Term (α ⊕ Fin i))) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)

tactic: refine (sum_le_iSup_lift _).trans ?_
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ (Cardinal.sum fun i => #(L.Term (α ⊕ Fin i))) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ lift.{max u u', 0} #ℕ * ⨆ i, #(L.Term (α ⊕ Fin i)) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)

tactic: rw [mk_nat, lift_aleph0, mul_eq_max_of_aleph0_le_left le_rfl, max_le_iff,
  ciSup_le_iff' (bddAbove_range _)]
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ lift.{max u u', 0} #ℕ * ⨆ i, #(L.Term (α ⊕ Fin i)) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ ℵ₀ ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i) ∧ ∀ (i : ℕ), #(L.Term (α ⊕ Fin i)) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)

case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ ⨆ i, #(L.Term (α ⊕ Fin i)) ≠ 0

tactic: refine ⟨le_max_left _ _, fun i => card_le.trans ?_⟩
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ ℵ₀ ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i) ∧ ∀ (i : ℕ), #(L.Term (α ⊕ Fin i)) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i : ℕ
⊢ max ℵ₀ #((α ⊕ Fin i) ⊕ (i : ℕ) × L.Functions i) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)

tactic: refine max_le (le_max_left _ _) ?_
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i : ℕ
⊢ max ℵ₀ #((α ⊕ Fin i) ⊕ (i : ℕ) × L.Functions i) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i : ℕ
⊢ #((α ⊕ Fin i) ⊕ (i : ℕ) × L.Functions i) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)

tactic: rw [← add_eq_max le_rfl, mk_sum, mk_sum, mk_sum, add_comm (Cardinal.lift #α), lift_add,
  add_assoc, lift_lift, lift_lift, mk_fin, lift_natCast]
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i : ℕ
⊢ #((α ⊕ Fin i) ⊕ (i : ℕ) × L.Functions i) ≤ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i)
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i : ℕ
⊢ ↑i + (lift.{u, u'} #α + lift.{u', u} #((i : ℕ) × L.Functions i)) ≤
    ℵ₀ + (lift.{u, u'} #α + lift.{u', u} #((i : ℕ) × L.Functions i))

tactic: exact add_le_add_right (nat_lt_aleph0 _).le _
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i : ℕ
⊢ ↑i + (lift.{u, u'} #α + lift.{u', u} #((i : ℕ) × L.Functions i)) ≤
    ℵ₀ + (lift.{u, u'} #α + lift.{u', u} #((i : ℕ) × L.Functions i))
state_after: no goals

tactic: rw [← one_le_iff_ne_zero]
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ ⨆ i, #(L.Term (α ⊕ Fin i)) ≠ 0
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ 1 ≤ ⨆ i, #(L.Term (α ⊕ Fin i))

tactic: refine _root_.trans ?_ (le_ciSup (bddAbove_range _) 1)
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ 1 ≤ ⨆ i, #(L.Term (α ⊕ Fin i))
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ 1 ≤ #(L.Term (α ⊕ Fin 1))

tactic: rw [one_le_iff_ne_zero, mk_ne_zero_iff]
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ 1 ≤ #(L.Term (α ⊕ Fin 1))
state_after: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ Nonempty (L.Term (α ⊕ Fin 1))

tactic: exact ⟨var (Sum.inr 0)⟩
state_before: case refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ Nonempty (L.Term (α ⊕ Fin 1))
state_after: no goals

tactic: rw [max_le_iff, ← infinite_iff]
state_before: case refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ max ℵ₀ #(α ⊕ (i : ℕ) × L.Functions i) ≤ #((n : ℕ) × L.Term (α ⊕ Fin n))
state_after: case refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ Infinite ((n : ℕ) × L.Term (α ⊕ Fin n)) ∧ #(α ⊕ (i : ℕ) × L.Functions i) ≤ #((n : ℕ) × L.Term (α ⊕ Fin n))

tactic: refine ⟨Infinite.of_injective (fun i => ⟨i + 1, var (Sum.inr i)⟩) fun i j ij => ?_, ?_⟩
state_before: case refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ Infinite ((n : ℕ) × L.Term (α ⊕ Fin n)) ∧ #(α ⊕ (i : ℕ) × L.Functions i) ≤ #((n : ℕ) × L.Term (α ⊕ Fin n))
state_after: case refine_2.refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i j : ℕ
ij : (fun i => ⟨i + 1, var (Sum.inr ↑i)⟩) i = (fun i => ⟨i + 1, var (Sum.inr ↑i)⟩) j
⊢ i = j

case refine_2.refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ #(α ⊕ (i : ℕ) × L.Functions i) ≤ #((n : ℕ) × L.Term (α ⊕ Fin n))

tactic: cases ij
state_before: case refine_2.refine_1
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i j : ℕ
ij : (fun i => ⟨i + 1, var (Sum.inr ↑i)⟩) i = (fun i => ⟨i + 1, var (Sum.inr ↑i)⟩) j
⊢ i = j
state_after: case refine_2.refine_1.refl
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i : ℕ
⊢ i = i

tactic: rfl
state_before: case refine_2.refine_1.refl
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
i : ℕ
⊢ i = i
state_after: no goals

tactic: rw [Cardinal.le_def]
state_before: case refine_2.refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ #(α ⊕ (i : ℕ) × L.Functions i) ≤ #((n : ℕ) × L.Term (α ⊕ Fin n))
state_after: case refine_2.refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ Nonempty (α ⊕ (i : ℕ) × L.Functions i ↪ (n : ℕ) × L.Term (α ⊕ Fin n))

tactic: refine ⟨⟨Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩)
  fun F => ⟨1, func F.2 fun _ => var (Sum.inr 0)⟩, ?_⟩⟩
state_before: case refine_2.refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ Nonempty (α ⊕ (i : ℕ) × L.Functions i ↪ (n : ℕ) × L.Term (α ⊕ Fin n))
state_after: case refine_2.refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ Function.Injective (Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩)

tactic: rintro (a | a) (b | b) h
state_before: case refine_2.refine_2
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
⊢ Function.Injective (Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩)
state_after: case refine_2.refine_2.inl.inl
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a b : α
h :
  Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inl a) =
    Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inl b)
⊢ Sum.inl a = Sum.inl b

case refine_2.refine_2.inl.inr
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a : α
b : (i : ℕ) × L.Functions i
h :
  Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inl a) =
    Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inr b)
⊢ Sum.inl a = Sum.inr b

case refine_2.refine_2.inr.inl
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a : (i : ℕ) × L.Functions i
b : α
h :
  Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inr a) =
    Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inl b)
⊢ Sum.inr a = Sum.inl b

case refine_2.refine_2.inr.inr
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a b : (i : ℕ) × L.Functions i
h :
  Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inr a) =
    Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inr b)
⊢ Sum.inr a = Sum.inr b

tactic: simp only [Sum.elim_inl, Sigma.mk.inj_iff, heq_eq_eq, var.injEq, Sum.inl.injEq, true_and]
  at h
state_before: case refine_2.refine_2.inl.inl
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a b : α
h :
  Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inl a) =
    Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inl b)
⊢ Sum.inl a = Sum.inl b
state_after: case refine_2.refine_2.inl.inl
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a b : α
h : a = b
⊢ Sum.inl a = Sum.inl b

tactic: rw [h]
state_before: case refine_2.refine_2.inl.inl
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a b : α
h : a = b
⊢ Sum.inl a = Sum.inl b
state_after: no goals

tactic: simp only [Sum.elim_inl, Sum.elim_inr, Sigma.mk.inj_iff, false_and] at h
state_before: case refine_2.refine_2.inl.inr
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a : α
b : (i : ℕ) × L.Functions i
h :
  Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inl a) =
    Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inr b)
⊢ Sum.inl a = Sum.inr b
state_after: no goals

tactic: simp only [Sum.elim_inr, Sum.elim_inl, Sigma.mk.inj_iff, false_and] at h
state_before: case refine_2.refine_2.inr.inl
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a : (i : ℕ) × L.Functions i
b : α
h :
  Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inr a) =
    Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inl b)
⊢ Sum.inr a = Sum.inl b
state_after: no goals

tactic: simp only [Sum.elim_inr, Sigma.mk.inj_iff, heq_eq_eq, func.injEq, true_and] at h
state_before: case refine_2.refine_2.inr.inr
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a b : (i : ℕ) × L.Functions i
h :
  Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inr a) =
    Sum.elim (fun i => ⟨0, var (Sum.inl i)⟩) (fun F => ⟨1, func F.snd fun x => var (Sum.inr 0)⟩) (Sum.inr b)
⊢ Sum.inr a = Sum.inr b
state_after: case refine_2.refine_2.inr.inr
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a b : (i : ℕ) × L.Functions i
h : a.fst = b.fst ∧ HEq a.snd b.snd ∧ HEq (fun x => var (Sum.inr 0)) fun x => var (Sum.inr 0)
⊢ Sum.inr a = Sum.inr b

tactic: rw [Sigma.ext_iff.2 ⟨h.1, h.2.1⟩]
state_before: case refine_2.refine_2.inr.inr
L : Language
M : Type w
N : Type u_1
P : Type u_2
inst✝² : L.Structure M
inst✝¹ : L.Structure N
inst✝ : L.Structure P
α : Type u'
β : Type v'
a b : (i : ℕ) × L.Functions i
h : a.fst = b.fst ∧ HEq a.snd b.snd ∧ HEq (fun x => var (Sum.inr 0)) fun x => var (Sum.inr 0)
⊢ Sum.inr a = Sum.inr b
state_after: no goals