From 80b248c5be656dd2b3ba753871aeeb7102e92ff8 Mon Sep 17 00:00:00 2001 From: Hannes Schulze Date: Thu, 30 Oct 2025 13:11:43 +0100 Subject: prove supp of preterms --- Nominal/Equivariance.lean | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'Nominal/Equivariance.lean') 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 -- cgit v1.3.1