Theorem: Equiv.Perm.mem_list_cycles_iff
File: Mathlib/GroupTheory/Perm/Cycle/Basic.lean

tactic: suffices σ.IsCycle → (σ ∈ l ↔ ∀ (a : α) (_ : σ a ≠ a), σ a = l.prod a) by
  exact ⟨fun hσ => ⟨h1 σ hσ, (this (h1 σ hσ)).mp hσ⟩, fun hσ => (this hσ.1).mpr hσ.2⟩
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
⊢ σ ∈ l ↔ IsCycle σ ∧ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a

tactic: intro h3
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
⊢ IsCycle σ → (σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a)

tactic: exact ⟨fun hσ => ⟨h1 σ hσ, (this (h1 σ hσ)).mp hσ⟩, fun hσ => (this hσ.1).mpr hσ.2⟩
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
this : IsCycle σ → (σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a)
⊢ σ ∈ l ↔ IsCycle σ ∧ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a

tactic: cases nonempty_fintype α
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
⊢ σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a

tactic: constructor
state_before: case intro
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
⊢ σ ∈ l ↔ ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a

tactic: intro h a ha
state_before: case intro.mp
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
⊢ σ ∈ l → ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a

tactic: exact eq_on_support_mem_disjoint h h2 _ (mem_support.mpr ha)
state_before: case intro.mp
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : σ ∈ l
a : α
ha : ↑σ a ≠ a
⊢ ↑σ a = ↑(List.prod l) a

tactic: intro h
state_before: case intro.mpr
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
⊢ (∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a) → σ ∈ l

tactic: have hσl : σ.support ⊆ l.prod.support := by
  intro x hx
  rw [mem_support] at hx
  rwa [mem_support, ← h _ hx]
state_before: case intro.mpr
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
⊢ σ ∈ l

tactic: obtain ⟨a, ha, -⟩ := id h3
state_before: case intro.mpr
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
⊢ σ ∈ l

tactic: rw [← mem_support] at ha
state_before: case intro.mpr.intro.intro
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha : ↑σ a ≠ a
⊢ σ ∈ l

tactic: obtain ⟨τ, hτ, hτa⟩ := exists_mem_support_of_mem_support_prod (hσl ha)
state_before: case intro.mpr.intro.intro
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
⊢ σ ∈ l

tactic: have hτl : ∀ x ∈ τ.support, τ x = l.prod x := eq_on_support_mem_disjoint hτ h2
state_before: case intro.mpr.intro.intro.intro.intro
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
⊢ σ ∈ l

tactic: have key : ∀ x ∈ σ.support ∩ τ.support, σ x = τ x := by
  intro x hx
  rw [h x (mem_support.mp (mem_of_mem_inter_left hx)), hτl x (mem_of_mem_inter_right hx)]
state_before: case intro.mpr.intro.intro.intro.intro
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
⊢ σ ∈ l

tactic: convert hτ
state_before: case intro.mpr.intro.intro.intro.intro
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
key : ∀ (x : α), x ∈ support σ ∩ support τ → ↑σ x = ↑τ x
⊢ σ ∈ l

tactic: refine' h3.eq_on_support_inter_nonempty_congr (h1 _ hτ) key _ ha
state_before: case h.e'_4
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
key : ∀ (x : α), x ∈ support σ ∩ support τ → ↑σ x = ↑τ x
⊢ σ = τ

tactic: exact key a (mem_inter_of_mem ha hτa)
state_before: case h.e'_4
ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
key : ∀ (x : α), x ∈ support σ ∩ support τ → ↑σ x = ↑τ x
⊢ ↑σ a = ↑τ a

tactic: intro x hx
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
⊢ support σ ⊆ support (List.prod l)

tactic: rw [mem_support] at hx
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
x : α
hx : x ∈ support σ
⊢ x ∈ support (List.prod l)

tactic: rwa [mem_support, ← h _ hx]
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
x : α
hx : ↑σ x ≠ x
⊢ x ∈ support (List.prod l)

tactic: intro x hx
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
⊢ ∀ (x : α), x ∈ support σ ∩ support τ → ↑σ x = ↑τ x

tactic: rw [h x (mem_support.mp (mem_of_mem_inter_left hx)), hτl x (mem_of_mem_inter_right hx)]
state_before: ι : Type ?u.2666441
α✝ : Type ?u.2666444
β : Type ?u.2666447
inst✝¹ : DecidableEq α✝
α : Type u_1
inst✝ : Finite α
l : List (Perm α)
h1 : ∀ (σ : Perm α), σ ∈ l → IsCycle σ
h2 : List.Pairwise Disjoint l
σ : Perm α
h3 : IsCycle σ
val✝ : Fintype α
h : ∀ (a : α), ↑σ a ≠ a → ↑σ a = ↑(List.prod l) a
hσl : support σ ⊆ support (List.prod l)
a : α
ha✝ : ↑σ a ≠ a
ha : a ∈ support σ
τ : Perm α
hτ : τ ∈ l
hτa : a ∈ support τ
hτl : ∀ (x : α), x ∈ support τ → ↑τ x = ↑(List.prod l) x
x : α
hx : x ∈ support σ ∩ support τ
⊢ ↑σ x = ↑τ x