Theorem: Function.Injective.dite
File: Mathlib/Logic/Function/Basic.lean

tactic: dsimp only at h
state_before: α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (fun x => if h : p x then f ⟨x, h⟩ else f' ⟨x, h⟩) x₁ = (fun x => if h : p x then f ⟨x, h⟩ else f' ⟨x, h⟩) x₂
⊢ x₁ = x₂
state_after: α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
⊢ x₁ = x₂

tactic: by_cases h₁ : p x₁ <;> by_cases h₂ : p x₂
state_before: α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
⊢ x₁ = x₂
state_after: case pos
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
h₁ : p x₁
h₂ : p x₂
⊢ x₁ = x₂

case neg
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
h₁ : p x₁
h₂ : ¬p x₂
⊢ x₁ = x₂

case pos
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
h₁ : ¬p x₁
h₂ : p x₂
⊢ x₁ = x₂

case neg
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
h₁ : ¬p x₁
h₂ : ¬p x₂
⊢ x₁ = x₂

tactic: rw [dif_pos h₁, dif_pos h₂] at h
state_before: case pos
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
h₁ : p x₁
h₂ : p x₂
⊢ x₁ = x₂
state_after: case pos
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h₁ : p x₁
h₂ : p x₂
h : f ⟨x₁, h₁⟩ = f ⟨x₂, h₂⟩
⊢ x₁ = x₂

tactic: injection (hf h)
state_before: case pos
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h₁ : p x₁
h₂ : p x₂
h : f ⟨x₁, h₁⟩ = f ⟨x₂, h₂⟩
⊢ x₁ = x₂
state_after: no goals

tactic: rw [dif_pos h₁, dif_neg h₂] at h
state_before: case neg
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
h₁ : p x₁
h₂ : ¬p x₂
⊢ x₁ = x₂
state_after: case neg
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h₁ : p x₁
h₂ : ¬p x₂
h : f ⟨x₁, h₁⟩ = f' ⟨x₂, h₂⟩
⊢ x₁ = x₂

tactic: exact (im_disj h).elim
state_before: case neg
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h₁ : p x₁
h₂ : ¬p x₂
h : f ⟨x₁, h₁⟩ = f' ⟨x₂, h₂⟩
⊢ x₁ = x₂
state_after: no goals

tactic: rw [dif_neg h₁, dif_pos h₂] at h
state_before: case pos
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
h₁ : ¬p x₁
h₂ : p x₂
⊢ x₁ = x₂
state_after: case pos
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h₁ : ¬p x₁
h₂ : p x₂
h : f' ⟨x₁, h₁⟩ = f ⟨x₂, h₂⟩
⊢ x₁ = x₂

tactic: exact (im_disj h.symm).elim
state_before: case pos
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h₁ : ¬p x₁
h₂ : p x₂
h : f' ⟨x₁, h₁⟩ = f ⟨x₂, h₂⟩
⊢ x₁ = x₂
state_after: no goals

tactic: rw [dif_neg h₁, dif_neg h₂] at h
state_before: case neg
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h : (if h : p x₁ then f ⟨x₁, h⟩ else f' ⟨x₁, h⟩) = if h : p x₂ then f ⟨x₂, h⟩ else f' ⟨x₂, h⟩
h₁ : ¬p x₁
h₂ : ¬p x₂
⊢ x₁ = x₂
state_after: case neg
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h₁ : ¬p x₁
h₂ : ¬p x₂
h : f' ⟨x₁, h₁⟩ = f' ⟨x₂, h₂⟩
⊢ x₁ = x₂

tactic: injection (hf' h)
state_before: case neg
α : Sort u_1
β : Sort u_2
γ : Sort u_3
f✝ : α → β
p : α → Prop
inst✝ : DecidablePred p
f : { a // p a } → β
f' : { a // ¬p a } → β
hf : Injective f
hf' : Injective f'
im_disj : ∀ {x x' : α} {hx : p x} {hx' : ¬p x'}, f ⟨x, hx⟩ ≠ f' ⟨x', hx'⟩
x₁ x₂ : α
h₁ : ¬p x₁
h₂ : ¬p x₂
h : f' ⟨x₁, h₁⟩ = f' ⟨x₂, h₂⟩
⊢ x₁ = x₂
state_after: no goals