Theorem: dite_comp_equiv_update
File: Mathlib/Logic/Equiv/Set.lean

tactic: ext i
state_before: α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
⊢ (fun i => if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x
state_after: case h
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
⊢ (if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x i

tactic: by_cases h : p i
state_before: case h
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
⊢ (if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x i
state_after: case pos
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : p i
⊢ (if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x i

case neg
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : ¬p i
⊢ (if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x i

tactic: rw [dif_pos h, Function.update_apply_equiv_apply, Equiv.symm_symm,
  Function.update_apply, Function.update_apply, dif_pos h]
state_before: case pos
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : p i
⊢ (if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x i
state_after: case pos
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : p i
⊢ (if ⟨i, h⟩ = e j then x else (v ∘ ⇑e.symm) ⟨i, h⟩) = if i = ↑(e j) then x else v (e.symm ⟨i, h⟩)

tactic: have h_coe : (⟨i, h⟩ : Subtype p) = e j ↔ i = e j :=
  Subtype.ext_iff.trans (by rw [Subtype.coe_mk])
state_before: case pos
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : p i
⊢ (if ⟨i, h⟩ = e j then x else (v ∘ ⇑e.symm) ⟨i, h⟩) = if i = ↑(e j) then x else v (e.symm ⟨i, h⟩)
state_after: case pos
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : p i
h_coe : ⟨i, h⟩ = e j ↔ i = ↑(e j)
⊢ (if ⟨i, h⟩ = e j then x else (v ∘ ⇑e.symm) ⟨i, h⟩) = if i = ↑(e j) then x else v (e.symm ⟨i, h⟩)

tactic: simp [h_coe]
state_before: case pos
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : p i
h_coe : ⟨i, h⟩ = e j ↔ i = ↑(e j)
⊢ (if ⟨i, h⟩ = e j then x else (v ∘ ⇑e.symm) ⟨i, h⟩) = if i = ↑(e j) then x else v (e.symm ⟨i, h⟩)
state_after: no goals

tactic: rw [Subtype.coe_mk]
state_before: α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : p i
⊢ ↑⟨i, h⟩ = ↑(e j) ↔ i = ↑(e j)
state_after: no goals

tactic: have : i ≠ e j := by
  contrapose! h
  have : p (e j : α) := (e j).2
  rwa [← h] at this
state_before: case neg
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : ¬p i
⊢ (if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x i
state_after: case neg
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : ¬p i
this : i ≠ ↑(e j)
⊢ (if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x i

tactic: simp [h, this]
state_before: case neg
α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : ¬p i
this : i ≠ ↑(e j)
⊢ (if h : p i then update v j x (e.symm ⟨i, h⟩) else w i) =
    update (fun i => if h : p i then v (e.symm ⟨i, h⟩) else w i) (↑(e j)) x i
state_after: no goals

tactic: contrapose! h
state_before: α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : ¬p i
⊢ i ≠ ↑(e j)
state_after: α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : i = ↑(e j)
⊢ p i

tactic: have : p (e j : α) := (e j).2
state_before: α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : i = ↑(e j)
⊢ p i
state_after: α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : i = ↑(e j)
this : p ↑(e j)
⊢ p i

tactic: rwa [← h] at this
state_before: α✝ : Sort u
β✝ : Sort v
γ✝ : Sort w
α : Type u_1
β : Sort u_2
γ : Sort u_3
p : α → Prop
e : β ≃ Subtype p
v : β → γ
w : α → γ
j : β
x : γ
inst✝² : DecidableEq β
inst✝¹ : DecidableEq α
inst✝ : (j : α) → Decidable (p j)
i : α
h : i = ↑(e j)
this : p ↑(e j)
⊢ p i
state_after: no goals