Theorem: Finset.product_self_eq_disjiUnion_perm_aux
File: Mathlib/GroupTheory/Perm/Cycle/Basic.lean

tactic: obtain hs | _ := (s : Set α).subsingleton_or_nontrivial
state_before: ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
⊢ (↑(range s.card)).PairwiseDisjoint fun k => map { toFun := fun i => (i, (f ^ k) i), inj' := ⋯ } s
state_after: case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
hs : (↑s).Subsingleton
⊢ (↑(range s.card)).PairwiseDisjoint fun k => map { toFun := fun i => (i, (f ^ k) i), inj' := ⋯ } s

case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
⊢ (↑(range s.card)).PairwiseDisjoint fun k => map { toFun := fun i => (i, (f ^ k) i), inj' := ⋯ } s

tactic: classical
  rintro m hm n hn hmn
  simp only [disjoint_left, Function.onFun, mem_map, Function.Embedding.coeFn_mk, exists_prop,
    not_exists, not_and, forall_exists_index, and_imp, Prod.forall, Prod.mk.inj_iff]
  rintro _ _ _ - rfl rfl a ha rfl h
  rw [hf.pow_apply_eq_pow_apply ha] at h
  rw [mem_coe, mem_range] at hm hn
  exact hmn.symm (h.eq_of_lt_of_lt hn hm)
state_before: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
⊢ (↑(range s.card)).PairwiseDisjoint fun k => map { toFun := fun i => (i, (f ^ k) i), inj' := ⋯ } s
state_after: no goals

tactic: refine Set.Subsingleton.pairwise ?_ _
state_before: case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
hs : (↑s).Subsingleton
⊢ (↑(range s.card)).PairwiseDisjoint fun k => map { toFun := fun i => (i, (f ^ k) i), inj' := ⋯ } s
state_after: case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
hs : (↑s).Subsingleton
⊢ (↑(range s.card)).Subsingleton

tactic: simp_rw [Set.Subsingleton, mem_coe, ← card_le_one] at hs ⊢
state_before: case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
hs : (↑s).Subsingleton
⊢ (↑(range s.card)).Subsingleton
state_after: case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
hs : s.card ≤ 1
⊢ (range s.card).card ≤ 1

tactic: rwa [card_range]
state_before: case inl
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
hs : s.card ≤ 1
⊢ (range s.card).card ≤ 1
state_after: no goals

tactic: rintro m hm n hn hmn
state_before: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
⊢ (↑(range s.card)).PairwiseDisjoint fun k => map { toFun := fun i => (i, (f ^ k) i), inj' := ⋯ } s
state_after: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m ∈ ↑(range s.card)
n : ℕ
hn : n ∈ ↑(range s.card)
hmn : m ≠ n
⊢ (Disjoint on fun k => map { toFun := fun i => (i, (f ^ k) i), inj' := ⋯ } s) m n

tactic: simp only [disjoint_left, Function.onFun, mem_map, Function.Embedding.coeFn_mk, exists_prop,
  not_exists, not_and, forall_exists_index, and_imp, Prod.forall, Prod.mk.inj_iff]
state_before: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m ∈ ↑(range s.card)
n : ℕ
hn : n ∈ ↑(range s.card)
hmn : m ≠ n
⊢ (Disjoint on fun k => map { toFun := fun i => (i, (f ^ k) i), inj' := ⋯ } s) m n
state_after: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m ∈ ↑(range s.card)
n : ℕ
hn : n ∈ ↑(range s.card)
hmn : m ≠ n
⊢ ∀ (a b x : α), x ∈ s → x = a → (f ^ m) x = b → ∀ x ∈ s, x = a → ¬(f ^ n) x = b

tactic: rintro _ _ _ - rfl rfl a ha rfl h
state_before: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m ∈ ↑(range s.card)
n : ℕ
hn : n ∈ ↑(range s.card)
hmn : m ≠ n
⊢ ∀ (a b x : α), x ∈ s → x = a → (f ^ m) x = b → ∀ x ∈ s, x = a → ¬(f ^ n) x = b
state_after: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m ∈ ↑(range s.card)
n : ℕ
hn : n ∈ ↑(range s.card)
hmn : m ≠ n
a : α
ha : a ∈ s
h : (f ^ n) a = (f ^ m) a
⊢ False

tactic: rw [hf.pow_apply_eq_pow_apply ha] at h
state_before: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m ∈ ↑(range s.card)
n : ℕ
hn : n ∈ ↑(range s.card)
hmn : m ≠ n
a : α
ha : a ∈ s
h : (f ^ n) a = (f ^ m) a
⊢ False
state_after: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m ∈ ↑(range s.card)
n : ℕ
hn : n ∈ ↑(range s.card)
hmn : m ≠ n
a : α
ha : a ∈ s
h : n ≡ m [MOD s.card]
⊢ False

tactic: rw [mem_coe, mem_range] at hm hn
state_before: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m ∈ ↑(range s.card)
n : ℕ
hn : n ∈ ↑(range s.card)
hmn : m ≠ n
a : α
ha : a ∈ s
h : n ≡ m [MOD s.card]
⊢ False
state_after: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m < s.card
n : ℕ
hn : n < s.card
hmn : m ≠ n
a : α
ha : a ∈ s
h : n ≡ m [MOD s.card]
⊢ False

tactic: exact hmn.symm (h.eq_of_lt_of_lt hn hm)
state_before: case inr
ι : Type u_1
α : Type u_2
β : Type u_3
f : Perm α
s : Finset α
hf : f.IsCycleOn ↑s
h✝ : (↑s).Nontrivial
m : ℕ
hm : m < s.card
n : ℕ
hn : n < s.card
hmn : m ≠ n
a : α
ha : a ∈ s
h : n ≡ m [MOD s.card]
⊢ False
state_after: no goals