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

tactic: obtain ⟨⟨l', hp', hc', hd'⟩, hl⟩ := Trunc.exists_rep σ.truncCycleFactors
state_before: ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
⊢ cycleFactorsFinset σ = List.toFinset l ↔
    (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ

tactic: have ht : cycleFactorsFinset σ = l'.toFinset := by
  rw [cycleFactorsFinset, ← hl, Trunc.lift_mk]
state_before: case intro.mk.intro.intro
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
⊢ cycleFactorsFinset σ = List.toFinset l ↔
    (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ

tactic: rw [ht]
state_before: case intro.mk.intro.intro
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
⊢ cycleFactorsFinset σ = List.toFinset l ↔
    (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ

tactic: constructor
state_before: case intro.mk.intro.intro
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
⊢ List.toFinset l' = List.toFinset l ↔ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ

tactic: rw [cycleFactorsFinset, ← hl, Trunc.lift_mk]
state_before: ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
⊢ cycleFactorsFinset σ = List.toFinset l'

tactic: intro h
state_before: case intro.mk.intro.intro.mp
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
⊢ List.toFinset l' = List.toFinset l → (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ

tactic: have hn' : l'.Nodup := nodup_of_pairwise_disjoint_cycles hc' hd'
state_before: case intro.mk.intro.intro.mp
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
⊢ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ

tactic: have hperm : l ~ l' := List.perm_of_nodup_nodup_toFinset_eq hn hn' h.symm
state_before: case intro.mk.intro.intro.mp
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
⊢ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ

tactic: refine' ⟨_, _, _⟩
state_before: case intro.mk.intro.intro.mp
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ

tactic: exact fun _ h => hc' _ (hperm.subset h)
state_before: case intro.mk.intro.intro.mp.refine'_1
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ ∀ (f : Perm α), f ∈ l → IsCycle f

tactic: rwa [List.Perm.pairwise_iff Disjoint.symmetric hperm]
state_before: case intro.mk.intro.intro.mp.refine'_2
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ List.Pairwise Disjoint l

tactic: rw [← hp', hperm.symm.prod_eq']
state_before: case intro.mk.intro.intro.mp.refine'_3
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ List.prod l = σ

tactic: refine' hd'.imp _
state_before: case intro.mk.intro.intro.mp.refine'_3
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ List.Pairwise _root_.Commute l'

tactic: exact Disjoint.commute
state_before: case intro.mk.intro.intro.mp.refine'_3
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
h : List.toFinset l' = List.toFinset l
hn' : List.Nodup l'
hperm : l ~ l'
⊢ ∀ {a b : Perm α}, Disjoint a b → _root_.Commute a b

tactic: rintro ⟨hc, hd, hp⟩
state_before: case intro.mk.intro.intro.mpr
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
⊢ (∀ (f : Perm α), f ∈ l → IsCycle f) ∧ List.Pairwise Disjoint l ∧ List.prod l = σ → List.toFinset l' = List.toFinset l

tactic: refine' List.toFinset_eq_of_perm _ _ _
state_before: case intro.mk.intro.intro.mpr.intro.intro
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
hc : ∀ (f : Perm α), f ∈ l → IsCycle f
hd : List.Pairwise Disjoint l
hp : List.prod l = σ
⊢ List.toFinset l' = List.toFinset l

tactic: refine' list_cycles_perm_list_cycles _ hc' hc hd' hd
state_before: case intro.mk.intro.intro.mpr.intro.intro
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
hc : ∀ (f : Perm α), f ∈ l → IsCycle f
hd : List.Pairwise Disjoint l
hp : List.prod l = σ
⊢ l' ~ l

tactic: rw [hp, hp']
state_before: case intro.mk.intro.intro.mpr.intro.intro
ι : Type ?u.2680422
α : Type u_1
β : Type ?u.2680428
inst✝¹ : DecidableEq α
inst✝ : Fintype α
f σ : Perm α
l : List (Perm α)
hn : List.Nodup l
l' : List (Perm α)
hp' : List.prod l' = σ
hc' : ∀ (g : Perm α), g ∈ l' → IsCycle g
hd' : List.Pairwise Disjoint l'
hl :
  Trunc.mk
      { val := l',
        property := (_ : List.prod l' = σ ∧ (∀ (g : Perm α), g ∈ l' → IsCycle g) ∧ List.Pairwise Disjoint l') } =
    truncCycleFactors σ
ht : cycleFactorsFinset σ = List.toFinset l'
hc : ∀ (f : Perm α), f ∈ l → IsCycle f
hd : List.Pairwise Disjoint l
hp : List.prod l = σ
⊢ List.prod l' = List.prod l