Theorem: Pi.isAtom_iff_eq_single
File: Mathlib/Order/Atoms.lean

tactic: constructor
state_before: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ IsAtom f ↔ ∃ i a, IsAtom a ∧ f = Function.update ⊥ i a
state_after: case mp
ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ IsAtom f → ∃ i a, IsAtom a ∧ f = Function.update ⊥ i a

case mpr
ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ (∃ i a, IsAtom a ∧ f = Function.update ⊥ i a) → IsAtom f

tactic: case mp =>
  intro h
  have ⟨i, h, hbot⟩ := isAtom_iff.1 h
  refine ⟨_, _, h, funext fun j => if hij : j = i then hij ▸ by simp else ?_⟩
  rw [Function.update_noteq hij, hbot _ hij, bot_apply]
state_before: case mp
ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ IsAtom f → ∃ i a, IsAtom a ∧ f = Function.update ⊥ i a

case mpr
ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ (∃ i a, IsAtom a ∧ f = Function.update ⊥ i a) → IsAtom f
state_after: case mpr
ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ (∃ i a, IsAtom a ∧ f = Function.update ⊥ i a) → IsAtom f

tactic: case mpr =>
  rintro ⟨i, a, h, rfl⟩
  exact isAtom_single h
state_before: case mpr
ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ (∃ i a, IsAtom a ∧ f = Function.update ⊥ i a) → IsAtom f
state_after: no goals

tactic: intro h
state_before: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ IsAtom f → ∃ i a, IsAtom a ∧ f = Function.update ⊥ i a
state_after: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
h : IsAtom f
⊢ ∃ i a, IsAtom a ∧ f = Function.update ⊥ i a

tactic: have ⟨i, h, hbot⟩ := isAtom_iff.1 h
state_before: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
h : IsAtom f
⊢ ∃ i a, IsAtom a ∧ f = Function.update ⊥ i a
state_after: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
h✝ : IsAtom f
i : ι
h : IsAtom (f i)
hbot : ∀ (j : ι), j ≠ i → f j = ⊥
⊢ ∃ i a, IsAtom a ∧ f = Function.update ⊥ i a

tactic: refine ⟨_, _, h, funext fun j => if hij : j = i then hij ▸ by simp else ?_⟩
state_before: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
h✝ : IsAtom f
i : ι
h : IsAtom (f i)
hbot : ∀ (j : ι), j ≠ i → f j = ⊥
⊢ ∃ i a, IsAtom a ∧ f = Function.update ⊥ i a
state_after: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
h✝ : IsAtom f
i : ι
h : IsAtom (f i)
hbot : ∀ (j : ι), j ≠ i → f j = ⊥
j : ι
hij : ¬j = i
⊢ f j = Function.update ⊥ i (f i) j

tactic: rw [Function.update_noteq hij, hbot _ hij, bot_apply]
state_before: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
h✝ : IsAtom f
i : ι
h : IsAtom (f i)
hbot : ∀ (j : ι), j ≠ i → f j = ⊥
j : ι
hij : ¬j = i
⊢ f j = Function.update ⊥ i (f i) j
state_after: no goals

tactic: simp
state_before: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
h✝ : IsAtom f
i : ι
h : IsAtom (f i)
hbot : ∀ (j : ι), j ≠ i → f j = ⊥
j : ι
hij : j = i
⊢ f j = Function.update ⊥ j (f j) j
state_after: no goals

tactic: rintro ⟨i, a, h, rfl⟩
state_before: ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
f : (i : ι) → π i
⊢ (∃ i a, IsAtom a ∧ f = Function.update ⊥ i a) → IsAtom f
state_after: case intro.intro.intro
ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
i : ι
a : π i
h : IsAtom a
⊢ IsAtom (Function.update ⊥ i a)

tactic: exact isAtom_single h
state_before: case intro.intro.intro
ι✝ : Sort u_1
α : Type u_2
β : Type u_3
ι : Type u_4
π : ι → Type u
inst✝² : DecidableEq ι
inst✝¹ : (i : ι) → PartialOrder (π i)
inst✝ : (i : ι) → OrderBot (π i)
i : ι
a : π i
h : IsAtom a
⊢ IsAtom (Function.update ⊥ i a)
state_after: no goals