import Mathlib import Nominal.Permutations import Nominal.Support /-! # Definitions and Properties for Equivariance We define equivariance for functions, sets, and binary relations. -/ variable (๐”ธ : Type) [Infinite ๐”ธ] [Countable ๐”ธ] [DecidableEq ๐”ธ] /-! ## Definitions Basic definitions for equivariance. -/ section Definition variable {X Y : Type} [PermSet ๐”ธ X] [PermSet ๐”ธ Y] /-- A function is equivariant if it is invariant to applying a permutation before or after the function. -/ def Equivariant (f : X โ†’ Y) : Prop := โˆ€ (x : X) (ฯ€ : FPerm ๐”ธ), f (ฯ€ โ€ข x) = ฯ€ โ€ข f x /-- A set is equivariant if it is closed under permutations. -/ def EquivariantSet (S : Set X) : Prop := โˆ€ (x : X) (ฯ€ : FPerm ๐”ธ), x โˆˆ S โ†’ ฯ€ โ€ข x โˆˆ S /-- A binary relation is equivariant if it is closed under permutations. -/ def EquivariantRelation (R : Rel X Y) : Prop := โˆ€ (x : X) (y : Y) (ฯ€ : FPerm ๐”ธ), R x y โ†’ R (ฯ€ โ€ข x) (ฯ€ โ€ข y) end Definition /-! ## Support Propositions relating equivariance to support in (FPerm ๐”ธ)-sets. -/ section Support variable {X Y : Type} [PermSet ๐”ธ X] [PermSet ๐”ธ Y] namespace Equivariant /-- Equivariant functions preserve supports. -/ lemma preserve_support {x : X} {f : X โ†’ Y} {S : Set ๐”ธ} : Equivariant ๐”ธ f โ†’ PermSet.HasSupport ๐”ธ x S โ†’ PermSet.HasSupport ๐”ธ (f x) S := by intro hequi hsupp ฯ€ hฯ€ calc ฯ€ โ€ข f x = f (ฯ€ โ€ข x) := by rw [โ† hequi] _ = f x := by rw [hsupp hฯ€] /-- Equivariant injective functions exactly preserve supports. -/ lemma preserve_support_inj {x : X} {f : X โ†’ Y} {S : Set ๐”ธ} : Equivariant ๐”ธ f โ†’ f.Injective โ†’ (PermSet.HasSupport ๐”ธ x S โ†” PermSet.HasSupport ๐”ธ (f x) S) := by intro hequi hinj; constructor ยท exact preserve_support ๐”ธ hequi ยท intro hsupp ฯ€ hฯ€ by_contra h have : ฯ€ โ€ข f x โ‰  f x := by rw [โ† hequi]; exact fun a => h (hinj a) have : ฯ€ โ€ข f x = f x := hsupp hฯ€ contradiction end Equivariant end Support /-! ## Nominal Sets Properties about equivariance relating to nominal sets. -/ section Nominal variable {X Y : Type} [NominalSet ๐”ธ X] [NominalSet ๐”ธ Y] namespace Equivariant /-- If f is equivariant, then supp (f x) โІ supp x. -/ lemma supp_subset {x : X} {f : X โ†’ Y} : Equivariant ๐”ธ f โ†’ NominalSet.supp ๐”ธ (f x) โІ NominalSet.supp ๐”ธ x := by intro hequi apply NominalSet.support_subset_supp ยท exact preserve_support ๐”ธ hequi (NominalSet.supp_is_support ๐”ธ) ยท exact NominalSet.supp_finite ๐”ธ /-- If f is equivariant and injective, then supp (f x) = supp x. -/ lemma supp_eq_if_inj {x : X} {f : X โ†’ Y} : Equivariant ๐”ธ f โ†’ Function.Injective f โ†’ NominalSet.supp ๐”ธ (f x) = NominalSet.supp ๐”ธ x := by intro hequi hinj simp [NominalSet.supp, preserve_support_inj ๐”ธ hequi hinj] end Equivariant end Nominal