[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
α : Type u_5
β : Type u_6
a : α
⊢ Function.Injective (mk a)
[PROOFSTEP]
intro b₁ b₂ h
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
α : Type u_5
β : Type u_6
a : α
b₁ b₂ : β
h : (a, b₁) = (a, b₂)
⊢ b₁ = b₂
[PROOFSTEP]
simpa only [true_and, Prod.mk.inj_iff, eq_self_iff_true] using h
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
α : Type u_5
β : Type u_6
b : β
⊢ Function.Injective fun a => (a, b)
[PROOFSTEP]
intro b₁ b₂ h
[GOAL]
α✝ : Type u_1
β✝ : Type u_2
γ : Type u_3
δ : Type u_4
α : Type u_5
β : Type u_6
b : β
b₁ b₂ : α
h : (fun a => (a, b)) b₁ = (fun a => (a, b)) b₂
⊢ b₁ = b₂
[PROOFSTEP]
simpa only [and_true, eq_self_iff_true, mk.inj_iff] using h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
p q : α × β
⊢ p = q ↔ p.fst = q.fst ∧ p.snd = q.snd
[PROOFSTEP]
rw [← @mk.eta _ _ p, ← @mk.eta _ _ q, mk.inj_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
p₁ : α
p₂ : β
q₁ : α
q₂ : β
⊢ (p₁, p₂) = (q₁, q₂) ↔ (p₁, p₂).fst = (q₁, q₂).fst ∧ (p₁, p₂).snd = (q₁, q₂).snd
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
a : α
b : β
x : α
⊢ (a, b).fst = x ↔ (a, b) = (x, (a, b).snd)
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
a : α
b x : β
⊢ (a, b).snd = x ↔ (a, b) = ((a, b).fst, x)
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
p q : α × β
h : Prod.Lex r s p q
⊢ r p.fst q.fst ∨ p.fst = q.fst ∧ s p.snd q.snd
[PROOFSTEP]
cases h
[GOAL]
case left
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
a₁✝ : α
b₁✝ : β
a₂✝ : α
b₂✝ : β
h✝ : r a₁✝ a₂✝
⊢ r (a₁✝, b₁✝).fst (a₂✝, b₂✝).fst ∨ (a₁✝, b₁✝).fst = (a₂✝, b₂✝).fst ∧ s (a₁✝, b₁✝).snd (a₂✝, b₂✝).snd
[PROOFSTEP]
simp [*]
[GOAL]
case right
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
a✝ : α
b₁✝ b₂✝ : β
h✝ : s b₁✝ b₂✝
⊢ r (a✝, b₁✝).fst (a✝, b₂✝).fst ∨ (a✝, b₁✝).fst = (a✝, b₂✝).fst ∧ s (a✝, b₁✝).snd (a✝, b₂✝).snd
[PROOFSTEP]
simp [*]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
p q : α × β
h✝ : r p.fst q.fst ∨ p.fst = q.fst ∧ s p.snd q.snd
a : α
b : β
c : α
d : β
e : (a, b).fst = (c, d).fst
h : s (a, b).snd (c, d).snd
⊢ Prod.Lex r s (a, b) (c, d)
[PROOFSTEP]
subst e
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
p q : α × β
h✝ : r p.fst q.fst ∨ p.fst = q.fst ∧ s p.snd q.snd
a : α
b d : β
h : s (a, b).snd ((a, b).fst, d).snd
⊢ Prod.Lex r s (a, b) ((a, b).fst, d)
[PROOFSTEP]
exact Lex.right _ h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
⊢ ∀ (a : α × β), ¬Prod.Lex r s a a
[PROOFSTEP]
rintro ⟨i, a⟩ (⟨_, _, h⟩ | ⟨_, h⟩)
[GOAL]
case mk.left
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
i : α
a : β
h : r i i
⊢ False
[PROOFSTEP]
exact irrefl _ h
[GOAL]
case mk.right
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : IsIrrefl α r
inst✝ : IsIrrefl β s
i : α
a : β
h : s a a
⊢ False
[PROOFSTEP]
exact irrefl _ h
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrichotomous α r
inst✝ : IsTotal β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
⊢ Prod.Lex r s (i, a) (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
obtain hij | rfl | hji := trichotomous_of r i j
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrichotomous α r
inst✝ : IsTotal β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
hij : r i j
⊢ Prod.Lex r s (i, a) (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
exact Or.inl (.left _ _ hij)
[GOAL]
case inr.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrichotomous α r
inst✝ : IsTotal β s
x✝¹ x✝ : α × β
i : α
a b : β
⊢ Prod.Lex r s (i, a) (i, b) ∨ Prod.Lex r s (i, b) (i, a)
[PROOFSTEP]
exact (total_of s a b).imp (.right _) (.right _)
[GOAL]
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r✝ : α → α → Prop
s✝ : β → β → Prop
x y : α × β
r : α → α → Prop
s : β → β → Prop
inst✝¹ : IsTrichotomous α r
inst✝ : IsTotal β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
hji : r j i
⊢ Prod.Lex r s (i, a) (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
exact Or.inr (.left _ _ hji)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
⊢ Prod.Lex r s (i, a) (j, b) ∨ (i, a) = (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
obtain hij | rfl | hji := trichotomous_of r i j
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
hij : r i j
⊢ Prod.Lex r s (i, a) (j, b) ∨ (i, a) = (j, b) ∨ Prod.Lex r s (j, b) (i, a)
case inr.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a b : β
⊢ Prod.Lex r s (i, a) (i, b) ∨ (i, a) = (i, b) ∨ Prod.Lex r s (i, b) (i, a)
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
hji : r j i
⊢ Prod.Lex r s (i, a) (j, b) ∨ (i, a) = (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
{exact Or.inl (Lex.left _ _ hij)
}
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
hij : r i j
⊢ Prod.Lex r s (i, a) (j, b) ∨ (i, a) = (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
exact Or.inl (Lex.left _ _ hij)
[GOAL]
case inr.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a b : β
⊢ Prod.Lex r s (i, a) (i, b) ∨ (i, a) = (i, b) ∨ Prod.Lex r s (i, b) (i, a)
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
hji : r j i
⊢ Prod.Lex r s (i, a) (j, b) ∨ (i, a) = (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
{exact (trichotomous_of (s) a b).imp3 (Lex.right _) (congr_arg _) (Lex.right _)
}
[GOAL]
case inr.inl
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a b : β
⊢ Prod.Lex r s (i, a) (i, b) ∨ (i, a) = (i, b) ∨ Prod.Lex r s (i, b) (i, a)
[PROOFSTEP]
exact (trichotomous_of (s) a b).imp3 (Lex.right _) (congr_arg _) (Lex.right _)
[GOAL]
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
hji : r j i
⊢ Prod.Lex r s (i, a) (j, b) ∨ (i, a) = (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
{exact Or.inr (Or.inr $ Lex.left _ _ hji)
}
[GOAL]
case inr.inr
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
r : α → α → Prop
s : β → β → Prop
x y : α × β
inst✝¹ : _root_.IsTrichotomous α r
inst✝ : _root_.IsTrichotomous β s
x✝¹ x✝ : α × β
i : α
a : β
j : α
b : β
hji : r j i
⊢ Prod.Lex r s (i, a) (j, b) ∨ (i, a) = (j, b) ∨ Prod.Lex r s (j, b) (i, a)
[PROOFSTEP]
exact Or.inr (Or.inr $ Lex.left _ _ hji)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
f : α → γ
g : β → δ
f₁ : α → β
g₁ : γ → δ
f₂ : β → α
g₂ : δ → γ
hf : LeftInverse f₁ f₂
hg : LeftInverse g₁ g₂
a : β × δ
⊢ map f₁ g₁ (map f₂ g₂ a) = a
[PROOFSTEP]
rw [Prod.map_map, hf.comp_eq_id, hg.comp_eq_id, map_id, id]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty α
inst✝ : Nonempty β
f : α → γ
g : β → δ
h : Injective (map f g)
a₁ a₂ : α
ha : f a₁ = f a₂
⊢ a₁ = a₂
[PROOFSTEP]
inhabit β
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty α
inst✝ : Nonempty β
f : α → γ
g : β → δ
h : Injective (map f g)
a₁ a₂ : α
ha : f a₁ = f a₂
inhabited_h : Inhabited β
⊢ a₁ = a₂
[PROOFSTEP]
injection @h (a₁, default) (a₂, default) (congr_arg (fun c : γ => Prod.mk c (g default)) ha : _)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty α
inst✝ : Nonempty β
f : α → γ
g : β → δ
h : Injective (map f g)
b₁ b₂ : β
hb : g b₁ = g b₂
⊢ b₁ = b₂
[PROOFSTEP]
inhabit α
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty α
inst✝ : Nonempty β
f : α → γ
g : β → δ
h : Injective (map f g)
b₁ b₂ : β
hb : g b₁ = g b₂
inhabited_h : Inhabited α
⊢ b₁ = b₂
[PROOFSTEP]
injection @h (default, b₁) (default, b₂) (congr_arg (Prod.mk (f default)) hb : _)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty γ
inst✝ : Nonempty δ
f : α → γ
g : β → δ
h : Surjective (map f g)
c : γ
⊢ ∃ a, f a = c
[PROOFSTEP]
inhabit δ
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty γ
inst✝ : Nonempty δ
f : α → γ
g : β → δ
h : Surjective (map f g)
c : γ
inhabited_h : Inhabited δ
⊢ ∃ a, f a = c
[PROOFSTEP]
obtain ⟨⟨a, b⟩, h⟩ := h (c, default)
[GOAL]
case intro.mk
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty γ
inst✝ : Nonempty δ
f : α → γ
g : β → δ
h✝ : Surjective (map f g)
c : γ
inhabited_h : Inhabited δ
a : α
b : β
h : map f g (a, b) = (c, default)
⊢ ∃ a, f a = c
[PROOFSTEP]
exact ⟨a, congr_arg Prod.fst h⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty γ
inst✝ : Nonempty δ
f : α → γ
g : β → δ
h : Surjective (map f g)
d : δ
⊢ ∃ a, g a = d
[PROOFSTEP]
inhabit γ
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty γ
inst✝ : Nonempty δ
f : α → γ
g : β → δ
h : Surjective (map f g)
d : δ
inhabited_h : Inhabited γ
⊢ ∃ a, g a = d
[PROOFSTEP]
obtain ⟨⟨a, b⟩, h⟩ := h (default, d)
[GOAL]
case intro.mk
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty γ
inst✝ : Nonempty δ
f : α → γ
g : β → δ
h✝ : Surjective (map f g)
d : δ
inhabited_h : Inhabited γ
a : α
b : β
h : map f g (a, b) = (default, d)
⊢ ∃ a, g a = d
[PROOFSTEP]
exact ⟨b, congr_arg Prod.snd h⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty α
inst✝ : Nonempty β
f : α → γ
g : β → δ
⊢ Bijective (map f g) ↔ Bijective f ∧ Bijective g
[PROOFSTEP]
haveI := Nonempty.map f ‹_›
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty α
inst✝ : Nonempty β
f : α → γ
g : β → δ
this : Nonempty γ
⊢ Bijective (map f g) ↔ Bijective f ∧ Bijective g
[PROOFSTEP]
haveI := Nonempty.map g ‹_›
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty α
inst✝ : Nonempty β
f : α → γ
g : β → δ
this✝ : Nonempty γ
this : Nonempty δ
⊢ Bijective (map f g) ↔ Bijective f ∧ Bijective g
[PROOFSTEP]
exact (map_injective.and map_surjective).trans (and_and_and_comm)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty β
inst✝ : Nonempty δ
f₁ : α → β
g₁ : γ → δ
f₂ : β → α
g₂ : δ → γ
h : LeftInverse (map f₁ g₁) (map f₂ g₂)
b : β
⊢ f₁ (f₂ b) = b
[PROOFSTEP]
inhabit δ
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty β
inst✝ : Nonempty δ
f₁ : α → β
g₁ : γ → δ
f₂ : β → α
g₂ : δ → γ
h : LeftInverse (map f₁ g₁) (map f₂ g₂)
b : β
inhabited_h : Inhabited δ
⊢ f₁ (f₂ b) = b
[PROOFSTEP]
exact congr_arg Prod.fst (h (b, default))
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty β
inst✝ : Nonempty δ
f₁ : α → β
g₁ : γ → δ
f₂ : β → α
g₂ : δ → γ
h : LeftInverse (map f₁ g₁) (map f₂ g₂)
d : δ
⊢ g₁ (g₂ d) = d
[PROOFSTEP]
inhabit β
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝¹ : Nonempty β
inst✝ : Nonempty δ
f₁ : α → β
g₁ : γ → δ
f₂ : β → α
g₂ : δ → γ
h : LeftInverse (map f₁ g₁) (map f₂ g₂)
d : δ
inhabited_h : Inhabited β
⊢ g₁ (g₂ d) = d
[PROOFSTEP]
exact congr_arg Prod.snd (h (default, d))


[GOAL]
G : Type u_1
inst✝ : Group G
H : Subgroup G
⊢ Commensurable H H
[PROOFSTEP]
simp [Commensurable]
[GOAL]
G : Type u_1
inst✝ : Group G
H K : Subgroup G
g : ConjAct G
a b : { x // x ∈ K }
⊢ Setoid.r a b ↔ Setoid.r (↑(Subgroup.equivSMul g K).toEquiv a) (↑(Subgroup.equivSMul g K).toEquiv b)
[PROOFSTEP]
dsimp
[GOAL]
G : Type u_1
inst✝ : Group G
H K : Subgroup G
g : ConjAct G
a b : { x // x ∈ K }
⊢ Setoid.r a b ↔ Setoid.r (↑(Subgroup.equivSMul g K) a) (↑(Subgroup.equivSMul g K) b)
[PROOFSTEP]
rw [← Quotient.eq'', ← Quotient.eq'', QuotientGroup.eq', QuotientGroup.eq', Subgroup.mem_subgroupOf,
  Subgroup.mem_subgroupOf, ← MulEquiv.map_inv, ← MulEquiv.map_mul, Subgroup.equivSMul_apply_coe]
[GOAL]
G : Type u_1
inst✝ : Group G
H K : Subgroup G
g : ConjAct G
a b : { x // x ∈ K }
⊢ ↑(a⁻¹ * b) ∈ H ↔ g • ↑(a⁻¹ * b) ∈ g • H
[PROOFSTEP]
exact Subgroup.smul_mem_pointwise_smul_iff.symm
[GOAL]
G : Type u_1
inst✝ : Group G
H : Subgroup G
g : ConjAct G
⊢ Commensurable (g • H) H ↔ Commensurable H (g⁻¹ • H)
[PROOFSTEP]
rw [commensurable_conj, inv_smul_smul]
[GOAL]
G : Type u_1
inst✝ : Group G
H : Subgroup G
a✝ b✝ : ConjAct G
ha : a✝ ∈ {g | Commensurable (g • H) H}
hb : b✝ ∈ {g | Commensurable (g • H) H}
⊢ a✝ * b✝ ∈ {g | Commensurable (g • H) H}
[PROOFSTEP]
rw [Set.mem_setOf_eq, mul_smul]
[GOAL]
G : Type u_1
inst✝ : Group G
H : Subgroup G
a✝ b✝ : ConjAct G
ha : a✝ ∈ {g | Commensurable (g • H) H}
hb : b✝ ∈ {g | Commensurable (g • H) H}
⊢ Commensurable (a✝ • b✝ • H) H
[PROOFSTEP]
exact trans ((commensurable_conj _).mp hb) ha
[GOAL]
G : Type u_1
inst✝ : Group G
H : Subgroup G
⊢ 1 ∈
    { carrier := {g | Commensurable (g • H) H},
        mul_mem' :=
          (_ :
            ∀ {a b : ConjAct G},
              a ∈ {g | Commensurable (g • H) H} →
                b ∈ {g | Commensurable (g • H) H} → a * b ∈ {g | Commensurable (g • H) H}) }.carrier
[PROOFSTEP]
rw [Set.mem_setOf_eq, one_smul]
[GOAL]
G : Type u_1
inst✝ : Group G
H : Subgroup G
x✝¹ : ConjAct G
x✝ :
  x✝¹ ∈
    {
          toSubsemigroup :=
            { carrier := {g | Commensurable (g • H) H},
              mul_mem' :=
                (_ :
                  ∀ {a b : ConjAct G},
                    a ∈ {g | Commensurable (g • H) H} →
                      b ∈ {g | Commensurable (g • H) H} → a * b ∈ {g | Commensurable (g • H) H}) },
          one_mem' :=
            (_ :
              1 ∈
                { carrier := {g | Commensurable (g • H) H},
                    mul_mem' :=
                      (_ :
                        ∀ {a b : ConjAct G},
                          a ∈ {g | Commensurable (g • H) H} →
                            b ∈ {g | Commensurable (g • H) H} →
                              a * b ∈ {g | Commensurable (g • H) H}) }.carrier) }.toSubsemigroup.carrier
⊢ x✝¹⁻¹ ∈
    {
          toSubsemigroup :=
            { carrier := {g | Commensurable (g • H) H},
              mul_mem' :=
                (_ :
                  ∀ {a b : ConjAct G},
                    a ∈ {g | Commensurable (g • H) H} →
                      b ∈ {g | Commensurable (g • H) H} → a * b ∈ {g | Commensurable (g • H) H}) },
          one_mem' :=
            (_ :
              1 ∈
                { carrier := {g | Commensurable (g • H) H},
                    mul_mem' :=
                      (_ :
                        ∀ {a b : ConjAct G},
                          a ∈ {g | Commensurable (g • H) H} →
                            b ∈ {g | Commensurable (g • H) H} →
                              a * b ∈ {g | Commensurable (g • H) H}) }.carrier) }.toSubsemigroup.carrier
[PROOFSTEP]
rwa [Set.mem_setOf_eq, comm, ← commensurable_inv]


[GOAL]
l : Filter ℂ
hre : Tendsto re l atTop
r : ℝ
hr : im =O[l] fun z => z.re ^ r
n : ℕ
⊢ (fun z => z.im ^ ↑n) =O[l] fun z => (z.re ^ r) ^ ↑n
[PROOFSTEP]
norm_cast
[GOAL]
l : Filter ℂ
hre : Tendsto re l atTop
r : ℝ
hr : im =O[l] fun z => z.re ^ r
n : ℕ
⊢ (fun z => z.im ^ n) =O[l] fun z => (z.re ^ r) ^ n
[PROOFSTEP]
exact hr.pow n
[GOAL]
l : Filter ℂ
hre : Tendsto re l atTop
r : ℝ
hr : im =O[l] fun z => z.re ^ r
n : ℕ
z : ℂ
hz : 0 ≤ z.re
⊢ (fun z => (z.re ^ r) ^ ↑n) z = (fun z => z.re ^ (r * ↑n)) z
[PROOFSTEP]
simp only [Real.rpow_mul hz r n, Real.rpow_nat_cast]
[GOAL]
l : Filter ℂ
hre : Tendsto re l atTop
n : ℕ
hr : im =O[l] fun z => z.re ^ ↑n
⊢ im =O[l] fun z => z.re ^ ↑n
[PROOFSTEP]
norm_cast at hr
[GOAL]
l : Filter ℂ
hre : Tendsto re l atTop
n : ℕ
hr : im =O[l] fun z => z.re ^ n
⊢ im =O[l] fun z => z.re ^ ↑n
[PROOFSTEP]
simpa only [Real.rpow_nat_cast]
[GOAL]
l : Filter ℂ
hre : Tendsto re l atTop
him : IsBoundedUnder (fun x x_1 => x ≤ x_1) l fun z => |z.im|
⊢ im =O[l] fun z => z.re ^ ↑0
[PROOFSTEP]
norm_cast
[GOAL]
l : Filter ℂ
hre : Tendsto re l atTop
him : IsBoundedUnder (fun x x_1 => x ≤ x_1) l fun z => |z.im|
⊢ im =O[l] fun z => z.re ^ 0
[PROOFSTEP]
simpa only [pow_zero] using @IsBoundedUnder.isBigO_const ℂ ℝ ℝ _ _ _ l him 1 one_ne_zero
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
⊢ ∀ (x : ℂ), ((fun z => z.im ^ ↑n) ^ 2) x = (x.im ^ ↑n) ^ 2
[PROOFSTEP]
simp
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
x✝ : ℂ
⊢ (x✝.im ^ ↑n) ^ 2 = x✝.im ^ (2 * ↑n)
[PROOFSTEP]
norm_cast
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
x✝ : ℂ
⊢ (x✝.im ^ n) ^ 2 = x✝.im ^ (2 * n)
[PROOFSTEP]
rw [pow_mul']
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
⊢ (fun z => z.im ^ (2 * ↑n)) =O[l] fun z => Real.exp z.re
[PROOFSTEP]
have := hl.isBigO_im_pow_re (2 * n)
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
this : (fun z => z.im ^ ↑(2 * n)) =O[l] fun z => Real.exp z.re
⊢ (fun z => z.im ^ (2 * ↑n)) =O[l] fun z => Real.exp z.re
[PROOFSTEP]
norm_cast at *
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
x✝ : ℂ
⊢ Real.exp x✝.re = Real.exp x✝.re ^ 1
[PROOFSTEP]
norm_cast
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
x✝ : ℂ
⊢ Real.exp x✝.re = Real.exp x✝.re ^ 1
[PROOFSTEP]
rw [pow_one]
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
⊢ (fun z => Real.exp z.re ^ 1) =o[l] fun z => Real.exp z.re ^ 2
[PROOFSTEP]
have := (isLittleO_pow_pow_atTop_of_lt one_lt_two).comp_tendsto <| Real.tendsto_exp_atTop.comp hl.tendsto_re
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
this : ((fun x => x ^ 1) ∘ Real.exp ∘ re) =o[l] ((fun x => x ^ 2) ∘ Real.exp ∘ re)
⊢ (fun z => Real.exp z.re ^ 1) =o[l] fun z => Real.exp z.re ^ 2
[PROOFSTEP]
simpa only [pow_one, Real.rpow_one, Real.rpow_two]
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
⊢ ∀ (x : ℂ), Real.exp x.re ^ 2 = ((fun z => Real.exp z.re) ^ 2) x
[PROOFSTEP]
simp
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
⊢ (fun z => |z.im| ^ ↑n) ≤ᶠ[l] fun z => Real.exp z.re
[PROOFSTEP]
simpa using (hl.isLittleO_im_pow_exp_re n).bound zero_lt_one
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
⊢ ‖Real.log (↑abs z)‖ ≤ 1 * ‖Real.log (Real.sqrt 2) + Real.log (max z.re |z.im|)‖
[PROOFSTEP]
have h2 : 0 < Real.sqrt 2 := by simp
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
⊢ 0 < Real.sqrt 2
[PROOFSTEP]
simp
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
⊢ ‖Real.log (↑abs z)‖ ≤ 1 * ‖Real.log (Real.sqrt 2) + Real.log (max z.re |z.im|)‖
[PROOFSTEP]
have hz' : 1 ≤ abs z := hz.trans (re_le_abs z)
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
⊢ ‖Real.log (↑abs z)‖ ≤ 1 * ‖Real.log (Real.sqrt 2) + Real.log (max z.re |z.im|)‖
[PROOFSTEP]
have _ : 0 < abs z := one_pos.trans_le hz'
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
⊢ ‖Real.log (↑abs z)‖ ≤ 1 * ‖Real.log (Real.sqrt 2) + Real.log (max z.re |z.im|)‖
[PROOFSTEP]
have hm₀ : 0 < max z.re |z.im| := lt_max_iff.2 (Or.inl <| one_pos.trans_le hz)
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
hm₀ : 0 < max z.re |z.im|
⊢ ‖Real.log (↑abs z)‖ ≤ 1 * ‖Real.log (Real.sqrt 2) + Real.log (max z.re |z.im|)‖
[PROOFSTEP]
rw [one_mul, Real.norm_eq_abs, _root_.abs_of_nonneg (Real.log_nonneg hz')]
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
hm₀ : 0 < max z.re |z.im|
⊢ Real.log (↑abs z) ≤ ‖Real.log (Real.sqrt 2) + Real.log (max z.re |z.im|)‖
[PROOFSTEP]
refine' le_trans _ (le_abs_self _)
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
hm₀ : 0 < max z.re |z.im|
⊢ Real.log (↑abs z) ≤ Real.log (Real.sqrt 2) + Real.log (max z.re |z.im|)
[PROOFSTEP]
rw [← Real.log_mul, Real.log_le_log, ← _root_.abs_of_nonneg (le_trans zero_le_one hz)]
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
hm₀ : 0 < max z.re |z.im|
⊢ ↑abs z ≤ Real.sqrt 2 * max |z.re| |z.im|
case h
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
hm₀ : 0 < max z.re |z.im|
⊢ 0 < ↑abs z
case h₁
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
hm₀ : 0 < max z.re |z.im|
⊢ 0 < Real.sqrt 2 * max z.re |z.im|
case hx
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
hm₀ : 0 < max z.re |z.im|
⊢ Real.sqrt 2 ≠ 0
case hy
l : Filter ℂ
hl : IsExpCmpFilter l
z : ℂ
hz : 1 ≤ z.re
h2 : 0 < Real.sqrt 2
hz' : 1 ≤ ↑abs z
x✝ : 0 < ↑abs z
hm₀ : 0 < max z.re |z.im|
⊢ max z.re |z.im| ≠ 0
[PROOFSTEP]
exacts [abs_le_sqrt_two_mul_max z, one_pos.trans_le hz', mul_pos h2 hm₀, h2.ne', hm₀.ne']
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
⊢ ∀ᶠ (x : ℂ) in l, ↑n * ‖Real.log (max x.re |x.im|)‖ ≤ ‖x.re‖
[PROOFSTEP]
filter_upwards [isLittleO_iff_nat_mul_le'.1 hl.isLittleO_log_re_re n, hl.abs_im_pow_eventuallyLE_exp_re n,
  hl.tendsto_re.eventually_gt_atTop 1] with z hre him h₁
[GOAL]
case h
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
z : ℂ
hre : ↑n * ‖Real.log z.re‖ ≤ ‖z.re‖
him : |z.im| ^ ↑n ≤ Real.exp z.re
h₁ : 1 < z.re
⊢ ↑n * ‖Real.log (max z.re |z.im|)‖ ≤ ‖z.re‖
[PROOFSTEP]
cases' le_total |z.im| z.re with hle hle
[GOAL]
case h.inl
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
z : ℂ
hre : ↑n * ‖Real.log z.re‖ ≤ ‖z.re‖
him : |z.im| ^ ↑n ≤ Real.exp z.re
h₁ : 1 < z.re
hle : |z.im| ≤ z.re
⊢ ↑n * ‖Real.log (max z.re |z.im|)‖ ≤ ‖z.re‖
[PROOFSTEP]
rwa [max_eq_left hle]
[GOAL]
case h.inr
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
z : ℂ
hre : ↑n * ‖Real.log z.re‖ ≤ ‖z.re‖
him : |z.im| ^ ↑n ≤ Real.exp z.re
h₁ : 1 < z.re
hle : z.re ≤ |z.im|
⊢ ↑n * ‖Real.log (max z.re |z.im|)‖ ≤ ‖z.re‖
[PROOFSTEP]
have H : 1 < |z.im| := h₁.trans_le hle
[GOAL]
case h.inr
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
z : ℂ
hre : ↑n * ‖Real.log z.re‖ ≤ ‖z.re‖
him : |z.im| ^ ↑n ≤ Real.exp z.re
h₁ : 1 < z.re
hle : z.re ≤ |z.im|
H : 1 < |z.im|
⊢ ↑n * ‖Real.log (max z.re |z.im|)‖ ≤ ‖z.re‖
[PROOFSTEP]
norm_cast at *
[GOAL]
case h.inr
l : Filter ℂ
hl : IsExpCmpFilter l
n : ℕ
z : ℂ
hre : ↑n * ‖Real.log z.re‖ ≤ ‖z.re‖
hle : z.re ≤ |z.im|
him : |z.im| ^ n ≤ Real.exp z.re
h₁ : 1 < z.re
H : 1 < |z.im|
⊢ ↑n * ‖Real.log (max z.re |z.im|)‖ ≤ ‖z.re‖
[PROOFSTEP]
rwa [max_eq_right hle, Real.norm_eq_abs, Real.norm_eq_abs, abs_of_pos (Real.log_pos H), ← Real.log_pow,
  Real.log_le_iff_le_exp (pow_pos (one_pos.trans H) _), abs_of_pos (one_pos.trans h₁)]
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
a : ℂ
b : ℝ
hb : 0 < b
z : ℂ
hz : z ≠ 0
⊢ (let_fun this := fun z => ↑abs z ^ a.re;
      this)
      z =
    (fun z => Real.exp (a.re * Real.log (↑abs z))) z
[PROOFSTEP]
simp only [Real.rpow_def_of_pos, abs.pos hz, mul_comm]
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
a : ℂ
b : ℝ
hb : 0 < b
⊢ (fun z => Real.exp (a.re * Real.log (↑abs z))) =o[l] fun x => ‖exp (↑b * x)‖
[PROOFSTEP]
simp only [norm_eq_abs, abs_exp, ofReal_mul_re, Real.isLittleO_exp_comp_exp_comp]
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
a : ℂ
b : ℝ
hb : 0 < b
⊢ Tendsto (fun x => b * x.re - a.re * Real.log (↑abs x)) l atTop
[PROOFSTEP]
refine' (IsEquivalent.refl.sub_isLittleO _).symm.tendsto_atTop (hl.tendsto_re.const_mul_atTop hb)
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
a : ℂ
b : ℝ
hb : 0 < b
⊢ (fun x => a.re * Real.log (↑abs x)) =o[l] fun x => b * x.re
[PROOFSTEP]
exact (hl.isLittleO_log_abs_re.const_mul_left _).const_mul_right hb.ne'
[GOAL]
l : Filter ℂ
b₁ b₂ : ℝ
hl : IsExpCmpFilter l
hb : b₁ < b₂
a₁ a₂ z : ℂ
hz : z ≠ 0
⊢ (fun z => z ^ a₁ * exp (↑b₁ * z)) z = (fun z => z ^ a₂ * exp (↑b₁ * z) * z ^ (a₁ - a₂)) z
[PROOFSTEP]
simp only
[GOAL]
l : Filter ℂ
b₁ b₂ : ℝ
hl : IsExpCmpFilter l
hb : b₁ < b₂
a₁ a₂ z : ℂ
hz : z ≠ 0
⊢ z ^ a₁ * exp (↑b₁ * z) = z ^ a₂ * exp (↑b₁ * z) * z ^ (a₁ - a₂)
[PROOFSTEP]
rw [mul_right_comm, ← cpow_add _ _ hz, add_sub_cancel'_right]
[GOAL]
l : Filter ℂ
b₁ b₂ : ℝ
hl : IsExpCmpFilter l
hb : b₁ < b₂
a₁ a₂ : ℂ
⊢ (fun z => z ^ a₂ * exp (↑b₁ * z) * exp (↑(b₂ - b₁) * z)) =ᶠ[l] fun z => z ^ a₂ * exp (↑b₂ * z)
[PROOFSTEP]
simp only [ofReal_sub, sub_mul, mul_assoc, ← exp_add, add_sub_cancel'_right]
[GOAL]
l : Filter ℂ
b₁ b₂ : ℝ
hl : IsExpCmpFilter l
hb : b₁ < b₂
a₁ a₂ : ℂ
⊢ (fun z => z ^ a₂ * exp (↑b₂ * z)) =ᶠ[l] fun z => z ^ a₂ * exp (↑b₂ * z)
[PROOFSTEP]
norm_cast
[GOAL]
l : Filter ℂ
hl : IsExpCmpFilter l
a : ℂ
b : ℝ
hb : b < 0
⊢ (fun z => exp (↑b * z)) =o[l] fun z => z ^ a
[PROOFSTEP]
simpa using hl.isLittleO_cpow_mul_exp hb 0 a
[GOAL]
l : Filter ℂ
b₁ b₂ : ℝ
hl : IsExpCmpFilter l
hb : b₁ < b₂
m n : ℕ
⊢ (fun z => z ^ ↑m * exp (↑b₁ * z)) =o[l] fun z => z ^ ↑n * exp (↑b₂ * z)
[PROOFSTEP]
simpa only [cpow_nat_cast] using hl.isLittleO_cpow_mul_exp hb m n
[GOAL]
l : Filter ℂ
b₁ b₂ : ℝ
hl : IsExpCmpFilter l
hb : b₁ < b₂
m n : ℤ
⊢ (fun z => z ^ ↑m * exp (↑b₁ * z)) =o[l] fun z => z ^ ↑n * exp (↑b₂ * z)
[PROOFSTEP]
simpa only [cpow_int_cast] using hl.isLittleO_cpow_mul_exp hb m n


[GOAL]
α : Type ?u.3
⊢ (fun {α β} e => ↑(uniqueCongr e)) (Equiv.refl α) = id
[PROOFSTEP]
simp
[GOAL]
⊢ ∀ {α β γ : Type ?u.3} (k : α ≃ β) (h : β ≃ γ),
    (fun {α β} e => ↑(uniqueCongr e)) (k.trans h) =
      (fun {α β} e => ↑(uniqueCongr e)) h ∘ (fun {α β} e => ↑(uniqueCongr e)) k
[PROOFSTEP]
simp
[GOAL]
α : Type ?u.3738
⊢ (fun {α β} e p => (e.symm.trans p).trans e) (Equiv.refl α) = id
[PROOFSTEP]
ext
[GOAL]
case h.H
α : Type ?u.3738
x✝¹ : Perm α
x✝ : α
⊢ ↑((fun {α β} e p => (e.symm.trans p).trans e) (Equiv.refl α) x✝¹) x✝ = ↑(id x✝¹) x✝
[PROOFSTEP]
simp
[GOAL]
α✝ β✝ γ✝ : Type ?u.3738
x✝¹ : α✝ ≃ β✝
x✝ : β✝ ≃ γ✝
⊢ (fun {α β} e p => (e.symm.trans p).trans e) (x✝¹.trans x✝) =
    (fun {α β} e p => (e.symm.trans p).trans e) x✝ ∘ (fun {α β} e p => (e.symm.trans p).trans e) x✝¹
[PROOFSTEP]
ext
[GOAL]
case h.H
α✝ β✝ γ✝ : Type ?u.3738
x✝³ : α✝ ≃ β✝
x✝² : β✝ ≃ γ✝
x✝¹ : Perm α✝
x✝ : γ✝
⊢ ↑((fun {α β} e p => (e.symm.trans p).trans e) (x✝³.trans x✝²) x✝¹) x✝ =
    ↑(((fun {α β} e p => (e.symm.trans p).trans e) x✝² ∘ (fun {α β} e p => (e.symm.trans p).trans e) x✝³) x✝¹) x✝
[PROOFSTEP]
simp
[GOAL]
α : Type ?u.6374
⊢ (fun {α β} e s => Finset.map (Equiv.toEmbedding e) s) (Equiv.refl α) = id
[PROOFSTEP]
ext
[GOAL]
case h.a
α : Type ?u.6374
x✝ : Finset α
a✝ : α
⊢ a✝ ∈ (fun {α β} e s => Finset.map (Equiv.toEmbedding e) s) (Equiv.refl α) x✝ ↔ a✝ ∈ id x✝
[PROOFSTEP]
simp
[GOAL]
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
⊢ (fun {α β} e s => Finset.map (Equiv.toEmbedding e) s) (k.trans h) =
    (fun {α β} e s => Finset.map (Equiv.toEmbedding e) s) h ∘ (fun {α β} e s => Finset.map (Equiv.toEmbedding e) s) k
[PROOFSTEP]
ext _ a
[GOAL]
case h.a
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a : γ✝
⊢ a ∈ (fun {α β} e s => Finset.map (Equiv.toEmbedding e) s) (k.trans h) x✝ ↔
    a ∈
      ((fun {α β} e s => Finset.map (Equiv.toEmbedding e) s) h ∘
          (fun {α β} e s => Finset.map (Equiv.toEmbedding e) s) k)
        x✝
[PROOFSTEP]
simp
[GOAL]
case h.a
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a : γ✝
⊢ (∃ a_1, a_1 ∈ x✝ ∧ ↑h (↑k a_1) = a) ↔ ↑k.symm (↑h.symm a) ∈ x✝
[PROOFSTEP]
constructor
[GOAL]
case h.a.mp
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a : γ✝
⊢ (∃ a_1, a_1 ∈ x✝ ∧ ↑h (↑k a_1) = a) → ↑k.symm (↑h.symm a) ∈ x✝
[PROOFSTEP]
intro h'
[GOAL]
case h.a.mpr
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a : γ✝
⊢ ↑k.symm (↑h.symm a) ∈ x✝ → ∃ a_2, a_2 ∈ x✝ ∧ ↑h (↑k a_2) = a
[PROOFSTEP]
intro h'
[GOAL]
case h.a.mp
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a : γ✝
h' : ∃ a_1, a_1 ∈ x✝ ∧ ↑h (↑k a_1) = a
⊢ ↑k.symm (↑h.symm a) ∈ x✝
[PROOFSTEP]
let ⟨a, ha₁, ha₂⟩ := h'
[GOAL]
case h.a.mp
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a✝ : γ✝
h' : ∃ a, a ∈ x✝ ∧ ↑h (↑k a) = a✝
a : α✝
ha₁ : a ∈ x✝
ha₂ : ↑h (↑k a) = a✝
⊢ ↑k.symm (↑h.symm a✝) ∈ x✝
[PROOFSTEP]
rw [← ha₂]
[GOAL]
case h.a.mp
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a✝ : γ✝
h' : ∃ a, a ∈ x✝ ∧ ↑h (↑k a) = a✝
a : α✝
ha₁ : a ∈ x✝
ha₂ : ↑h (↑k a) = a✝
⊢ ↑k.symm (↑h.symm (↑h (↑k a))) ∈ x✝
[PROOFSTEP]
simp
[GOAL]
case h.a.mp
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a✝ : γ✝
h' : ∃ a, a ∈ x✝ ∧ ↑h (↑k a) = a✝
a : α✝
ha₁ : a ∈ x✝
ha₂ : ↑h (↑k a) = a✝
⊢ a ∈ x✝
[PROOFSTEP]
apply ha₁
[GOAL]
case h.a.mpr
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a : γ✝
h' : ↑k.symm (↑h.symm a) ∈ x✝
⊢ ∃ a_1, a_1 ∈ x✝ ∧ ↑h (↑k a_1) = a
[PROOFSTEP]
exists (Equiv.symm k) ((Equiv.symm h) a)
[GOAL]
case h.a.mpr
α✝ β✝ γ✝ : Type ?u.6374
k : α✝ ≃ β✝
h : β✝ ≃ γ✝
x✝ : Finset α✝
a : γ✝
h' : ↑k.symm (↑h.symm a) ∈ x✝
⊢ ↑k.symm (↑h.symm a) ∈ x✝ ∧ ↑h (↑k (↑k.symm (↑h.symm a))) = a
[PROOFSTEP]
simp [h']
[GOAL]
α : Type ?u.9577
⊢ (fun {α β} e s => Fintype.ofBijective ↑e (_ : Function.Bijective ↑e)) (Equiv.refl α) = id
[PROOFSTEP]
ext
[GOAL]
case h
α : Type ?u.9577
x✝ : Fintype α
⊢ (fun {α β} e s => Fintype.ofBijective ↑e (_ : Function.Bijective ↑e)) (Equiv.refl α) x✝ = id x✝
[PROOFSTEP]
simp
[GOAL]
⊢ ∀ {α β γ : Type ?u.9577} (k : α ≃ β) (h : β ≃ γ),
    (fun {α β} e s => Fintype.ofBijective ↑e (_ : Function.Bijective ↑e)) (k.trans h) =
      (fun {α β} e s => Fintype.ofBijective ↑e (_ : Function.Bijective ↑e)) h ∘
        (fun {α β} e s => Fintype.ofBijective ↑e (_ : Function.Bijective ↑e)) k
[PROOFSTEP]
simp


[GOAL]
α✝ : Type u
β : Type v
α : Type u_1
σ : Perm α
m n : ℤ
x : α
⊢ ↑(σ ^ m) (↑(σ ^ n) x) = ↑(σ ^ n) (↑(σ ^ m) x)
[PROOFSTEP]
rw [← Equiv.Perm.mul_apply, ← Equiv.Perm.mul_apply, zpow_mul_comm]
[GOAL]
α✝ : Type u
β✝ : Type v
α : Type u_1
β : Type u_2
⊢ Function.Injective ↑(sumCongrHom α β)
[PROOFSTEP]
rintro ⟨⟩ ⟨⟩ h
[GOAL]
case mk.mk
α✝ : Type u
β✝ : Type v
α : Type u_1
β : Type u_2
fst✝¹ : Perm α
snd✝¹ : Perm β
fst✝ : Perm α
snd✝ : Perm β
h : ↑(sumCongrHom α β) (fst✝¹, snd✝¹) = ↑(sumCongrHom α β) (fst✝, snd✝)
⊢ (fst✝¹, snd✝¹) = (fst✝, snd✝)
[PROOFSTEP]
rw [Prod.mk.inj_iff]
[GOAL]
case mk.mk
α✝ : Type u
β✝ : Type v
α : Type u_1
β : Type u_2
fst✝¹ : Perm α
snd✝¹ : Perm β
fst✝ : Perm α
snd✝ : Perm β
h : ↑(sumCongrHom α β) (fst✝¹, snd✝¹) = ↑(sumCongrHom α β) (fst✝, snd✝)
⊢ fst✝¹ = fst✝ ∧ snd✝¹ = snd✝
[PROOFSTEP]
constructor
[GOAL]
case mk.mk.left
α✝ : Type u
β✝ : Type v
α : Type u_1
β : Type u_2
fst✝¹ : Perm α
snd✝¹ : Perm β
fst✝ : Perm α
snd✝ : Perm β
h : ↑(sumCongrHom α β) (fst✝¹, snd✝¹) = ↑(sumCongrHom α β) (fst✝, snd✝)
⊢ fst✝¹ = fst✝
[PROOFSTEP]
ext i
[GOAL]
case mk.mk.right
α✝ : Type u
β✝ : Type v
α : Type u_1
β : Type u_2
fst✝¹ : Perm α
snd✝¹ : Perm β
fst✝ : Perm α
snd✝ : Perm β
h : ↑(sumCongrHom α β) (fst✝¹, snd✝¹) = ↑(sumCongrHom α β) (fst✝, snd✝)
⊢ snd✝¹ = snd✝
[PROOFSTEP]
ext i
[GOAL]
case mk.mk.left.H
α✝ : Type u
β✝ : Type v
α : Type u_1
β : Type u_2
fst✝¹ : Perm α
snd✝¹ : Perm β
fst✝ : Perm α
snd✝ : Perm β
h : ↑(sumCongrHom α β) (fst✝¹, snd✝¹) = ↑(sumCongrHom α β) (fst✝, snd✝)
i : α
⊢ ↑fst✝¹ i = ↑fst✝ i
[PROOFSTEP]
simpa using Equiv.congr_fun h (Sum.inl i)
[GOAL]
case mk.mk.right.H
α✝ : Type u
β✝ : Type v
α : Type u_1
β : Type u_2
fst✝¹ : Perm α
snd✝¹ : Perm β
fst✝ : Perm α
snd✝ : Perm β
h : ↑(sumCongrHom α β) (fst✝¹, snd✝¹) = ↑(sumCongrHom α β) (fst✝, snd✝)
i : β
⊢ ↑snd✝¹ i = ↑snd✝ i
[PROOFSTEP]
simpa using Equiv.congr_fun h (Sum.inr i)
[GOAL]
α✝ : Type u
β✝ : Type v
α : Type u_1
β : α → Type u_2
⊢ Function.Injective ↑(sigmaCongrRightHom β)
[PROOFSTEP]
intro x y h
[GOAL]
α✝ : Type u
β✝ : Type v
α : Type u_1
β : α → Type u_2
x y : (a : α) → Perm (β a)
h : ↑(sigmaCongrRightHom β) x = ↑(sigmaCongrRightHom β) y
⊢ x = y
[PROOFSTEP]
ext a b
[GOAL]
case h.H
α✝ : Type u
β✝ : Type v
α : Type u_1
β : α → Type u_2
x y : (a : α) → Perm (β a)
h : ↑(sigmaCongrRightHom β) x = ↑(sigmaCongrRightHom β) y
a : α
b : β a
⊢ ↑(x a) b = ↑(y a) b
[PROOFSTEP]
simpa using Equiv.congr_fun h ⟨a, b⟩
[GOAL]
α : Type u
β : Type v
p : α → Prop
inst✝ : DecidablePred p
⊢ Function.Injective ↑(subtypeCongrHom p)
[PROOFSTEP]
rintro ⟨⟩ ⟨⟩ h
[GOAL]
case mk.mk
α : Type u
β : Type v
p : α → Prop
inst✝ : DecidablePred p
fst✝¹ : Perm { a // p a }
snd✝¹ : Perm { a // ¬p a }
fst✝ : Perm { a // p a }
snd✝ : Perm { a // ¬p a }
h : ↑(subtypeCongrHom p) (fst✝¹, snd✝¹) = ↑(subtypeCongrHom p) (fst✝, snd✝)
⊢ (fst✝¹, snd✝¹) = (fst✝, snd✝)
[PROOFSTEP]
rw [Prod.mk.inj_iff]
[GOAL]
case mk.mk
α : Type u
β : Type v
p : α → Prop
inst✝ : DecidablePred p
fst✝¹ : Perm { a // p a }
snd✝¹ : Perm { a // ¬p a }
fst✝ : Perm { a // p a }
snd✝ : Perm { a // ¬p a }
h : ↑(subtypeCongrHom p) (fst✝¹, snd✝¹) = ↑(subtypeCongrHom p) (fst✝, snd✝)
⊢ fst✝¹ = fst✝ ∧ snd✝¹ = snd✝
[PROOFSTEP]
constructor
[GOAL]
case mk.mk.left
α : Type u
β : Type v
p : α → Prop
inst✝ : DecidablePred p
fst✝¹ : Perm { a // p a }
snd✝¹ : Perm { a // ¬p a }
fst✝ : Perm { a // p a }
snd✝ : Perm { a // ¬p a }
h : ↑(subtypeCongrHom p) (fst✝¹, snd✝¹) = ↑(subtypeCongrHom p) (fst✝, snd✝)
⊢ fst✝¹ = fst✝
[PROOFSTEP]
ext i
[GOAL]
case mk.mk.right
α : Type u
β : Type v
p : α → Prop
inst✝ : DecidablePred p
fst✝¹ : Perm { a // p a }
snd✝¹ : Perm { a // ¬p a }
fst✝ : Perm { a // p a }
snd✝ : Perm { a // ¬p a }
h : ↑(subtypeCongrHom p) (fst✝¹, snd✝¹) = ↑(subtypeCongrHom p) (fst✝, snd✝)
⊢ snd✝¹ = snd✝
[PROOFSTEP]
ext i
[GOAL]
case mk.mk.left.H.a
α : Type u
β : Type v
p : α → Prop
inst✝ : DecidablePred p
fst✝¹ : Perm { a // p a }
snd✝¹ : Perm { a // ¬p a }
fst✝ : Perm { a // p a }
snd✝ : Perm { a // ¬p a }
h : ↑(subtypeCongrHom p) (fst✝¹, snd✝¹) = ↑(subtypeCongrHom p) (fst✝, snd✝)
i : { a // p a }
⊢ ↑(↑fst✝¹ i) = ↑(↑fst✝ i)
[PROOFSTEP]
simpa using Equiv.congr_fun h i
[GOAL]
case mk.mk.right.H.a
α : Type u
β : Type v
p : α → Prop
inst✝ : DecidablePred p
fst✝¹ : Perm { a // p a }
snd✝¹ : Perm { a // ¬p a }
fst✝ : Perm { a // p a }
snd✝ : Perm { a // ¬p a }
h : ↑(subtypeCongrHom p) (fst✝¹, snd✝¹) = ↑(subtypeCongrHom p) (fst✝, snd✝)
i : { a // ¬p a }
⊢ ↑(↑snd✝¹ i) = ↑(↑snd✝ i)
[PROOFSTEP]
simpa using Equiv.congr_fun h i
[GOAL]
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
h : ∀ (x : α), p x ↔ p (↑f x)
x : { x // p x }
⊢ p (↑f (↑f⁻¹ ↑x))
[PROOFSTEP]
simpa using x.2
[GOAL]
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
h : ∀ (x : α), p x ↔ p (↑f x)
x✝ : { x // p x }
⊢ (fun x => { val := ↑f⁻¹ ↑x, property := (_ : p (↑f⁻¹ ↑x)) })
      ((fun x => { val := ↑f ↑x, property := (_ : p (↑f ↑x)) }) x✝) =
    x✝
[PROOFSTEP]
simp only [Perm.inv_apply_self, Subtype.coe_eta, Subtype.coe_mk]
[GOAL]
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
h : ∀ (x : α), p x ↔ p (↑f x)
x✝ : { x // p x }
⊢ (fun x => { val := ↑f ↑x, property := (_ : p (↑f ↑x)) })
      ((fun x => { val := ↑f⁻¹ ↑x, property := (_ : p (↑f⁻¹ ↑x)) }) x✝) =
    x✝
[PROOFSTEP]
simp only [Perm.apply_inv_self, Subtype.coe_eta, Subtype.coe_mk]
[GOAL]
α : Type u
β : Type v
p : α → Prop
f : Perm α
⊢ (∀ (x : α), p (↑f⁻¹ x) ↔ p (↑f (↑f⁻¹ x))) ↔ ∀ (x : α), p x ↔ p (↑f⁻¹ x)
[PROOFSTEP]
simp_rw [f.apply_inv_self, Iff.comm]
[GOAL]
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
n : ℕ
hf : ∀ (x : α), p x ↔ p (↑f x)
⊢ subtypePerm f hf ^ n = subtypePerm (f ^ n) (_ : ∀ (x : α), p x ↔ p (↑(f ^ n) x))
[PROOFSTEP]
induction' n with n ih
[GOAL]
case zero
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
hf : ∀ (x : α), p x ↔ p (↑f x)
⊢ subtypePerm f hf ^ Nat.zero = subtypePerm (f ^ Nat.zero) (_ : ∀ (x : α), p x ↔ p (↑(f ^ Nat.zero) x))
[PROOFSTEP]
simp
[GOAL]
case succ
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
hf : ∀ (x : α), p x ↔ p (↑f x)
n : ℕ
ih : subtypePerm f hf ^ n = subtypePerm (f ^ n) (_ : ∀ (x : α), p x ↔ p (↑(f ^ n) x))
⊢ subtypePerm f hf ^ Nat.succ n = subtypePerm (f ^ Nat.succ n) (_ : ∀ (x : α), p x ↔ p (↑(f ^ Nat.succ n) x))
[PROOFSTEP]
simp_rw [pow_succ', ih, subtypePerm_mul]
[GOAL]
α : Type u
β : Type v
p : α → Prop
f : Perm α
hf : ∀ (x : α), p x ↔ p (↑f x)
n : ℕ
⊢ ∀ (x : α), p x ↔ p (↑(f ^ Int.negSucc n) x)
[PROOFSTEP]
rw [zpow_negSucc]
[GOAL]
α : Type u
β : Type v
p : α → Prop
f : Perm α
hf : ∀ (x : α), p x ↔ p (↑f x)
n : ℕ
⊢ ∀ (x : α), p x ↔ p (↑(f ^ (n + 1))⁻¹ x)
[PROOFSTEP]
exact inv_aux.1 (pow_aux hf)
[GOAL]
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
n : ℤ
hf : ∀ (x : α), p x ↔ p (↑f x)
⊢ subtypePerm f hf ^ n = subtypePerm (f ^ n) (_ : ∀ (x : α), p x ↔ p (↑(f ^ n) x))
[PROOFSTEP]
induction' n with n ih
[GOAL]
case ofNat
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
hf : ∀ (x : α), p x ↔ p (↑f x)
n : ℕ
⊢ subtypePerm f hf ^ Int.ofNat n = subtypePerm (f ^ Int.ofNat n) (_ : ∀ (x : α), p x ↔ p (↑(f ^ Int.ofNat n) x))
[PROOFSTEP]
exact subtypePerm_pow _ _ _
[GOAL]
case negSucc
α : Type u
β : Type v
p : α → Prop
f✝ f : Perm α
hf : ∀ (x : α), p x ↔ p (↑f x)
ih : ℕ
⊢ subtypePerm f hf ^ Int.negSucc ih =
    subtypePerm (f ^ Int.negSucc ih) (_ : ∀ (x : α), p x ↔ p (↑(f ^ Int.negSucc ih) x))
[PROOFSTEP]
simp only [zpow_negSucc, subtypePerm_pow, subtypePerm_inv]
[GOAL]
α : Type u
β : Type v
p : α → Prop
f✝ : Perm α
inst✝ : DecidablePred p
a : α
f : Perm α
h₁ : ∀ (x : α), p x ↔ p (↑f x)
h₂ : ∀ (x : α), ↑f x ≠ x → p x
x : α
⊢ ↑(↑ofSubtype (subtypePerm f h₁)) x = ↑f x
[PROOFSTEP]
by_cases hx : p x
[GOAL]
case pos
α : Type u
β : Type v
p : α → Prop
f✝ : Perm α
inst✝ : DecidablePred p
a : α
f : Perm α
h₁ : ∀ (x : α), p x ↔ p (↑f x)
h₂ : ∀ (x : α), ↑f x ≠ x → p x
x : α
hx : p x
⊢ ↑(↑ofSubtype (subtypePerm f h₁)) x = ↑f x
[PROOFSTEP]
exact (subtypePerm f h₁).extendDomain_apply_subtype _ hx
[GOAL]
case neg
α : Type u
β : Type v
p : α → Prop
f✝ : Perm α
inst✝ : DecidablePred p
a : α
f : Perm α
h₁ : ∀ (x : α), p x ↔ p (↑f x)
h₂ : ∀ (x : α), ↑f x ≠ x → p x
x : α
hx : ¬p x
⊢ ↑(↑ofSubtype (subtypePerm f h₁)) x = ↑f x
[PROOFSTEP]
rw [ofSubtype, MonoidHom.coe_mk]
  -- Porting note: added `dsimp`
[GOAL]
case neg
α : Type u
β : Type v
p : α → Prop
f✝ : Perm α
inst✝ : DecidablePred p
a : α
f : Perm α
h₁ : ∀ (x : α), p x ↔ p (↑f x)
h₂ : ∀ (x : α), ↑f x ≠ x → p x
x : α
hx : ¬p x
⊢ ↑(↑{ toFun := fun f => extendDomain f (Equiv.refl { x // p x }),
              map_one' := (_ : extendDomain 1 (Equiv.refl { x // p x }) = 1) }
          (subtypePerm f h₁))
      x =
    ↑f x
[PROOFSTEP]
dsimp only [OneHom.coe_mk]
[GOAL]
case neg
α : Type u
β : Type v
p : α → Prop
f✝ : Perm α
inst✝ : DecidablePred p
a : α
f : Perm α
h₁ : ∀ (x : α), p x ↔ p (↑f x)
h₂ : ∀ (x : α), ↑f x ≠ x → p x
x : α
hx : ¬p x
⊢ ↑(extendDomain (subtypePerm f h₁) (Equiv.refl { x // p x })) x = ↑f x
[PROOFSTEP]
rw [Equiv.Perm.extendDomain_apply_not_subtype _ _ hx]
[GOAL]
case neg
α : Type u
β : Type v
p : α → Prop
f✝ : Perm α
inst✝ : DecidablePred p
a : α
f : Perm α
h₁ : ∀ (x : α), p x ↔ p (↑f x)
h₂ : ∀ (x : α), ↑f x ≠ x → p x
x : α
hx : ¬p x
⊢ x = ↑f x
[PROOFSTEP]
exact not_not.mp fun h => hx (h₂ x (Ne.symm h))
[GOAL]
α : Type u
β : Type v
p : α → Prop
f✝ : Perm α
inst✝ : DecidablePred p
a : α
f : Perm (Subtype p)
x : α
h : p x
⊢ p x ↔ p (↑(↑ofSubtype f) x)
[PROOFSTEP]
simpa only [h, true_iff_iff, MonoidHom.coe_mk, ofSubtype_apply_of_mem f h] using (f ⟨x, h⟩).2
[GOAL]
α : Type u
β : Type v
p : α → Prop
f✝ : Perm α
inst✝ : DecidablePred p
a : α
f : Perm (Subtype p)
x : α
h : ¬p x
⊢ p x ↔ p (↑(↑ofSubtype f) x)
[PROOFSTEP]
simp [h, ofSubtype_apply_of_not_mem f h]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
⊢ ↑(swap x y * f) z = ↑(f * swap (↑f⁻¹ x) (↑f⁻¹ y)) z
[PROOFSTEP]
simp only [Perm.mul_apply, swap_apply_def]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
⊢ (if ↑f z = x then y else if ↑f z = y then x else ↑f z) =
    ↑f (if z = ↑f⁻¹ x then ↑f⁻¹ y else if z = ↑f⁻¹ y then ↑f⁻¹ x else z)
[PROOFSTEP]
split_ifs
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝¹ : ↑f z = x
h✝ : z = ↑f⁻¹ x
⊢ y = ↑f (↑f⁻¹ y)
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝² : ↑f z = x
h✝¹ : ¬z = ↑f⁻¹ x
h✝ : z = ↑f⁻¹ y
⊢ y = ↑f (↑f⁻¹ x)
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝² : ↑f z = x
h✝¹ : ¬z = ↑f⁻¹ x
h✝ : ¬z = ↑f⁻¹ y
⊢ y = ↑f z
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝² : ¬↑f z = x
h✝¹ : ↑f z = y
h✝ : z = ↑f⁻¹ x
⊢ x = ↑f (↑f⁻¹ y)
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝³ : ¬↑f z = x
h✝² : ↑f z = y
h✝¹ : ¬z = ↑f⁻¹ x
h✝ : z = ↑f⁻¹ y
⊢ x = ↑f (↑f⁻¹ x)
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝³ : ¬↑f z = x
h✝² : ↑f z = y
h✝¹ : ¬z = ↑f⁻¹ x
h✝ : ¬z = ↑f⁻¹ y
⊢ x = ↑f z
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝² : ¬↑f z = x
h✝¹ : ¬↑f z = y
h✝ : z = ↑f⁻¹ x
⊢ ↑f z = ↑f (↑f⁻¹ y)
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝³ : ¬↑f z = x
h✝² : ¬↑f z = y
h✝¹ : ¬z = ↑f⁻¹ x
h✝ : z = ↑f⁻¹ y
⊢ ↑f z = ↑f (↑f⁻¹ x)
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y z : α
h✝³ : ¬↑f z = x
h✝² : ¬↑f z = y
h✝¹ : ¬z = ↑f⁻¹ x
h✝ : ¬z = ↑f⁻¹ y
⊢ ↑f z = ↑f z
[PROOFSTEP]
simp_all only [Perm.apply_inv_self, Perm.eq_inv_iff_eq, eq_self_iff_true, not_true]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y : α
⊢ f * swap x y = swap (↑f x) (↑f y) * f
[PROOFSTEP]
rw [swap_mul_eq_mul_swap, Perm.inv_apply_self, Perm.inv_apply_self]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
f : Perm α
x y : α
⊢ swap (↑f x) (↑f y) = f * swap x y * f⁻¹
[PROOFSTEP]
rw [mul_swap_eq_swap_mul, mul_inv_cancel_right]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
⊢ swap i j * (swap i j * σ) = σ
[PROOFSTEP]
rw [← mul_assoc, swap_mul_self, one_mul]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
⊢ σ * swap i j * swap i j = σ
[PROOFSTEP]
rw [mul_assoc, swap_mul_self, mul_one]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
h : swap i j * σ = σ
⊢ i = j
[PROOFSTEP]
have swap_id : swap i j = 1 := mul_right_cancel (_root_.trans h (one_mul σ).symm)
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
h : swap i j * σ = σ
swap_id : swap i j = 1
⊢ i = j
[PROOFSTEP]
rw [← swap_apply_right i j, swap_id]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
h : swap i j * σ = σ
swap_id : swap i j = 1
⊢ ↑1 j = j
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
h : i = j
⊢ swap i j * σ = σ
[PROOFSTEP]
erw [h, swap_self, one_mul]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
h : σ * swap i j = σ
⊢ i = j
[PROOFSTEP]
have swap_id : swap i j = 1 := mul_left_cancel (_root_.trans h (one_mul σ).symm)
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
h : σ * swap i j = σ
swap_id : swap i j = 1
⊢ i = j
[PROOFSTEP]
rw [← swap_apply_right i j, swap_id]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
h : σ * swap i j = σ
swap_id : swap i j = 1
⊢ ↑1 j = j
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
i j : α
σ : Perm α
h : i = j
⊢ σ * swap i j = σ
[PROOFSTEP]
erw [h, swap_self, mul_one]
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
⊢ ↑(swap y z * swap x y * swap y z) n = ↑(swap z x) n
[PROOFSTEP]
simp only [swap_apply_def, Perm.mul_apply]
  -- Porting note: was `cc`
[GOAL]
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
⊢ (if
        (if (if n = y then z else if n = z then y else n) = x then y
          else
            if (if n = y then z else if n = z then y else n) = y then x
            else if n = y then z else if n = z then y else n) =
          y then
      z
    else
      if
          (if (if n = y then z else if n = z then y else n) = x then y
            else
              if (if n = y then z else if n = z then y else n) = y then x
              else if n = y then z else if n = z then y else n) =
            z then
        y
      else
        if (if n = y then z else if n = z then y else n) = x then y
        else
          if (if n = y then z else if n = z then y else n) = y then x
          else if n = y then z else if n = z then y else n) =
    if n = z then x else if n = x then z else n
[PROOFSTEP]
split_ifs
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝³ : n = y
h✝² : z = x
h✝¹ : y = y
h✝ : n = z
⊢ z = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : n = y
h✝³ : z = x
h✝² : y = y
h✝¹ : ¬n = z
h✝ : n = x
⊢ z = z
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : n = y
h✝³ : z = x
h✝² : y = y
h✝¹ : ¬n = z
h✝ : ¬n = x
⊢ z = n
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : n = y
h✝³ : z = x
h✝² : ¬y = y
h✝¹ : y = z
h✝ : n = z
⊢ y = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁵ : n = y
h✝⁴ : z = x
h✝³ : ¬y = y
h✝² : y = z
h✝¹ : ¬n = z
h✝ : n = x
⊢ y = z
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁵ : n = y
h✝⁴ : z = x
h✝³ : ¬y = y
h✝² : y = z
h✝¹ : ¬n = z
h✝ : ¬n = x
⊢ y = n
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : n = y
h✝³ : z = x
h✝² : ¬y = y
h✝¹ : ¬y = z
h✝ : n = z
⊢ y = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁵ : n = y
h✝⁴ : z = x
h✝³ : ¬y = y
h✝² : ¬y = z
h✝¹ : ¬n = z
h✝ : n = x
⊢ y = z
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁵ : n = y
h✝⁴ : z = x
h✝³ : ¬y = y
h✝² : ¬y = z
h✝¹ : ¬n = z
h✝ : ¬n = x
⊢ y = n
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝³ : n = y
h✝² : ¬z = x
h✝¹ : z = y
h✝ : n = z
⊢ x = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : n = y
h✝³ : ¬z = x
h✝² : z = y
h✝¹ : ¬n = z
h✝ : n = x
⊢ x = z
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : n = y
h✝³ : ¬z = x
h✝² : z = y
h✝¹ : ¬n = z
h✝ : ¬n = x
⊢ x = n
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : n = y
h✝³ : ¬z = x
h✝² : ¬z = y
h✝¹ : z = z
h✝ : n = z
⊢ y = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁵ : n = y
h✝⁴ : ¬z = x
h✝³ : ¬z = y
h✝² : z = z
h✝¹ : ¬n = z
h✝ : n = x
⊢ y = z
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁵ : n = y
h✝⁴ : ¬z = x
h✝³ : ¬z = y
h✝² : z = z
h✝¹ : ¬n = z
h✝ : ¬n = x
⊢ y = n
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : n = y
h✝³ : ¬z = x
h✝² : ¬z = y
h✝¹ : ¬z = z
h✝ : n = z
⊢ z = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁵ : n = y
h✝⁴ : ¬z = x
h✝³ : ¬z = y
h✝² : ¬z = z
h✝¹ : ¬n = z
h✝ : n = x
⊢ z = z
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁵ : n = y
h✝⁴ : ¬z = x
h✝³ : ¬z = y
h✝² : ¬z = z
h✝¹ : ¬n = z
h✝ : ¬n = x
⊢ z = n
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝³ : ¬n = y
h✝² : n = z
h✝¹ : y = x
h✝ : y = y
⊢ z = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : ¬n = y
h✝³ : n = z
h✝² : y = x
h✝¹ : ¬y = y
h✝ : y = z
⊢ y = x
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : ¬n = y
h✝³ : n = z
h✝² : y = x
h✝¹ : ¬y = y
h✝ : ¬y = z
⊢ y = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝³ : ¬n = y
h✝² : n = z
h✝¹ : ¬y = x
h✝ : y = y
⊢ x = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : ¬n = y
h✝³ : n = z
h✝² : ¬y = x
h✝¹ : ¬y = y
h✝ : y = z
⊢ y = x
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : ¬n = y
h✝³ : n = z
h✝² : ¬y = x
h✝¹ : ¬y = y
h✝ : ¬y = z
⊢ y = x
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝³ : ¬n = y
h✝² : ¬n = z
h✝¹ : n = x
h✝ : y = y
⊢ z = z
[PROOFSTEP]
aesop
[GOAL]
case pos
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : ¬n = y
h✝³ : ¬n = z
h✝² : n = x
h✝¹ : ¬y = y
h✝ : y = z
⊢ y = z
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝⁴ : ¬n = y
h✝³ : ¬n = z
h✝² : n = x
h✝¹ : ¬y = y
h✝ : ¬y = z
⊢ y = z
[PROOFSTEP]
aesop
[GOAL]
case neg
α : Type u
β : Type v
inst✝ : DecidableEq α
x y z : α
hwz : x ≠ y
hxz : x ≠ z
n : α
h✝² : ¬n = y
h✝¹ : ¬n = z
h✝ : ¬n = x
⊢ n = n
[PROOFSTEP]
aesop
[GOAL]
α : Type u
β : Type v
inst✝ : AddGroup α
a b : α
n : ℕ
⊢ Equiv.addLeft a ^ n = Equiv.addLeft (n • a)
[PROOFSTEP]
ext
[GOAL]
case H
α : Type u
β : Type v
inst✝ : AddGroup α
a b : α
n : ℕ
x✝ : α
⊢ ↑(Equiv.addLeft a ^ n) x✝ = ↑(Equiv.addLeft (n • a)) x✝
[PROOFSTEP]
simp [Perm.coe_pow]
[GOAL]
α : Type u
β : Type v
inst✝ : AddGroup α
a b : α
n : ℕ
⊢ Equiv.addRight a ^ n = Equiv.addRight (n • a)
[PROOFSTEP]
ext
[GOAL]
case H
α : Type u
β : Type v
inst✝ : AddGroup α
a b : α
n : ℕ
x✝ : α
⊢ ↑(Equiv.addRight a ^ n) x✝ = ↑(Equiv.addRight (n • a)) x✝
[PROOFSTEP]
simp [Perm.coe_pow]
[GOAL]
α : Type u
β : Type v
inst✝ : AddGroup α
a b : α
n : ℕ
⊢ Equiv.addRight a ^ Int.ofNat n = Equiv.addRight (Int.ofNat n • a)
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : AddGroup α
a b : α
n : ℕ
⊢ Equiv.addRight a ^ Int.negSucc n = Equiv.addRight (Int.negSucc n • a)
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : Group α
a b : α
n : ℕ
⊢ Equiv.mulLeft a ^ n = Equiv.mulLeft (a ^ n)
[PROOFSTEP]
ext
[GOAL]
case H
α : Type u
β : Type v
inst✝ : Group α
a b : α
n : ℕ
x✝ : α
⊢ ↑(Equiv.mulLeft a ^ n) x✝ = ↑(Equiv.mulLeft (a ^ n)) x✝
[PROOFSTEP]
simp [Perm.coe_pow]
[GOAL]
α : Type u
β : Type v
inst✝ : Group α
a b : α
n : ℕ
⊢ Equiv.mulRight a ^ n = Equiv.mulRight (a ^ n)
[PROOFSTEP]
ext
[GOAL]
case H
α : Type u
β : Type v
inst✝ : Group α
a b : α
n : ℕ
x✝ : α
⊢ ↑(Equiv.mulRight a ^ n) x✝ = ↑(Equiv.mulRight (a ^ n)) x✝
[PROOFSTEP]
simp [Perm.coe_pow]
[GOAL]
α : Type u
β : Type v
inst✝ : Group α
a b : α
n : ℕ
⊢ Equiv.mulRight a ^ Int.ofNat n = Equiv.mulRight (a ^ Int.ofNat n)
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝ : Group α
a b : α
n : ℕ
⊢ Equiv.mulRight a ^ Int.negSucc n = Equiv.mulRight (a ^ Int.negSucc n)
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
f : Perm α
s : Set α
⊢ MapsTo (↑f) s s → ∀ (n : ℕ), MapsTo (↑(f ^ n)) s s
[PROOFSTEP]
simp_rw [Equiv.Perm.coe_pow]
[GOAL]
α : Type u_1
f : Perm α
s : Set α
⊢ MapsTo (↑f) s s → ∀ (n : ℕ), MapsTo (↑f)^[n] s s
[PROOFSTEP]
exact MapsTo.iterate
[GOAL]
α : Type u_1
f : Perm α
s : Set α
⊢ SurjOn (↑f) s s → ∀ (n : ℕ), SurjOn (↑(f ^ n)) s s
[PROOFSTEP]
simp_rw [Equiv.Perm.coe_pow]
[GOAL]
α : Type u_1
f : Perm α
s : Set α
⊢ SurjOn (↑f) s s → ∀ (n : ℕ), SurjOn (↑f)^[n] s s
[PROOFSTEP]
exact SurjOn.iterate
[GOAL]
α : Type u_1
f : Perm α
s : Set α
⊢ BijOn (↑f) s s → ∀ (n : ℕ), BijOn (↑(f ^ n)) s s
[PROOFSTEP]
simp_rw [Equiv.Perm.coe_pow]
[GOAL]
α : Type u_1
f : Perm α
s : Set α
⊢ BijOn (↑f) s s → ∀ (n : ℕ), BijOn (↑f)^[n] s s
[PROOFSTEP]
exact BijOn.iterate