summaryrefslogtreecommitdiff
path: root/Nominal/Equivariance.lean
diff options
context:
space:
mode:
Diffstat (limited to 'Nominal/Equivariance.lean')
-rw-r--r--Nominal/Equivariance.lean39
1 files changed, 39 insertions, 0 deletions
diff --git a/Nominal/Equivariance.lean b/Nominal/Equivariance.lean
index 7087076..4ba580d 100644
--- a/Nominal/Equivariance.lean
+++ b/Nominal/Equivariance.lean
@@ -77,6 +77,12 @@ lemma comp_equivariant {f : Y โ†’ Z} {g : X โ†’ Y} : Function.Equivariant ๐”ธ f
f (g (ฯ€ โ€ข x)) = f (ฯ€ โ€ข g x) := by rw [hg]
_ = ฯ€ โ€ข (f (g x)) := by rw [hf]
+/-- If a function is equivariant, its inverse is also equivariant. -/
+lemma Function.inv_equivariant {f : X โ†’ Y} {inv : Y โ†’ X} : Function.LeftInverse inv f โ†’ Function.RightInverse inv f โ†’ Function.Equivariant ๐”ธ f โ†’ Function.Equivariant ๐”ธ inv := by
+ intro hleft hright hequi y ฯ€
+ apply hleft.injective
+ rw [hequi, hright, hright]
+
/-- The subset relation is equivariant. -/
lemma Set.subset_equivariant : Rel.Equivariant ๐”ธ (Set.Subset : Set X โ†’ Set X โ†’ Prop) := by
intro S T ฯ€ hST x hx
@@ -332,3 +338,36 @@ class EquivariantSetoid (X : Type) [PermSet ๐”ธ X] extends Setoid X where
equivariant : Rel.Equivariant ๐”ธ r
end BundledFunction
+
+/-!
+## Equivalences
+
+If two types are equivalent and the conversion function is also equivariant, we know some additional information about nominal set structures.
+-/
+section Equivalence
+
+/-- An equivalence where the function is equivariant. -/
+structure EquivariantEquiv (X Y : Type) [PermSet ๐”ธ X] [PermSet ๐”ธ Y] extends Equiv X Y where
+ toFun_equivariant : Function.Equivariant ๐”ธ toFun
+ invFun_equivariant : Function.Equivariant ๐”ธ invFun := Function.inv_equivariant ๐”ธ left_inv right_inv toFun_equivariant
+
+def Equivariant.Equiv.symm {๐”ธ X Y : Type} [Infinite ๐”ธ] [Countable ๐”ธ] [DecidableEq ๐”ธ] [PermSet ๐”ธ X] [PermSet ๐”ธ Y] (equiv : EquivariantEquiv ๐”ธ X Y) : EquivariantEquiv ๐”ธ Y X :=
+ { toFun := equiv.invFun
+ invFun := equiv.toFun
+ toFun_equivariant := equiv.invFun_equivariant
+ left_inv := equiv.right_inv
+ right_inv := equiv.left_inv
+ }
+
+/-- If an (FPerm ๐”ธ)-Set is equivalent to a nominal set, it is also a nominal set. -/
+def NominalSet.fromEquivariantEquiv {X Y : Type} [PermSet ๐”ธ X] [NominalSet ๐”ธ Y] (equiv : EquivariantEquiv ๐”ธ X Y) : NominalSet ๐”ธ X :=
+ NominalSet.fromEquivariantSurjective ๐”ธ equiv.invFun equiv.invFun_equivariant equiv.symm.surjective
+
+/-- If two nominal sets are equivalent, the corresponding least supports are equal. -/
+lemma EquivariantEquiv.supp_eq {X Y : Type} [NominalSet ๐”ธ X] [NominalSet ๐”ธ Y] (equiv : EquivariantEquiv ๐”ธ X Y) (x : X) : NominalSet.supp ๐”ธ x = NominalSet.supp ๐”ธ (equiv.toFun x) := by
+ symm
+ apply Function.Equivariant.supp_eq_if_inj
+ ยท exact equiv.toFun_equivariant
+ ยท exact equiv.injective
+
+end Equivalence