Theorem: Equiv.Perm.support_extend_domain
File: Mathlib/GroupTheory/Perm/Support.lean

tactic: ext b
state_before: α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
⊢ support (extendDomain g f) = map (asEmbedding f) (support g)

tactic: simp only [exists_prop, Function.Embedding.coeFn_mk, toEmbedding_apply, mem_map, Ne.def,
  Function.Embedding.trans_apply, mem_support]
state_before: case a
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
⊢ b ∈ support (extendDomain g f) ↔ b ∈ map (asEmbedding f) (support g)

tactic: by_cases pb : p b
state_before: case a
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
⊢ ¬↑(extendDomain g f) b = b ↔ ∃ a, ¬↑g a = a ∧ ↑(asEmbedding f) a = b

tactic: rw [extendDomain_apply_subtype _ _ pb]
state_before: case pos
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
⊢ ¬↑(extendDomain g f) b = b ↔ ∃ a, ¬↑g a = a ∧ ↑(asEmbedding f) a = b

tactic: constructor
state_before: case pos
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
⊢ ¬↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b ↔ ∃ a, ¬↑g a = a ∧ ↑(asEmbedding f) a = b

tactic: rintro h
state_before: case pos.mp
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
⊢ ¬↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b → ∃ a, ¬↑g a = a ∧ ↑(asEmbedding f) a = b

tactic: refine' ⟨f.symm ⟨b, pb⟩, _, by simp⟩
state_before: case pos.mp
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
h : ¬↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b
⊢ ∃ a, ¬↑g a = a ∧ ↑(asEmbedding f) a = b

tactic: contrapose! h
state_before: case pos.mp
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
h : ¬↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b
⊢ ¬↑g (↑f.symm { val := b, property := pb }) = ↑f.symm { val := b, property := pb }

tactic: simp [h]
state_before: case pos.mp
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
h : ↑g (↑f.symm { val := b, property := pb }) = ↑f.symm { val := b, property := pb }
⊢ ↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b

tactic: simp
state_before: α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
h : ¬↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b
⊢ ↑(asEmbedding f) (↑f.symm { val := b, property := pb }) = b

tactic: rintro ⟨a, ha, hb⟩
state_before: case pos.mpr
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
⊢ (∃ a, ¬↑g a = a ∧ ↑(asEmbedding f) a = b) → ¬↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b

tactic: contrapose! ha
state_before: case pos.mpr.intro.intro
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
a : α
ha : ¬↑g a = a
hb : ↑(asEmbedding f) a = b
⊢ ¬↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b

tactic: obtain rfl : a = f.symm ⟨b, pb⟩ := by
  rw [eq_symm_apply]
  exact Subtype.coe_injective hb
state_before: case pos.mpr.intro.intro
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
a : α
hb : ↑(asEmbedding f) a = b
ha : ↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b
⊢ ↑g a = a

tactic: rw [eq_symm_apply]
state_before: case pos.mpr.intro.intro
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
ha : ↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b
hb : ↑(asEmbedding f) (↑f.symm { val := b, property := pb }) = b
⊢ ↑g (↑f.symm { val := b, property := pb }) = ↑f.symm { val := b, property := pb }

tactic: exact Subtype.coe_injective ha
state_before: case pos.mpr.intro.intro
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
ha : ↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b
hb : ↑(asEmbedding f) (↑f.symm { val := b, property := pb }) = b
⊢ ↑f (↑g (↑f.symm { val := b, property := pb })) = { val := b, property := pb }

tactic: rw [eq_symm_apply]
state_before: α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
a : α
hb : ↑(asEmbedding f) a = b
ha : ↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b
⊢ a = ↑f.symm { val := b, property := pb }

tactic: exact Subtype.coe_injective hb
state_before: α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : p b
a : α
hb : ↑(asEmbedding f) a = b
ha : ↑(↑f (↑g (↑f.symm { val := b, property := pb }))) = b
⊢ ↑f a = { val := b, property := pb }

tactic: rw [extendDomain_apply_not_subtype _ _ pb]
state_before: case neg
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : ¬p b
⊢ ¬↑(extendDomain g f) b = b ↔ ∃ a, ¬↑g a = a ∧ ↑(asEmbedding f) a = b

tactic: simp only [not_exists, false_iff_iff, not_and, eq_self_iff_true, not_true]
state_before: case neg
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : ¬p b
⊢ ¬b = b ↔ ∃ a, ¬↑g a = a ∧ ↑(asEmbedding f) a = b

tactic: rintro a _ rfl
state_before: case neg
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
b : β
pb : ¬p b
⊢ ∀ (x : α), ¬↑g x = x → ¬↑(asEmbedding f) x = b

tactic: exact pb (Subtype.prop _)
state_before: case neg
α : Type u_1
inst✝⁴ : DecidableEq α
inst✝³ : Fintype α
f✝ g✝ : Perm α
β : Type u_2
inst✝² : DecidableEq β
inst✝¹ : Fintype β
p : β → Prop
inst✝ : DecidablePred p
f : α ≃ Subtype p
g : Perm α
a : α
a✝ : ¬↑g a = a
pb : ¬p (↑(asEmbedding f) a)
⊢ False