Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura, Mario Carneiro
! This file was ported from Lean 3 source module group_theory.perm.basic
! leanprover-community/mathlib commit b86832321b586c6ac23ef8cdef6a7a27e42b13bd
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Group.Pi
import Mathlib.Algebra.Group.Prod
import Mathlib.Algebra.Hom.Iterate
import Mathlib.Logic.Equiv.Set
/-!
# The group of permutations (self-equivalences) of a type `α`
This file defines the `Group` structure on `Equiv.Perm α`.
-/
universe u v
namespace Equiv
variable { α : Type u } { β : Type v }
namespace Perm
instance permGroup : Group ( Perm α ) where
mul f g := Equiv.trans : {α : Sort ?u.36} → {β : Sort ?u.35} → {γ : Sort ?u.34} → α ≃ β → β ≃ γ → α ≃ γ Equiv.trans g f
one := Equiv.refl : (α : Sort ?u.96) → α ≃ α Equiv.refl α
inv := Equiv.symm : {α : Sort ?u.118} → {β : Sort ?u.117} → α ≃ β → β ≃ α Equiv.symm
mul_assoc f g h := ( trans_assoc : ∀ {α : Sort ?u.59} {β : Sort ?u.58} {γ : Sort ?u.57} {δ : Sort ?u.60} (ab : α ≃ β ) (bc : β ≃ γ ) (cd : γ ≃ δ ),
(ab .trans bc ).trans cd = ab .trans (bc .trans cd ) trans_assoc _ _ _ ). symm : ∀ {α : Sort ?u.68} {a b : α }, a = b → b = a symm
one_mul := trans_refl
mul_one := refl_trans
mul_left_inv := self_trans_symm
#align equiv.perm.perm_group Equiv.Perm.permGroup
@[ simp ]
theorem default_eq : ( default : Perm α ) = 1 :=
rfl : ∀ {α : Sort ?u.1517} {a : α }, a = a rfl
#align equiv.perm.default_eq Equiv.Perm.default_eq : ∀ {α : Type u}, default = 1 Equiv.Perm.default_eq
/-- The permutation of a type is equivalent to the units group of the endomorphisms monoid of this
type. -/
@[ simps ]
def equivUnitsEnd : Perm α ≃* Units ( Function.End : Type ?u.1539 → Type ?u.1539 Function.End α ) where
-- Porting note: needed to add `.toFun`.
toFun e := ⟨ e . toFun : {α : Sort ?u.2197} → {β : Sort ?u.2196} → α ≃ β → α → β toFun, e . symm : {α : Sort ?u.2202} → {β : Sort ?u.2201} → α ≃ β → β ≃ α symm. toFun : {α : Sort ?u.2206} → {β : Sort ?u.2205} → α ≃ β → α → β toFun, e . self_comp_symm : ∀ {α : Sort ?u.2211} {β : Sort ?u.2210} (e : α ≃ β ), ↑e ∘ ↑e .symm = id self_comp_symm, e . symm_comp_self : ∀ {α : Sort ?u.2228} {β : Sort ?u.2227} (e : α ≃ β ), ↑e .symm ∘ ↑e = id symm_comp_self⟩
invFun u :=
⟨( u : Function.End : Type ?u.2250 → Type ?u.2250 Function.End α ), (↑ u ⁻¹ : Function.End : Type ?u.3453 → Type ?u.3453 Function.End α ), congr_fun : ∀ {α : Sort ?u.4648} {β : α → Sort ?u.4647 } {f g : (x : α ) → β x }, f = g → ∀ (a : α ), f a = g a congr_fun u . inv_val : ∀ {α : Type ?u.4661} [inst : Monoid α ] (self : α ˣ ), self .inv * ↑self = 1 inv_val, congr_fun : ∀ {α : Sort ?u.4670} {β : α → Sort ?u.4669 } {f g : (x : α ) → β x }, f = g → ∀ (a : α ), f a = g a congr_fun u . val_inv : ∀ {α : Type ?u.4681} [inst : Monoid α ] (self : α ˣ ), ↑self * self .inv = 1 val_inv⟩
left_inv _ := ext : ∀ {α : Sort ?u.4695} {σ τ : Perm α }, (∀ (x : α ), ↑σ x = ↑τ x ) → σ = τ ext fun _ => rfl : ∀ {α : Sort ?u.4706} {a : α }, a = a rfl
right_inv _ := Units.ext rfl : ∀ {α : Sort ?u.4747} {a : α }, a = a rfl
map_mul' _ _ := rfl : ∀ {α : Sort ?u.4757} {a : α }, a = a rfl
#align equiv.perm.equiv_units_End Equiv.Perm.equivUnitsEnd
#align equiv.perm.equiv_units_End_symm_apply_apply Equiv.Perm.equivUnitsEnd_symm_apply_apply
#align equiv.perm.equiv_units_End_symm_apply_symm_apply Equiv.Perm.equivUnitsEnd_symm_apply_symm_apply
/-- Lift a monoid homomorphism `f : G →* Function.End α` to a monoid homomorphism
`f : G →* Equiv.Perm α`. -/
@[ simps! ]
def _root_.MonoidHom.toHomPerm { G : Type _ } [ Group G ] ( f : G →* Function.End : Type ?u.5523 → Type ?u.5523 Function.End α ) : G →* Perm α :=
equivUnitsEnd . symm : {M : Type ?u.6211} → {N : Type ?u.6210} → [inst : Mul M ] → [inst_1 : Mul N ] → M ≃* N → N ≃* M symm. toMonoidHom . comp f . toHomUnits
#align monoid_hom.to_hom_perm MonoidHom.toHomPerm
#align monoid_hom.to_hom_perm_apply_symm_apply MonoidHom.toHomPerm_apply_symm_apply
#align monoid_hom.to_hom_perm_apply_apply MonoidHom.toHomPerm_apply_apply
theorem mul_apply : ∀ {α : Type u} (f g : Perm α ) (x : α ), ↑(f * g ) x = ↑f (↑g x ) mul_apply ( f g : Perm α ) ( x ) : ( f * g ) x = f ( g x ) :=
Equiv.trans_apply : ∀ {α : Sort ?u.8589} {β : Sort ?u.8588} {γ : Sort ?u.8587} (f : α ≃ β ) (g : β ≃ γ ) (a : α ), ↑(f .trans g ) a = ↑g (↑f a ) Equiv.trans_apply _ _ _
#align equiv.perm.mul_apply Equiv.Perm.mul_apply : ∀ {α : Type u} (f g : Perm α ) (x : α ), ↑(f * g ) x = ↑f (↑g x ) Equiv.Perm.mul_apply
theorem one_apply : ∀ {α : Type u} (x : α ), ↑1 x = x one_apply ( x ) : ( 1 : Perm α ) x = x :=
rfl : ∀ {α : Sort ?u.8989} {a : α }, a = a rfl
#align equiv.perm.one_apply Equiv.Perm.one_apply : ∀ {α : Type u} (x : α ), ↑1 x = x Equiv.Perm.one_apply
@[ simp ]
theorem inv_apply_self : ∀ {α : Type u} (f : Perm α ) (x : α ), ↑f ⁻¹ (↑f x ) = x inv_apply_self ( f : Perm α ) ( x ) : f ⁻¹ ( f x ) = x :=
f . symm_apply_apply : ∀ {α : Sort ?u.9235} {β : Sort ?u.9234} (e : α ≃ β ) (x : α ), ↑e .symm (↑e x ) = x symm_apply_apply x
#align equiv.perm.inv_apply_self Equiv.Perm.inv_apply_self : ∀ {α : Type u} (f : Perm α ) (x : α ), ↑f ⁻¹ (↑f x ) = x Equiv.Perm.inv_apply_self
@[ simp ]
theorem apply_inv_self : ∀ {α : Type u} (f : Perm α ) (x : α ), ↑f (↑f ⁻¹ x ) = x apply_inv_self ( f : Perm α ) ( x ) : f ( f ⁻¹ x ) = x :=
f . apply_symm_apply : ∀ {α : Sort ?u.9506} {β : Sort ?u.9505} (e : α ≃ β ) (x : β ), ↑e (↑e .symm x ) = x apply_symm_apply x
#align equiv.perm.apply_inv_self Equiv.Perm.apply_inv_self : ∀ {α : Type u} (f : Perm α ) (x : α ), ↑f (↑f ⁻¹ x ) = x Equiv.Perm.apply_inv_self
theorem one_def : ( 1 : Perm α ) = Equiv.refl : (α : Sort ?u.9825) → α ≃ α Equiv.refl α :=
rfl : ∀ {α : Sort ?u.9828} {a : α }, a = a rfl
#align equiv.perm.one_def Equiv.Perm.one_def
theorem mul_def : ∀ {α : Type u} (f g : Perm α ), f * g = g .trans f mul_def ( f g : Perm α ) : f * g = g . trans : {α : Sort ?u.9852} → {β : Sort ?u.9851} → {γ : Sort ?u.9850} → α ≃ β → β ≃ γ → α ≃ γ trans f :=
rfl : ∀ {α : Sort ?u.10505} {a : α }, a = a rfl
#align equiv.perm.mul_def Equiv.Perm.mul_def : ∀ {α : Type u} (f g : Perm α ), f * g = g .trans f Equiv.Perm.mul_def
theorem inv_def ( f : Perm : Sort ?u.10519 → Sort (max1?u.10519) Perm α ) : f ⁻¹ = f . symm : {α : Sort ?u.10600} → {β : Sort ?u.10599} → α ≃ β → β ≃ α symm :=
rfl : ∀ {α : Sort ?u.10611} {a : α }, a = a rfl
#align equiv.perm.inv_def Equiv.Perm.inv_def : ∀ {α : Type u} (f : Perm α ), f ⁻¹ = f .symm Equiv.Perm.inv_def
@[ simp , norm_cast ] lemma coe_one : ∀ {α : Type u}, ↑1 = id coe_one : ⇑( 1 : Perm : Sort ?u.10626 → Sort (max1?u.10626) Perm α ) = id : {α : Sort ?u.10982} → α → α id := rfl : ∀ {α : Sort ?u.11021} {a : α }, a = a rfl
#align equiv.perm.coe_one Equiv.Perm.coe_one : ∀ {α : Type u}, ↑1 = id Equiv.Perm.coe_one
@[ simp , norm_cast ] lemma coe_mul : ∀ {α : Type u} (f g : Perm α ), ↑(f * g ) = ↑f ∘ ↑g coe_mul ( f g : Perm : Sort ?u.11111 → Sort (max1?u.11111) Perm α ) : ⇑( f * g ) = f ∘ g := rfl : ∀ {α : Sort ?u.11981} {a : α }, a = a rfl
#align equiv.perm.coe_mul Equiv.Perm.coe_mul : ∀ {α : Type u} (f g : Perm α ), ↑(f * g ) = ↑f ∘ ↑g Equiv.Perm.coe_mul
@[ norm_cast ] lemma coe_pow ( f : Perm : Sort ?u.12147 → Sort (max1?u.12147) Perm α ) ( n : ℕ ) : ⇑( f ^ n ) = f ^[ n ] :=
hom_coe_pow : ∀ {M : Type ?u.16561} {F : Type ?u.16560} [inst : Monoid F ] (c : F → M → M ),
c 1 = id → (∀ (f g : F ), c (f * g ) = c f ∘ c g ) → ∀ (f : F ) (n : ℕ ), c (f ^ n ) = c f ^[ n ] hom_coe_pow _ : ?m.16563 → ?m.16562 → ?m.16562
_ rfl : ∀ {α : Sort ?u.16566} {a : α }, a = a rfl ( fun _ _ ↦ rfl : ∀ {α : Sort ?u.17046} {a : α }, a = a rfl) _ _
#align equiv.perm.coe_pow Equiv.Perm.coe_pow : ∀ {α : Type u} (f : Perm α ) (n : ℕ ), ↑(f ^ n ) = ↑f ^[ n ] Equiv.Perm.coe_pow
@[ simp ] lemma iterate_eq_pow : ∀ (f : Perm α ) (n : ℕ ), ↑f ^[ n ] = ↑(f ^ n ) iterate_eq_pow ( f : Perm : Sort ?u.17420 → Sort (max1?u.17420) Perm α ) ( n : ℕ ) : f ^[ n ] = ⇑( f ^ n ) := ( coe_pow : ∀ {α : Type ?u.21833} (f : Perm α ) (n : ℕ ), ↑(f ^ n ) = ↑f ^[ n ] coe_pow _ _ ). symm : ∀ {α : Sort ?u.21837} {a b : α }, a = b → b = a symm
#align equiv.perm.iterate_eq_pow Equiv.Perm.iterate_eq_pow : ∀ {α : Type u} (f : Perm α ) (n : ℕ ), ↑f ^[ n ] = ↑(f ^ n ) Equiv.Perm.iterate_eq_pow
theorem eq_inv_iff_eq : ∀ {α : Type u} {f : Perm α } {x y : α }, x = ↑f ⁻¹ y ↔ ↑f x = y eq_inv_iff_eq { f : Perm : Sort ?u.21897 → Sort (max1?u.21897) Perm α } { x y : α } : x = f ⁻¹ y ↔ f x = y :=
f . eq_symm_apply : ∀ {α : Sort ?u.22131} {β : Sort ?u.22132} (e : α ≃ β ) {x : β } {y : (fun x => α ) x }, y = ↑e .symm x ↔ ↑e y = x eq_symm_apply
#align equiv.perm.eq_inv_iff_eq Equiv.Perm.eq_inv_iff_eq : ∀ {α : Type u} {f : Perm α } {x y : α }, x = ↑f ⁻¹ y ↔ ↑f x = y Equiv.Perm.eq_inv_iff_eq
theorem inv_eq_iff_eq : ∀ {α : Type u} {f : Perm α } {x y : α }, ↑f ⁻¹ x = y ↔ x = ↑f y inv_eq_iff_eq { f : Perm : Sort ?u.22166 → Sort (max1?u.22166) Perm α } { x y : α } : f ⁻¹ x = y ↔ x = f y :=
f . symm_apply_eq : ∀ {α : Sort ?u.22400} {β : Sort ?u.22401} (e : α ≃ β ) {x : β } {y : (fun x => α ) x }, ↑e .symm x = y ↔ x = ↑e y symm_apply_eq
#align equiv.perm.inv_eq_iff_eq Equiv.Perm.inv_eq_iff_eq : ∀ {α : Type u} {f : Perm α } {x y : α }, ↑f ⁻¹ x = y ↔ x = ↑f y Equiv.Perm.inv_eq_iff_eq
theorem zpow_apply_comm : ∀ {α : Type u_1} (σ : Perm α ) (m n : ℤ ) {x : α }, ↑(σ ^ m ) (↑(σ ^ n ) x ) = ↑(σ ^ n ) (↑(σ ^ m ) x ) zpow_apply_comm { α : Type _ : Type (?u.22435+1) Type _} ( σ : Perm : Sort ?u.22438 → Sort (max1?u.22438) Perm α ) ( m n : ℤ ) { x : α } :
( σ ^ m ) (( σ ^ n ) x ) = ( σ ^ n ) (( σ ^ m ) x ) := by
↑(σ ^ m ) (↑(σ ^ n ) x ) = ↑(σ ^ n ) (↑(σ ^ m ) x ) rw [ ↑(σ ^ m ) (↑(σ ^ n ) x ) = ↑(σ ^ n ) (↑(σ ^ m ) x ) ← Equiv.Perm.mul_apply : ∀ {α : Type ?u.39141} (f g : Perm α ) (x : α ), ↑(f * g ) x = ↑f (↑g x ) Equiv.Perm.mul_apply, ↑(σ ^ m * σ ^ n ) x = ↑(σ ^ n ) (↑(σ ^ m ) x ) ↑(σ ^ m ) (↑(σ ^ n ) x ) = ↑(σ ^ n ) (↑(σ ^ m ) x ) ← Equiv.Perm.mul_apply : ∀ {α : Type ?u.39202} (f g : Perm α ) (x : α ), ↑(f * g ) x = ↑f (↑g x ) Equiv.Perm.mul_apply, ↑(σ ^ m * σ ^ n ) x = ↑(σ ^ n * σ ^ m ) x ↑(σ ^ m ) (↑(σ ^ n ) x ) = ↑(σ ^ n ) (↑(σ ^ m ) x ) zpow_mul_comm : ∀ {G : Type ?u.39231} [inst : Group G ] (a : G ) (i j : ℤ ), a ^ i * a ^ j = a ^ j * a ^ i zpow_mul_comm↑(σ ^ n * σ ^ m ) x = ↑(σ ^ n * σ ^ m ) x ]
#align equiv.perm.zpow_apply_comm Equiv.Perm.zpow_apply_comm : ∀ {α : Type u_1} (σ : Perm α ) (m n : ℤ ) {x : α }, ↑(σ ^ m ) (↑(σ ^ n ) x ) = ↑(σ ^ n ) (↑(σ ^ m ) x ) Equiv.Perm.zpow_apply_comm
@[ simp ] lemma image_inv ( f : Perm : Sort ?u.39319 → Sort (max1?u.39319) Perm α ) ( s : Set α ) : ↑ f ⁻¹ '' s = f ⁻¹' s := f ⁻¹. image_eq_preimage : ∀ {α : Type ?u.39569} {β : Type ?u.39570} (e : α ≃ β ) (s : Set α ), ↑e '' s = ↑e .symm ⁻¹' s image_eq_preimage _
#align equiv.perm.image_inv Equiv.Perm.image_inv
@[ simp ] lemma preimage_inv ( f : Perm : Sort ?u.39627 → Sort (max1?u.39627) Perm α ) ( s : Set α ) : ↑ f ⁻¹ ⁻¹' s = f '' s :=
( f . image_eq_preimage : ∀ {α : Type ?u.39874} {β : Type ?u.39875} (e : α ≃ β ) (s : Set α ), ↑e '' s = ↑e .symm ⁻¹' s image_eq_preimage _ ). symm : ∀ {α : Sort ?u.39885} {a b : α }, a = b → b = a symm
#align equiv.perm.preimage_inv Equiv.Perm.preimage_inv
/-! Lemmas about mixing `Perm` with `Equiv`. Because we have multiple ways to express
`Equiv.refl`, `Equiv.symm`, and `Equiv.trans`, we want simp lemmas for every combination.
The assumption made here is that if you're using the group structure, you want to preserve it after
simp. -/
@[ simp ]
theorem trans_one : ∀ {α : Sort u_1} {β : Type u_2} (e : α ≃ β ), e .trans 1 = e trans_one { α : Sort _ } { β : Type _ : Type (?u.39945+1) Type _} ( e : α ≃ β ) : e . trans : {α : Sort ?u.39955} → {β : Sort ?u.39954} → {γ : Sort ?u.39953} → α ≃ β → β ≃ γ → α ≃ γ trans ( 1 : Perm : Sort ?u.39967 → Sort (max1?u.39967) Perm β ) = e :=
Equiv.trans_refl e
#align equiv.perm.trans_one Equiv.Perm.trans_one : ∀ {α : Sort u_1} {β : Type u_2} (e : α ≃ β ), e .trans 1 = e Equiv.Perm.trans_one
@[ simp ]
theorem mul_refl ( e : Perm : Sort ?u.40294 → Sort (max1?u.40294) Perm α ) : e * Equiv.refl : (α : Sort ?u.40301) → α ≃ α Equiv.refl α = e :=
Equiv.trans_refl e
#align equiv.perm.mul_refl Equiv.Perm.mul_refl
@[ simp ]
theorem one_symm : ∀ {α : Type u}, 1 .symm = 1 one_symm : ( 1 : Perm : Sort ?u.41008 → Sort (max1?u.41008) Perm α ). symm : {α : Sort ?u.41286} → {β : Sort ?u.41285} → α ≃ β → β ≃ α symm = 1 :=
Equiv.refl_symm
#align equiv.perm.one_symm Equiv.Perm.one_symm : ∀ {α : Type u}, 1 .symm = 1 Equiv.Perm.one_symm
@[ simp ]
theorem refl_inv : ( Equiv.refl : (α : Sort ?u.41550) → α ≃ α Equiv.refl α : Perm : Sort ?u.41549 → Sort (max1?u.41549) Perm α )⁻¹ = 1 :=
Equiv.refl_symm
#align equiv.perm.refl_inv Equiv.Perm.refl_inv
@[ simp ]
theorem one_trans : ∀ {α : Type u_1} {β : Sort u_2} (e : α ≃ β ), 1 .trans e = e one_trans { α : Type _ : Type (?u.41921+1) Type _} { β : Sort _ } ( e : α ≃ β ) : ( 1 : Perm : Sort ?u.41933 → Sort (max1?u.41933) Perm α ). trans : {α : Sort ?u.42212} → {β : Sort ?u.42211} → {γ : Sort ?u.42210} → α ≃ β → β ≃ γ → α ≃ γ trans e = e :=
Equiv.refl_trans e
#align equiv.perm.one_trans Equiv.Perm.one_trans : ∀ {α : Type u_1} {β : Sort u_2} (e : α ≃ β ), 1 .trans e = e Equiv.Perm.one_trans
@[ simp ]
theorem refl_mul ( e : Perm : Sort ?u.42272 → Sort (max1?u.42272) Perm α ) : Equiv.refl : (α : Sort ?u.42279) → α ≃ α Equiv.refl α * e = e :=
Equiv.refl_trans e
#align equiv.perm.refl_mul Equiv.Perm.refl_mul
@[ simp ]
theorem inv_trans_self : ∀ (e : Perm α ), e ⁻¹ .trans e = 1 inv_trans_self ( e : Perm : Sort ?u.42985 → Sort (max1?u.42985) Perm α ) : e ⁻¹. trans : {α : Sort ?u.43067} → {β : Sort ?u.43066} → {γ : Sort ?u.43065} → α ≃ β → β ≃ γ → α ≃ γ trans e = 1 :=
Equiv.symm_trans_self : ∀ {α : Sort ?u.43356} {β : Sort ?u.43355} (e : α ≃ β ), e .symm .trans e = Equiv.refl β Equiv.symm_trans_self e
#align equiv.perm.inv_trans_self Equiv.Perm.inv_trans_self : ∀ {α : Type u} (e : Perm α ), e ⁻¹ .trans e = 1 Equiv.Perm.inv_trans_self
@[ simp ]
theorem mul_symm : ∀ {α : Type u} (e : Perm α ), e * e .symm = 1 mul_symm ( e : Perm : Sort ?u.43390 → Sort (max1?u.43390) Perm α ) : e * e . symm : {α : Sort ?u.43398} → {β : Sort ?u.43397} → α ≃ β → β ≃ α symm = 1 :=
Equiv.symm_trans_self : ∀ {α : Sort ?u.44293} {β : Sort ?u.44292} (e : α ≃ β ), e .symm .trans e = Equiv.refl β Equiv.symm_trans_self e
#align equiv.perm.mul_symm Equiv.Perm.mul_symm : ∀ {α : Type u} (e : Perm α ), e * e .symm = 1 Equiv.Perm.mul_symm
@[ simp ]
theorem self_trans_inv : ∀ {α : Type u} (e : Perm α ), e .trans e ⁻¹ = 1 self_trans_inv ( e : Perm : Sort ?u.44323 → Sort (max1?u.44323) Perm α ) : e . trans : {α : Sort ?u.44329} → {β : Sort ?u.44328} → {γ : Sort ?u.44327} → α ≃ β → β ≃ γ → α ≃ γ trans e ⁻¹ = 1 :=
Equiv.self_trans_symm : ∀ {α : Sort ?u.44718} {β : Sort ?u.44717} (e : α ≃ β ), e .trans e .symm = Equiv.refl α Equiv.self_trans_symm e
#align equiv.perm.self_trans_inv Equiv.Perm.self_trans_inv : ∀ {α : Type u} (e : Perm α ), e .trans e ⁻¹ = 1 Equiv.Perm.self_trans_inv
@[ simp ]
theorem symm_mul : ∀ {α : Type u} (e : Perm α ), e .symm * e = 1 symm_mul ( e : Perm : Sort ?u.44752 → Sort (max1?u.44752) Perm α ) : e . symm : {α : Sort ?u.44760} → {β : Sort ?u.44759} → α ≃ β → β ≃ α symm * e = 1 :=
Equiv.self_trans_symm : ∀ {α : Sort ?u.45657} {β : Sort ?u.45656} (e : α ≃ β ), e .trans e .symm = Equiv.refl α Equiv.self_trans_symm e
#align equiv.perm.symm_mul Equiv.Perm.symm_mul : ∀ {α : Type u} (e : Perm α ), e .symm * e = 1 Equiv.Perm.symm_mul
/-! Lemmas about `Equiv.Perm.sumCongr` re-expressed via the group structure. -/
@[ simp ]
theorem sumCongr_mul { α β : Type _ : Type (?u.45690+1) Type _} ( e : Perm : Sort ?u.45693 → Sort (max1?u.45693) Perm α ) ( f : Perm : Sort ?u.45696 → Sort (max1?u.45696) Perm β ) ( g : Perm : Sort ?u.45699 → Sort (max1?u.45699) Perm α ) ( h : Perm : Sort ?u.45702 → Sort (max1?u.45702) Perm β ) :
sumCongr e f * sumCongr g h = sumCongr ( e * g ) ( f * h ) :=
sumCongr_trans g h e f
#align equiv.perm.sum_congr_mul Equiv.Perm.sumCongr_mul
@[ simp ]
theorem sumCongr_inv { α β : Type _ : Type (?u.47228+1) Type _} ( e : Perm : Sort ?u.47231 → Sort (max1?u.47231) Perm α ) ( f : Perm : Sort ?u.47234 → Sort (max1?u.47234) Perm β ) :
( sumCongr e f )⁻¹ = sumCongr e ⁻¹ f ⁻¹ :=
sumCongr_symm e f
#align equiv.perm.sum_congr_inv Equiv.Perm.sumCongr_inv
@[ simp ]
theorem sumCongr_one { α β : Type _ : Type (?u.47595+1) Type _} : sumCongr ( 1 : Perm : Sort ?u.47604 → Sort (max1?u.47604) Perm α ) ( 1 : Perm : Sort ?u.47882 → Sort (max1?u.47882) Perm β ) = 1 :=
sumCongr_refl
#align equiv.perm.sum_congr_one Equiv.Perm.sumCongr_one
/-- `Equiv.Perm.sumCongr` as a `MonoidHom`, with its two arguments bundled into a single `prod`.
This is particularly useful for its `MonoidHom.range` projection, which is the subgroup of
permutations which do not exchange elements between `α` and `β`. -/
@[ simps ]
def sumCongrHom ( α β : Type _ : Type (?u.48501+1) Type _) : Perm : Sort ?u.48508 → Sort (max1?u.48508) Perm α × Perm : Sort ?u.48509 → Sort (max1?u.48509) Perm β →* Perm : Sort ?u.48510 → Sort (max1?u.48510) Perm ( Sum : Type ?u.48512 → Type ?u.48511 → Type (max?u.48512?u.48511) Sum α β ) where
toFun a := sumCongr a . 1 : {α : Type ?u.50570} → {β : Type ?u.50569} → α × β → α 1 a . 2 : {α : Type ?u.50577} → {β : Type ?u.50576} → α × β → β 2
map_one' := sumCongr_one
map_mul' _ _ := ( sumCongr_mul _ _ _ _ ). symm : ∀ {α : Sort ?u.50611} {a b : α }, a = b → b = a symm
#align equiv.perm.sum_congr_hom Equiv.Perm.sumCongrHom
#align equiv.perm.sum_congr_hom_apply Equiv.Perm.sumCongrHom_apply
theorem sumCongrHom_injective { α β : Type _ : Type (?u.51431+1) Type _} : Function.Injective : {α : Sort ?u.51438} → {β : Sort ?u.51437} → (α → β ) → Prop Function.Injective ( sumCongrHom α β ) := by
rintro ⟨⟩ ⟨⟩ h mk.mk (fst✝¹ , snd✝¹ ) = (fst✝ , snd✝ )
rw [ mk.mk (fst✝¹ , snd✝¹ ) = (fst✝ , snd✝ ) Prod.mk.inj_iff : ∀ {α : Type ?u.52030} {β : Type ?u.52031} {a₁ a₂ : α } {b₁ b₂ : β }, (a₁ , b₁ ) = (a₂ , b₂ ) ↔ a₁ = a₂ ∧ b₁ = b₂ Prod.mk.inj_iffmk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝ ] mk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝
constructor mk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝ <;> mk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝ ext i
· mk.mk.left.H mk.mk.right.H simpa using Equiv.congr_fun : ∀ {α : Sort ?u.52333} {β : Sort ?u.52332} {f g : α ≃ β }, f = g → ∀ (x : α ), ↑f x = ↑g x Equiv.congr_fun h ( Sum.inl : {α : Type ?u.52349} → {β : Type ?u.52348} → α → α ⊕ β Sum.inl i )
· simpa using Equiv.congr_fun : ∀ {α : Sort ?u.53080} {β : Sort ?u.53079} {f g : α ≃ β }, f = g → ∀ (x : α ), ↑f x = ↑g x Equiv.congr_fun h ( Sum.inr : {α : Type ?u.53091} → {β : Type ?u.53090} → β → α ⊕ β Sum.inr i )
#align equiv.perm.sum_congr_hom_injective Equiv.Perm.sumCongrHom_injective
@[ simp ]
theorem sumCongr_swap_one { α β : Type _ : Type (?u.53431+1) Type _} [ DecidableEq : Sort ?u.53434 → Sort (max1?u.53434) DecidableEq α ] [ DecidableEq : Sort ?u.53443 → Sort (max1?u.53443) DecidableEq β ] ( i j : α ) :
sumCongr ( Equiv.swap i j ) ( 1 : Perm : Sort ?u.53560 → Sort (max1?u.53560) Perm β ) = Equiv.swap ( Sum.inl : {α : Type ?u.53841} → {β : Type ?u.53840} → α → α ⊕ β Sum.inl i ) ( Sum.inl : {α : Type ?u.53847} → {β : Type ?u.53846} → α → α ⊕ β Sum.inl j ) :=
sumCongr_swap_refl i j
#align equiv.perm.sum_congr_swap_one Equiv.Perm.sumCongr_swap_one
@[ simp ]
theorem sumCongr_one_swap { α β : Type _ : Type (?u.54596+1) Type _} [ DecidableEq : Sort ?u.54599 → Sort (max1?u.54599) DecidableEq α ] [ DecidableEq : Sort ?u.54608 → Sort (max1?u.54608) DecidableEq β ] ( i j : β ) :
sumCongr ( 1 : Perm : Sort ?u.54627 → Sort (max1?u.54627) Perm α ) ( Equiv.swap i j ) = Equiv.swap ( Sum.inr : {α : Type ?u.55000} → {β : Type ?u.54999} → β → α ⊕ β Sum.inr i ) ( Sum.inr : {α : Type ?u.55006} → {β : Type ?u.55005} → β → α ⊕ β Sum.inr j ) :=
sumCongr_refl_swap i j
#align equiv.perm.sum_congr_one_swap Equiv.Perm.sumCongr_one_swap
/-! Lemmas about `Equiv.Perm.sigmaCongrRight` re-expressed via the group structure. -/
@[ simp ]
theorem sigmaCongrRight_mul { α : Type _ : Type (?u.55662+1) Type _} { β : α → Type _ : Type (?u.55667+1) Type _} ( F : ∀ a , Perm : Sort ?u.55674 → Sort (max1?u.55674) Perm ( β a ))
( G : ∀ a , Perm : Sort ?u.55682 → Sort (max1?u.55682) Perm ( β a )) : sigmaCongrRight : {α : Type ?u.55691} → {β : α → Type ?u.55690 } → ((a : α ) → Perm (β a ) ) → Perm ((a : α ) × β a ) sigmaCongrRight F * sigmaCongrRight : {α : Type ?u.55702} → {β : α → Type ?u.55701 } → ((a : α ) → Perm (β a ) ) → Perm ((a : α ) × β a ) sigmaCongrRight G = sigmaCongrRight : {α : Type ?u.55712} → {β : α → Type ?u.55711 } → ((a : α ) → Perm (β a ) ) → Perm ((a : α ) × β a ) sigmaCongrRight ( F * G ) :=
sigmaCongrRight_trans G F
#align equiv.perm.sigma_congr_right_mul Equiv.Perm.sigmaCongrRight_mul
@[ simp ]
theorem sigmaCongrRight_inv { α : Type _ : Type (?u.57366+1) Type _} { β : α → Type _ : Type (?u.57371+1) Type _} ( F : ∀ a , Perm : Sort ?u.57378 → Sort (max1?u.57378) Perm ( β a )) :
( sigmaCongrRight : {α : Type ?u.57387} → {β : α → Type ?u.57386 } → ((a : α ) → Perm (β a ) ) → Perm ((a : α ) × β a ) sigmaCongrRight F )⁻¹ = sigmaCongrRight : {α : Type ?u.57475} → {β : α → Type ?u.57474 } → ((a : α ) → Perm (β a ) ) → Perm ((a : α ) × β a ) sigmaCongrRight fun a => ( F a )⁻¹ :=
sigmaCongrRight_symm F
#align equiv.perm.sigma_congr_right_inv Equiv.Perm.sigmaCongrRight_inv
@[ simp ]
theorem sigmaCongrRight_one { α : Type _ : Type (?u.57658+1) Type _} { β : α → Type _ : Type (?u.57663+1) Type _} :
sigmaCongrRight : {α : Type ?u.57668} → {β : α → Type ?u.57667 } → ((a : α ) → Perm (β a ) ) → Perm ((a : α ) × β a ) sigmaCongrRight ( 1 : ∀ a , Equiv.Perm : Sort ?u.57676 → Sort (max1?u.57676) Equiv.Perm <| β a ) = 1 :=
sigmaCongrRight_refl
#align equiv.perm.sigma_congr_right_one Equiv.Perm.sigmaCongrRight_one
/-- `Equiv.Perm.sigmaCongrRight` as a `MonoidHom`.
This is particularly useful for its `MonoidHom.range` projection, which is the subgroup of
permutations which do not exchange elements between fibers. -/
@[ simps ]
def sigmaCongrRightHom : {α : Type u_1} → (β : α → Type u_2 ) → ((a : α ) → Perm (β a ) ) →* Perm ((a : α ) × β a ) sigmaCongrRightHom { α : Type _ : Type (?u.58704+1) Type _} ( β : α → Type _ : Type (?u.58709+1) Type _) : (∀ a , Perm : Sort ?u.58718 → Sort (max1?u.58718) Perm ( β a )) →* Perm : Sort ?u.58720 → Sort (max1?u.58720) Perm (Σ a , β a ) where
toFun := sigmaCongrRight : {α : Type ?u.61227} → {β : α → Type ?u.61226 } → ((a : α ) → Perm (β a ) ) → Perm ((a : α ) × β a ) sigmaCongrRight
map_one' := sigmaCongrRight_one
map_mul' _ _ := ( sigmaCongrRight_mul _ : (a : ?m.61277 ) → Perm (?m.61278 a ) _ _ : (a : ?m.61277 ) → Perm (?m.61278 a ) _). symm : ∀ {α : Sort ?u.61281} {a b : α }, a = b → b = a symm
#align equiv.perm.sigma_congr_right_hom Equiv.Perm.sigmaCongrRightHom : {α : Type u_1} → (β : α → Type u_2 ) → ((a : α ) → Perm (β a ) ) →* Perm ((a : α ) × β a ) Equiv.Perm.sigmaCongrRightHom
#align equiv.perm.sigma_congr_right_hom_apply Equiv.Perm.sigmaCongrRightHom_apply
theorem sigmaCongrRightHom_injective { α : Type _ : Type (?u.61990+1) Type _} { β : α → Type _ : Type (?u.61995+1) Type _} :
Function.Injective : {α : Sort ?u.61999} → {β : Sort ?u.61998} → (α → β ) → Prop Function.Injective ( sigmaCongrRightHom : {α : Type ?u.62003} → (β : α → Type ?u.62002 ) → ((a : α ) → Perm (β a ) ) →* Perm ((a : α ) × β a ) sigmaCongrRightHom β ) := by
intro x y h
ext ( a b )
simpa using Equiv.congr_fun : ∀ {α : Sort ?u.62856} {β : Sort ?u.62855} {f g : α ≃ β }, f = g → ∀ (x : α ), ↑f x = ↑g x Equiv.congr_fun h ⟨ a , b ⟩
#align equiv.perm.sigma_congr_right_hom_injective Equiv.Perm.sigmaCongrRightHom_injective
/-- `Equiv.Perm.subtypeCongr` as a `MonoidHom`. -/
@[ simps ]
def subtypeCongrHom ( p : α → Prop ) [ DecidablePred : {α : Sort ?u.63569} → (α → Prop ) → Sort (max1?u.63569) DecidablePred p ] :
Perm : Sort ?u.63583 → Sort (max1?u.63583) Perm { a // p a } × Perm : Sort ?u.63591 → Sort (max1?u.63591) Perm { a // ¬ p a } →* Perm : Sort ?u.63599 → Sort (max1?u.63599) Perm α where
toFun pair := Perm.subtypeCongr pair . fst : {α : Type ?u.65616} → {β : Type ?u.65615} → α × β → α fst pair . snd : {α : Type ?u.65627} → {β : Type ?u.65626} → α × β → β snd
map_one' := Perm.subtypeCongr.refl
map_mul' _ _ := ( Perm.subtypeCongr.trans _ : Perm { a // ?m.65794 a } _ _ : Perm { a // ?m.65794 a } _ _ : Perm { a // ¬ ?m.65794 a } _ _ : Perm { a // ¬ ?m.65794 a } _). symm : ∀ {α : Sort ?u.65917} {a b : α }, a = b → b = a symm
#align equiv.perm.subtype_congr_hom Equiv.Perm.subtypeCongrHom
#align equiv.perm.subtype_congr_hom_apply Equiv.Perm.subtypeCongrHom_apply
theorem subtypeCongrHom_injective ( p : α → Prop ) [ DecidablePred : {α : Sort ?u.66145} → (α → Prop ) → Sort (max1?u.66145) DecidablePred p ] :
Function.Injective : {α : Sort ?u.66156} → {β : Sort ?u.66155} → (α → β ) → Prop Function.Injective ( subtypeCongrHom p ) := by
rintro ⟨⟩ ⟨⟩ h mk.mk (fst✝¹ , snd✝¹ ) = (fst✝ , snd✝ )
rw [ mk.mk (fst✝¹ , snd✝¹ ) = (fst✝ , snd✝ ) Prod.mk.inj_iff : ∀ {α : Type ?u.66753} {β : Type ?u.66754} {a₁ a₂ : α } {b₁ b₂ : β }, (a₁ , b₁ ) = (a₂ , b₂ ) ↔ a₁ = a₂ ∧ b₁ = b₂ Prod.mk.inj_iffmk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝ ] mk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝
constructor mk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝ <;> mk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝ ext i mk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝ <;> mk.mk.left.H.a mk.mk.right.H.a mk.mk fst✝¹ = fst✝ ∧ snd✝¹ = snd✝ simpa using Equiv.congr_fun : ∀ {α : Sort ?u.67034} {β : Sort ?u.67033} {f g : α ≃ β }, f = g → ∀ (x : α ), ↑f x = ↑g x Equiv.congr_fun h i
#align equiv.perm.subtype_congr_hom_injective Equiv.Perm.subtypeCongrHom_injective
/-- If `e` is also a permutation, we can write `permCongr`
completely in terms of the group structure. -/
@[ simp ]
theorem permCongr_eq_mul ( e p : Perm : Sort ?u.69156 → Sort (max1?u.69156) Perm α ) : e . permCongr p = e * p * e ⁻¹ :=
rfl : ∀ {α : Sort ?u.70243} {a : α }, a = a rfl
#align equiv.perm.perm_congr_eq_mul Equiv.Perm.permCongr_eq_mul
section ExtendDomain
/-! Lemmas about `Equiv.Perm.extendDomain` re-expressed via the group structure. -/
variable ( e : Perm : Sort ?u.70307 → Sort (max1?u.70307) Perm α ) { p : β → Prop } [ DecidablePred : {α : Sort ?u.70314} → (α → Prop ) → Sort (max1?u.70314) DecidablePred p ] ( f : α ≃ Subtype : {α : Sort ?u.70326} → (α → Prop ) → Sort (max1?u.70326) Subtype p )
@[ simp ]
theorem extendDomain_one : extendDomain 1 f = 1 :=
extendDomain_refl f
#align equiv.perm.extend_domain_one Equiv.Perm.extendDomain_one
@[ simp ]
theorem extendDomain_inv : ( e . extendDomain f )⁻¹ = e ⁻¹. extendDomain f :=
rfl : ∀ {α : Sort ?u.71371} {a : α }, a = a rfl
#align equiv.perm.extend_domain_inv Equiv.Perm.extendDomain_inv
@[ simp ]
theorem extendDomain_mul ( e e' : Perm : Sort ?u.71514 → Sort (max1?u.71514) Perm α ) :
e . extendDomain f * e' . extendDomain f = ( e * e' ). extendDomain f :=
extendDomain_trans _ _ _
#align equiv.perm.extend_domain_mul Equiv.Perm.extendDomain_mul
/-- `extendDomain` as a group homomorphism -/
@[ simps ]
def extendDomainHom : Perm : Sort ?u.73098 → Sort (max1?u.73098) Perm α →* Perm : Sort ?u.73099 → Sort (max1?u.73099) Perm β where
toFun e := extendDomain e f
map_one' := extendDomain_one f
map_mul' e e' := ( extendDomain_mul f e e' ). symm : ∀ {α : Sort ?u.74142} {a b : α }, a = b → b = a symm
#align equiv.perm.extend_domain_hom Equiv.Perm.extendDomainHom
#align equiv.perm.extend_domain_hom_apply Equiv.Perm.extendDomainHom_apply
theorem extendDomainHom_injective : Function.Injective : {α : Sort ?u.74334} → {β : Sort ?u.74333} → (α → β ) → Prop Function.Injective ( extendDomainHom f ) :=
( injective_iff_map_eq_one ( extendDomainHom f )). mpr : ∀ {a b : Prop }, (a ↔ b ) → b → a mpr fun e he =>
ext : ∀ {α : Sort ?u.75241} {σ τ : Perm α }, (∀ (x : α ), ↑σ x = ↑τ x ) → σ = τ ext fun x =>
f . injective ( Subtype.ext : ∀ {α : Sort ?u.75264} {p : α → Prop } {a1 a2 : { x // p x } }, ↑a1 = ↑a2 → a1 = a2 Subtype.ext (( extendDomain_apply_image e f x ). symm : ∀ {α : Sort ?u.75296} {a b : α }, a = b → b = a symm . trans : ∀ {α : Sort ?u.75301} {a b c : α }, a = b → b = c → a = c trans ( ext_iff : ∀ {α : Sort ?u.75312} {σ τ : Perm α }, σ = τ ↔ ∀ (x : α ), ↑σ x = ↑τ x ext_iff. mp : ∀ {a b : Prop }, (a ↔ b ) → a → b mp he ( f x ))))
#align equiv.perm.extend_domain_hom_injective Equiv.Perm.extendDomainHom_injective
@[ simp ]
theorem extendDomain_eq_one_iff { e : Perm : Sort ?u.75851 → Sort (max1?u.75851) Perm α } { f : α ≃ Subtype : {α : Sort ?u.75856} → (α → Prop ) → Sort (max1?u.75856) Subtype p } : e . extendDomain f = 1 ↔ e = 1 :=
( injective_iff_map_eq_one' ( extendDomainHom f )). mp : ∀ {a b : Prop }, (a ↔ b ) → a → b mp ( extendDomainHom_injective f ) e
#align equiv.perm.extend_domain_eq_one_iff Equiv.Perm.extendDomain_eq_one_iff
@[ simp ]
lemma extendDomain_pow ( n : ℕ ) : ( e ^ n ). extendDomain f = e . extendDomain f ^ n :=
map_pow ( extendDomainHom f ) _ _
@[ simp ]
lemma extendDomain_zpow ( n : ℤ ) : ( e ^ n ). extendDomain f = e . extendDomain f ^ n :=
map_zpow ( extendDomainHom f ) _ _
end ExtendDomain
section Subtype
variable { p : α → Prop } { f : Perm : Sort ?u.118942 → Sort (max1?u.118942) Perm α }
/-- If the permutation `f` fixes the subtype `{x // p x}`, then this returns the permutation
on `{x // p x}` induced by `f`. -/
def subtypePerm : (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm ( f : Perm : Sort ?u.95060 → Sort (max1?u.95060) Perm α ) ( h : ∀ (x : α ), p x ↔ p (↑f x ) h : ∀ x , p x ↔ p ( f x )) : Perm : Sort ?u.95149 → Sort (max1?u.95149) Perm { x // p x } where
toFun := fun x => ⟨ f x , ( h : ∀ (x : α ), p x ↔ p (↑f x ) h _ ). 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 x . 2 ⟩
invFun := fun x => ⟨ f ⁻¹ x , ( h : ∀ (x : α ), p x ↔ p (↑f x ) h ( f ⁻¹ x )). 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 <| by α : Type uβ : Type vp : α → Prop f✝, f : Perm α h : ∀ (x : α ), p x ↔ p (↑f x ) x : { x // p x } simpa using x . 2 ⟩
left_inv _ := by α : Type uβ : Type vp : α → 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✝ simp only [ Perm.inv_apply_self : ∀ {α : Type ?u.95829} (f : Perm α ) (x : α ), ↑f ⁻¹ (↑f x ) = x Perm.inv_apply_self, Subtype.coe_eta : ∀ {α : Sort ?u.95839} {p : α → Prop } (a : { a // p a } ) (h : p ↑a ), { val := ↑a , property := h } = a Subtype.coe_eta, Subtype.coe_mk : ∀ {α : Sort ?u.95854} {p : α → Prop } (a : α ) (h : p a ), ↑{ val := a , property := h } = a Subtype.coe_mk]
right_inv _ := by α : Type uβ : Type vp : α → 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✝ simp only [ Perm.apply_inv_self : ∀ {α : Type ?u.95956} (f : Perm α ) (x : α ), ↑f (↑f ⁻¹ x ) = x Perm.apply_inv_self, Subtype.coe_eta : ∀ {α : Sort ?u.95964} {p : α → Prop } (a : { a // p a } ) (h : p ↑a ), { val := ↑a , property := h } = a Subtype.coe_eta, Subtype.coe_mk : ∀ {α : Sort ?u.95974} {p : α → Prop } (a : α ) (h : p a ), ↑{ val := a , property := h } = a Subtype.coe_mk]
#align equiv.perm.subtype_perm Equiv.Perm.subtypePerm : {α : Type u} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } Equiv.Perm.subtypePerm
@[ simp ]
theorem subtypePerm_apply : ∀ {α : Type u} {p : α → Prop } (f : Perm α ) (h : ∀ (x : α ), p x ↔ p (↑f x ) ) (x : { x // p x } ),
↑(subtypePerm f h ) x = { val := ↑f ↑x , property := (_ : p (↑f ↑x ) ) } subtypePerm_apply ( f : Perm : Sort ?u.96450 → Sort (max1?u.96450) Perm α ) ( h : ∀ (x : α ), p x ↔ p (↑f x ) h : ∀ x , p x ↔ p ( f x )) ( x : { x // p x }) :
subtypePerm : {α : Type ?u.96549} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm f h : ∀ (x : α ), p x ↔ p (↑f x ) h x = ⟨ f x , ( h : ∀ (x : α ), p x ↔ p (↑f x ) h _ ). 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 x . 2 ⟩ :=
rfl : ∀ {α : Sort ?u.96841} {a : α }, a = a rfl
#align equiv.perm.subtype_perm_apply Equiv.Perm.subtypePerm_apply : ∀ {α : Type u} {p : α → Prop } (f : Perm α ) (h : ∀ (x : α ), p x ↔ p (↑f x ) ) (x : { x // p x } ),
↑(subtypePerm f h ) x = { val := ↑f ↑x , property := (_ : p (↑f ↑x ) ) } Equiv.Perm.subtypePerm_apply
@[ simp ]
theorem subtypePerm_one ( p : α → Prop ) ( h : optParam ?m.96913 (_ : ∀ (x : α ), p x ↔ p x ) h := fun _ => Iff.rfl : ∀ {a : Prop }, a ↔ a Iff.rfl) : @ subtypePerm : {α : Type ?u.96925} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm α p 1 h : optParam ?m.96913 (_ : ∀ (x : α ), p x ↔ p x ) h = 1 :=
rfl : ∀ {α : Sort ?u.97438} {a : α }, a = a rfl
#align equiv.perm.subtype_perm_one Equiv.Perm.subtypePerm_one
@[ simp ]
theorem subtypePerm_mul ( f g : Perm : Sort ?u.97499 → Sort (max1?u.97499) Perm α ) ( hf hg : ∀ (x : α ), p x ↔ p (↑g x ) hg ) :
( f . subtypePerm : {α : Type ?u.97521} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm hf * g . subtypePerm : {α : Type ?u.97534} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm hg : Perm : Sort ?u.97510 → Sort (max1?u.97510) Perm { x // p x }) =
( f * g ). subtypePerm : {α : Type ?u.98241} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm fun _ => ( hg _ ). trans : ∀ {a b c : Prop }, (a ↔ b ) → (b ↔ c ) → (a ↔ c ) trans <| hf _ :=
rfl : ∀ {α : Sort ?u.98683} {a : α }, a = a rfl
#align equiv.perm.subtype_perm_mul Equiv.Perm.subtypePerm_mul
private theorem inv_aux : ∀ {α : Type u} {p : α → Prop } {f : Perm α }, (∀ (x : α ), p x ↔ p (↑f x ) ) ↔ ∀ (x : α ), p x ↔ p (↑f ⁻¹ x ) inv_aux : (∀ x , p x ↔ p ( f x )) ↔ ∀ x , p x ↔ p ( f ⁻¹ x ) :=
f ⁻¹. surjective . forall . trans : ∀ {a b c : Prop }, (a ↔ b ) → (b ↔ c ) → (a ↔ c ) trans <| by (∀ (x : α ), p (↑f ⁻¹ x ) ↔ p (↑f (↑f ⁻¹ x ) ) ) ↔ ∀ (x : α ), p x ↔ p (↑f ⁻¹ x ) simp_rw [ (∀ (x : α ), p (↑f ⁻¹ x ) ↔ p (↑f (↑f ⁻¹ x ) ) ) ↔ ∀ (x : α ), p x ↔ p (↑f ⁻¹ x ) f . apply_inv_self : ∀ {α : Type ?u.99164} (f : Perm α ) (x : α ), ↑f (↑f ⁻¹ x ) = x apply_inv_self, (∀ (x : α ), p (↑f ⁻¹ x ) ↔ p x ) ↔ ∀ (x : α ), p x ↔ p (↑f ⁻¹ x ) (∀ (x : α ), p (↑f ⁻¹ x ) ↔ p (↑f (↑f ⁻¹ x ) ) ) ↔ ∀ (x : α ), p x ↔ p (↑f ⁻¹ x ) Iff.comm : ∀ {a b : Prop }, (a ↔ b ) ↔ (b ↔ a ) Iff.comm]
/-- See `Equiv.Perm.inv_subtypePerm`-/
theorem subtypePerm_inv ( f : Perm : Sort ?u.99381 → Sort (max1?u.99381) Perm α ) ( hf : ∀ (x : α ), p x ↔ p (↑f ⁻¹ x ) hf ) :
f ⁻¹. subtypePerm : {α : Type ?u.99464} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm hf = ( f . subtypePerm : {α : Type ?u.99488} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm <| inv_aux : ∀ {α : Type ?u.99500} {p : α → Prop } {f : Perm α }, (∀ (x : α ), p x ↔ p (↑f x ) ) ↔ ∀ (x : α ), p x ↔ p (↑f ⁻¹ x ) inv_aux. 2 : ∀ {a b : Prop }, (a ↔ b ) → b → a 2 hf : Perm : Sort ?u.99480 → Sort (max1?u.99480) Perm { x // p x })⁻¹ :=
rfl : ∀ {α : Sort ?u.99581} {a : α }, a = a rfl
#align equiv.perm.subtype_perm_inv Equiv.Perm.subtypePerm_inv
/-- See `Equiv.Perm.subtypePerm_inv`-/
@[ simp ]
theorem inv_subtypePerm ( f : Perm : Sort ?u.99633 → Sort (max1?u.99633) Perm α ) ( hf : ∀ (x : α ), p x ↔ p (↑f x ) hf ) :
( f . subtypePerm : {α : Type ?u.99652} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm hf : Perm : Sort ?u.99644 → Sort (max1?u.99644) Perm { x // p x })⁻¹ = f ⁻¹. subtypePerm : {α : Type ?u.99796} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm ( inv_aux : ∀ {α : Type ?u.99803} {p : α → Prop } {f : Perm α }, (∀ (x : α ), p x ↔ p (↑f x ) ) ↔ ∀ (x : α ), p x ↔ p (↑f ⁻¹ x ) inv_aux. 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 hf ) :=
rfl : ∀ {α : Sort ?u.99837} {a : α }, a = a rfl
#align equiv.perm.inv_subtype_perm Equiv.Perm.inv_subtypePerm
private theorem pow_aux : ∀ {α : Type u} {p : α → Prop } {f : Perm α }, (∀ (x : α ), p x ↔ p (↑f x ) ) → ∀ {n : ℕ } (x : α ), p x ↔ p (↑(f ^ n ) x ) pow_aux ( hf : ∀ (x : α ), p x ↔ p (↑f x ) hf : ∀ x , p x ↔ p ( f x )) : ∀ { n : ℕ } ( x ), p x ↔ p (( f ^ n ) x )
| 0 , _ => Iff.rfl : ∀ {a : Prop }, a ↔ a Iff.rfl
| _ + 1, _ => ( pow_aux : (∀ (x : α ), p x ↔ p (↑f x ) ) → ∀ {n : ℕ } (x : α ), p x ↔ p (↑(f ^ n ) x ) pow_aux hf : ∀ (x : α ), p x ↔ p (↑f x ) hf _ ). trans : ∀ {a b c : Prop }, (a ↔ b ) → (b ↔ c ) → (a ↔ c ) trans ( hf : ∀ (x : α ), p x ↔ p (↑f x ) hf _ )
@[ simp ]
theorem subtypePerm_pow ( f : Perm : Sort ?u.104820 → Sort (max1?u.104820) Perm α ) ( n : ℕ ) ( hf ) :
( f . subtypePerm : {α : Type ?u.104841} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm hf : Perm : Sort ?u.104833 → Sort (max1?u.104833) Perm { x // p x }) ^ n = ( f ^ n ). subtypePerm : {α : Type ?u.109117} → {p : α → Prop } → (f : Perm α ) → (∀ (x : α ), p x ↔ p (↑f x ) ) → Perm { x // p x } subtypePerm ( pow_aux : ∀ {α : Type ?u.109124} {p : α → Prop } {f : Perm α },
(∀ (x : α ), p x ↔ p (↑f x ) ) → ∀ {n : ℕ } (x : α ), p x ↔ p (↑(f ^ n ) x ) pow_aux hf ) := by
induction' n with n ih
· simp
· simp_rw [ pow_succ' : ∀ {M : Type ?u.113805} [inst : Monoid M ] (a : M ) (n : ℕ ), a ^ (n + 1 ) = a ^ n * a pow_succ',