Theorem: mem_permsOfList_of_mem
File: Mathlib/Data/Fintype/Perm.lean

tactic: simp only [not_mem_nil] at h
state_before: case nil
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ []
⊢ f ∈ permsOfList []

tactic: exact List.mem_singleton.2 (Equiv.ext fun x => Decidable.by_contradiction <| h x)
state_before: case nil
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → False
⊢ f ∈ permsOfList []

tactic: by_cases hfa : f a = a
state_before: case cons
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
⊢ f ∈ permsOfList (a :: l)

tactic: have hfa' : f (f a) ≠ f a := mt (fun h => f.injective h) hfa
state_before: case neg
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
⊢ f ∈ permsOfList (a :: l)

tactic: have : ∀ x : α, (Equiv.swap a (f a) * f) x ≠ x → x ∈ l := by
  intro x hx
  have hxa : x ≠ a := by
    rintro rfl
    apply hx
    simp only [mul_apply, swap_apply_right]
  refine' List.mem_of_ne_of_mem hxa (h x fun h => _)
  simp only [mul_apply, swap_apply_def, mul_apply, Ne.def, apply_eq_iff_eq] at hx
  split_ifs at hx with h_1
  exacts [hxa (h.symm.trans h_1), hx h]
state_before: case neg
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
⊢ f ∈ permsOfList (a :: l)

tactic: suffices f ∈ permsOfList l ∨ ∃ b ∈ l, ∃ g ∈ permsOfList l, Equiv.swap a b * g = f by
  simpa only [permsOfList, exists_prop, List.mem_map, mem_append, List.mem_bind]
state_before: case neg
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
this : ∀ (x : α), ↑(Equiv.swap a (↑f a) * f) x ≠ x → x ∈ l
⊢ f ∈ permsOfList (a :: l)

tactic: refine' or_iff_not_imp_left.2 fun _hfl => ⟨f a, _, Equiv.swap a (f a) * f, IH this, _⟩
state_before: case neg
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
this : ∀ (x : α), ↑(Equiv.swap a (↑f a) * f) x ≠ x → x ∈ l
⊢ f ∈ permsOfList l ∨ ∃ b, b ∈ l ∧ ∃ g, g ∈ permsOfList l ∧ Equiv.swap a b * g = f

tactic: refine' mem_append_left _ (IH fun x hx => mem_of_ne_of_mem _ (h x hx))
state_before: case pos
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ↑f a = a
⊢ f ∈ permsOfList (a :: l)

tactic: rintro rfl
state_before: case pos
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ↑f a = a
x : α
hx : ↑f x ≠ x
⊢ x ≠ a

tactic: exact hx hfa
state_before: case pos
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
x : α
hx : ↑f x ≠ x
h : ∀ (x_1 : α), ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hfa : ↑f x = x
⊢ False

tactic: intro x hx
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
⊢ ∀ (x : α), ↑(Equiv.swap a (↑f a) * f) x ≠ x → x ∈ l

tactic: have hxa : x ≠ a := by
  rintro rfl
  apply hx
  simp only [mul_apply, swap_apply_right]
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
x : α
hx : ↑(Equiv.swap a (↑f a) * f) x ≠ x
⊢ x ∈ l

tactic: refine' List.mem_of_ne_of_mem hxa (h x fun h => _)
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
x : α
hx : ↑(Equiv.swap a (↑f a) * f) x ≠ x
hxa : x ≠ a
⊢ x ∈ l

tactic: simp only [mul_apply, swap_apply_def, mul_apply, Ne.def, apply_eq_iff_eq] at hx
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h✝ : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
x : α
hx : ↑(Equiv.swap a (↑f a) * f) x ≠ x
hxa : x ≠ a
h : ↑f x = x
⊢ False

tactic: split_ifs at hx with h_1
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h✝ : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
x : α
hxa : x ≠ a
h : ↑f x = x
hx : ¬(if ↑f x = a then ↑f a else if x = a then a else ↑f x) = x
⊢ False

tactic: exacts [hxa (h.symm.trans h_1), hx h]
state_before: case inl
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h✝ : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
x : α
hxa : x ≠ a
h : ↑f x = x
h_1 : ↑f x = a
hx : ¬↑f a = x
⊢ False

case inr
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h✝ : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
x : α
hxa : x ≠ a
h : ↑f x = x
h_1 : ¬↑f x = a
hx : ¬↑f x = x
⊢ False

tactic: rintro rfl
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
x : α
hx : ↑(Equiv.swap a (↑f a) * f) x ≠ x
⊢ x ≠ a

tactic: apply hx
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
x : α
h : ∀ (x_1 : α), ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hfa : ¬↑f x = x
hfa' : ↑f (↑f x) ≠ ↑f x
hx : ↑(Equiv.swap x (↑f x) * f) x ≠ x
⊢ False

tactic: simp only [mul_apply, swap_apply_right]
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
x : α
h : ∀ (x_1 : α), ↑f x_1 ≠ x_1 → x_1 ∈ x :: l
hfa : ¬↑f x = x
hfa' : ↑f (↑f x) ≠ ↑f x
hx : ↑(Equiv.swap x (↑f x) * f) x ≠ x
⊢ ↑(Equiv.swap x (↑f x) * f) x = x

tactic: simpa only [permsOfList, exists_prop, List.mem_map, mem_append, List.mem_bind]
state_before: α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
this✝ : ∀ (x : α), ↑(Equiv.swap a (↑f a) * f) x ≠ x → x ∈ l
this : f ∈ permsOfList l ∨ ∃ b, b ∈ l ∧ ∃ g, g ∈ permsOfList l ∧ Equiv.swap a b * g = f
⊢ f ∈ permsOfList (a :: l)

tactic: exact mem_of_ne_of_mem hfa (h _ hfa')
state_before: case neg.refine'_1
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
this : ∀ (x : α), ↑(Equiv.swap a (↑f a) * f) x ≠ x → x ∈ l
_hfl : ¬f ∈ permsOfList l
⊢ ↑f a ∈ l

tactic: rw [← mul_assoc, mul_def (swap a (f a)) (swap a (f a)), swap_swap, ← Perm.one_def, one_mul]
state_before: case neg.refine'_2
α : Type u_1
β : Type ?u.4748
γ : Type ?u.4751
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
a : α
l : List α
IH : ∀ {f : Equiv.Perm α}, (∀ (x : α), ↑f x ≠ x → x ∈ l) → f ∈ permsOfList l
f : Equiv.Perm α
h : ∀ (x : α), ↑f x ≠ x → x ∈ a :: l
hfa : ¬↑f a = a
hfa' : ↑f (↑f a) ≠ ↑f a
this : ∀ (x : α), ↑(Equiv.swap a (↑f a) * f) x ≠ x → x ∈ l
_hfl : ¬f ∈ permsOfList l
⊢ Equiv.swap a (↑f a) * (Equiv.swap a (↑f a) * f) = f