diff options
| author | Hannes Schulze <haschu0103@outlook.de> | 2025-10-29 00:40:13 +0100 |
|---|---|---|
| committer | Hannes Schulze <haschu0103@outlook.de> | 2025-10-29 00:40:13 +0100 |
| commit | 5dde77b6db9fc78094363f91e0c6643a84be513e (patch) | |
| tree | c0fecab7a2f62e13836b4e80ee4918c2c62d8d29 | |
| parent | 8f1d3f45f11aae5d611a66c424b6427f379a8251 (diff) | |
refactor equivariance namespaces
| -rw-r--r-- | Nominal/Equivariance.lean | 60 | ||||
| -rw-r--r-- | Nominal/Instances/Abstraction.lean | 18 | ||||
| -rw-r--r-- | Nominal/Instances/Basic.lean | 22 |
3 files changed, 50 insertions, 50 deletions
diff --git a/Nominal/Equivariance.lean b/Nominal/Equivariance.lean index 3166e71..7087076 100644 --- a/Nominal/Equivariance.lean +++ b/Nominal/Equivariance.lean @@ -20,23 +20,19 @@ 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 := +def Function.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 := +def Set.Equivariant (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 := +def Rel.Equivariant (R : Rel X Y) : Prop := β (x : X) (y : Y) (Ο : FPerm πΈ), R x y β R (Ο β’ x) (Ο β’ y) -/-- Extended setoid definition that also requires the relation to be equivariant. -/ -class EquivariantSetoid (X : Type) [PermSet πΈ X] extends Setoid X where - equivariant : EquivariantRelation πΈ r - /-- For equivariant sets, we even have "if and only if". -/ -lemma equivariant_set_iff {S : Set X} : EquivariantSet πΈ S β β (x : X) (Ο : FPerm πΈ), x β S β Ο β’ x β S := by +lemma Set.Equivariant.iff {S : Set X} : Set.Equivariant πΈ S β β (x : X) (Ο : FPerm πΈ), x β S β Ο β’ x β S := by constructor Β· intro h x Ο; constructor Β· intro hx; exact h x Ο hx @@ -48,7 +44,7 @@ lemma equivariant_set_iff {S : Set X} : EquivariantSet πΈ S β β (x : X) (Ο exact (h x Ο).mp hx /-- For equivariant relations, we even have "if and only if". -/ -lemma equivariant_relation_iff {R : Rel X Y} : EquivariantRelation πΈ R β β (x : X) (y : Y) (Ο : FPerm πΈ), R x y β R (Ο β’ x) (Ο β’ y) := by +lemma Rel.Equivariant.iff {R : Rel X Y} : Rel.Equivariant πΈ R β β (x : X) (y : Y) (Ο : FPerm πΈ), R x y β R (Ο β’ x) (Ο β’ y) := by constructor Β· intro h x y Ο; constructor Β· intro hxy; exact h x y Ο hxy @@ -71,18 +67,18 @@ section Trivial variable {X Y Z : Type} [PermSet πΈ X] [PermSet πΈ Y] [PermSet πΈ Z] /-- The identity function is equivariant. -/ -lemma id_equivariant : Equivariant πΈ (id : X β X) := by - simp [Equivariant] +lemma id_equivariant : Function.Equivariant πΈ (id : X β X) := by + simp [Function.Equivariant] /-- The composition of two equivariant functions is equivariant. -/ -lemma comp_equivariant {f : Y β Z} {g : X β Y} : Equivariant πΈ f β Equivariant πΈ g β Equivariant πΈ (f β g) := by +lemma comp_equivariant {f : Y β Z} {g : X β Y} : Function.Equivariant πΈ f β Function.Equivariant πΈ g β Function.Equivariant πΈ (f β g) := by intro hf hg x Ο calc f (g (Ο β’ x)) = f (Ο β’ g x) := by rw [hg] _ = Ο β’ (f (g x)) := by rw [hf] /-- The subset relation is equivariant. -/ -lemma subset_equivariant : EquivariantRelation πΈ (Set.Subset : Set X β Set X β Prop) := by +lemma Set.subset_equivariant : Rel.Equivariant πΈ (Set.Subset : Set X β Set X β Prop) := by intro S T Ο hST x hx rw [Set.mem_smul_set_iff_inv_smul_mem] at hx rw [Set.mem_smul_set_iff_inv_smul_mem] @@ -99,7 +95,7 @@ section Support variable {X Y : Type} [PermSet πΈ X] [PermSet πΈ Y] -namespace Equivariant +namespace Function.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 @@ -118,10 +114,10 @@ lemma preserve_support_inj {x : X} {f : X β Y} {S : Set πΈ} : Equivariant π have : Ο β’ f x = f x := hsupp hΟ contradiction -end Equivariant +end Function.Equivariant /-- HasSupport is an equivariant relation. -/ -lemma PermSet.support_equivariant : EquivariantRelation πΈ (HasSupport πΈ : X β Set πΈ β Prop) := by +lemma PermSet.support_equivariant : Rel.Equivariant πΈ (HasSupport πΈ : X β Set πΈ β Prop) := by intro x S Ο hS Ο hΟ have hfix : (Οβ»ΒΉ * Ο * Ο) β fix πΈ S := by intro a ha @@ -149,7 +145,7 @@ section Nominal variable {X Y : Type} [NominalSet πΈ X] [NominalSet πΈ Y] -namespace Equivariant +namespace Function.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 @@ -173,21 +169,21 @@ lemma preserve_fresh_inj {a : πΈ} {x : X} {f : X β Y} : Equivariant πΈ f β intro hequi hinj rw [NominalSet.IsFresh, NominalSet.IsFresh, supp_eq_if_inj πΈ hequi hinj] -end Equivariant +end Function.Equivariant /-- If there is an equivariant surjection from a nominal set into an (FPerm πΈ)-Set, then that set is nominal. -/ -def NominalSet.fromEquivariantSurjective {X Y : Type} [NominalSet πΈ X] [PermSet πΈ Y] (f : X β Y) (hequi : Equivariant πΈ f) (hsurj : Function.Surjective f) : NominalSet πΈ Y where +def NominalSet.fromEquivariantSurjective {X Y : Type} [NominalSet πΈ X] [PermSet πΈ Y] (f : X β Y) (hequi : Function.Equivariant πΈ f) (hsurj : Function.Surjective f) : NominalSet πΈ Y where fin_supp := by intro y obtain β¨x, hxβ© := hsurj y use (NominalSet.supp πΈ x) constructor Β· rw [β hx] - exact Equivariant.preserve_support πΈ hequi (supp_is_support πΈ) + exact Function.Equivariant.preserve_support πΈ hequi (supp_is_support πΈ) Β· exact supp_finite πΈ /-- supp is an equivariant function. -/ -lemma NominalSet.supp_equivariant : Equivariant πΈ (supp πΈ : X β Set πΈ) := by +lemma NominalSet.supp_equivariant : Function.Equivariant πΈ (supp πΈ : X β Set πΈ) := by intro x Ο; ext a; constructor Β· apply support_subset_supp πΈ Β· apply PermSet.support_equivariant @@ -208,7 +204,7 @@ lemma NominalSet.supp_equivariant : Equivariant πΈ (supp πΈ : X β Set πΈ exact hS.out.right /-- Freshness is an equivariant relation. -/ -lemma NominalSet.fresh_equivariant : EquivariantRelation πΈ (NominalSet.IsFresh : πΈ β X β Prop) := by +lemma NominalSet.fresh_equivariant : Rel.Equivariant πΈ (NominalSet.IsFresh : πΈ β X β Prop) := by intro x y Ο h rwa [IsFresh, supp_equivariant, Set.smul_mem_smul_set_iff] @@ -221,13 +217,13 @@ For propositions of the form `Π a, a R x`, where `R` is an equivariant relation -/ section Freshness -namespace Equivariance +namespace Rel.Equivariant variable {X : Type} [NominalSet πΈ X] {R: Rel πΈ X} {x : X} -- We continue with a circular implication chain argument to show these equivalences. -private lemma for_fresh_iffβ : EquivariantRelation πΈ R β (Π a, R a x) β (β a, a # x β§ R a x) := by +private lemma for_fresh_iffβ : Equivariant πΈ R β (Π a, R a x) β (β a, a # x β§ R a x) := by intro hequi h apply Set.Finite.infinite_compl at h simp at h @@ -236,7 +232,7 @@ private lemma for_fresh_iffβ : EquivariantRelation πΈ R β (Π a, R a x) β simp only [Set.mem_diff, Set.mem_setOf_eq] at ha use a; exact ha.symm -private lemma for_fresh_iffβ : EquivariantRelation πΈ R β (β a, a # x β§ R a x) β (β a, a # x β R a x) := by +private lemma for_fresh_iffβ : Equivariant πΈ R β (β a, a # x β§ R a x) β (β a, a # x β R a x) := by intro hequi h obtain β¨a, β¨hfresha, haβ©β© := h intro b hfreshb @@ -245,7 +241,7 @@ private lemma for_fresh_iffβ : EquivariantRelation πΈ R β (β a, a # x β rw [NominalSet.fresh_swap_fix πΈ hfresha hfreshb] at hmem exact hmem -private lemma for_fresh_iffβ : EquivariantRelation πΈ R β (β a, a # x β R a x) β (Π a, R a x) := by +private lemma for_fresh_iffβ : Equivariant πΈ R β (β a, a # x β R a x) β (Π a, R a x) := by intro hequi h have hsub : {a : πΈ | R a x}αΆ β NominalSet.supp πΈ x := by rw [Set.compl_subset_comm] @@ -256,7 +252,7 @@ private lemma for_fresh_iffβ : EquivariantRelation πΈ R β (β a, a # x β apply Set.Finite.subset (NominalSet.supp_finite πΈ) hsub /-- The quantifier in `Π a, a R x` is equivalent to "for any fresh `a`". -/ -lemma for_fresh_iff_exists : EquivariantRelation πΈ R β ((Π a, R a x) β (β a, a # x β§ R a x)) := by +lemma for_fresh_iff_exists : Equivariant πΈ R β ((Π a, R a x) β (β a, a # x β§ R a x)) := by intro hequi; constructor Β· intro h apply for_fresh_iffβ πΈ hequi @@ -267,7 +263,7 @@ lemma for_fresh_iff_exists : EquivariantRelation πΈ R β ((Π a, R a x) β ( exact h /-- The quantifier in `Π a, a R x` is equivalent to "for all fresh `a`". -/ -lemma for_fresh_iff_all : EquivariantRelation πΈ R β ((Π a, R a x) β (β a, a # x β R a x)) := by +lemma for_fresh_iff_all : Equivariant πΈ R β ((Π a, R a x) β (β a, a # x β R a x)) := by intro hequi; constructor Β· intro h apply for_fresh_iffβ πΈ hequi @@ -277,7 +273,7 @@ lemma for_fresh_iff_all : EquivariantRelation πΈ R β ((Π a, R a x) β (β apply for_fresh_iffβ πΈ hequi exact h -end Equivariance +end Rel.Equivariant end Freshness @@ -293,7 +289,7 @@ structure EquivariantMap (X Y : Type) [PermSet πΈ X] [PermSet πΈ Y] where /-- The underlying function. -/ toFun : X β Y /-- Proof of equivariance. -/ - equivariant : Equivariant πΈ toFun + equivariant : Function.Equivariant πΈ toFun /-- We write `X ββ Y` or `X ββ[πΈ] Y` for an equivariant map X β Y. -/ infixr:25 " ββ " => EquivariantMap _ @@ -331,4 +327,8 @@ lemma ext {f g : X ββ[πΈ] Y} (h : β a, f a = g a) : f = g := end EquivariantMap +/-- Extended setoid definition that also requires the relation to be equivariant. -/ +class EquivariantSetoid (X : Type) [PermSet πΈ X] extends Setoid X where + equivariant : Rel.Equivariant πΈ r + end BundledFunction diff --git a/Nominal/Instances/Abstraction.lean b/Nominal/Instances/Abstraction.lean index 943bd43..ba2fbf9 100644 --- a/Nominal/Instances/Abstraction.lean +++ b/Nominal/Instances/Abstraction.lean @@ -60,7 +60,7 @@ private lemma ofPair_surjective : Function.Surjective (ofPair πΈ X) := by use β¨x.atom, x.bodyβ© simp [ofPair] -private lemma ofPair_equivariant : Equivariant πΈ (ofPair πΈ X) := by +private lemma ofPair_equivariant : Function.Equivariant πΈ (ofPair πΈ X) := by intro x Ο ext <;> simp [ofPair] @@ -69,7 +69,7 @@ instance : NominalSet πΈ (NameAbstraction' πΈ X) := @[simp] lemma supp {x : NameAbstraction' πΈ X} : NominalSet.supp πΈ x = NominalSet.supp πΈ x.body βͺ {x.atom} := by have h : NominalSet.supp πΈ (ofPair πΈ X (x.atom, x.body)) = NominalSet.supp πΈ (x.atom, x.body) := - Equivariant.supp_eq_if_inj πΈ (ofPair_equivariant πΈ X) (ofPair_injective πΈ X) + Function.Equivariant.supp_eq_if_inj πΈ (ofPair_equivariant πΈ X) (ofPair_injective πΈ X) simp only [Prod.supp, NominalSet.supp_atom, ofPair] at h rwa [Set.union_comm] at h @@ -105,7 +105,7 @@ private lemma alpha_eq_iff_pred {x y : NameAbstraction' πΈ X} : AlphaEq x y = apply NominalSet.for_fresh_ext simp [AlphaEqPred] -private lemma alpha_eq_pred_equivariant : EquivariantRelation πΈ (AlphaEqPred : πΈ β NameAbstraction' πΈ X Γ NameAbstraction' πΈ X β Prop) := by +private lemma alpha_eq_pred_equivariant : Rel.Equivariant πΈ (AlphaEqPred : πΈ β NameAbstraction' πΈ X Γ NameAbstraction' πΈ X β Prop) := by intro a x Ο rw [AlphaEqPred, AlphaEqPred] intro h @@ -116,14 +116,14 @@ private lemma alpha_eq_pred_equivariant : EquivariantRelation πΈ (AlphaEqPred private lemma alpha_eq_iff_exists' {x y : NameAbstraction' πΈ X} : AlphaEq x y β β c, c # x β§ c # y β§ βΈ¨c, x.atomβΈ© β’ x.body = βΈ¨c, y.atomβΈ© β’ y.body := by suffices (β c, c # x β§ c # y β§ βΈ¨c, x.atomβΈ© β’ x.body = βΈ¨c, y.atomβΈ© β’ y.body) = (β c, c # (x, y) β§ AlphaEqPred c (x, y)) by rw [alpha_eq_iff_pred, this] - apply Equivariance.for_fresh_iff_exists + apply Rel.Equivariant.for_fresh_iff_exists exact alpha_eq_pred_equivariant simp [Prod.fresh, AlphaEqPred, @and_assoc] private lemma alpha_eq_iff_all' {x y : NameAbstraction' πΈ X} : AlphaEq x y β β c, c # x β§ c # y β βΈ¨c, x.atomβΈ© β’ x.body = βΈ¨c, y.atomβΈ© β’ y.body := by suffices (β c, c # x β§ c # y β βΈ¨c, x.atomβΈ© β’ x.body = βΈ¨c, y.atomβΈ© β’ y.body) = (β c, c # (x, y) β AlphaEqPred c (x, y)) by rw [alpha_eq_iff_pred, this] - apply Equivariance.for_fresh_iff_all + apply Rel.Equivariant.for_fresh_iff_all exact alpha_eq_pred_equivariant simp [Prod.fresh, AlphaEqPred] @@ -202,7 +202,7 @@ private lemma alpha_eq_trans {x y z : NameAbstraction' πΈ X} : AlphaEq x y β Β· intro c β¨hxy, hyzβ© rw [hxy, hyz] -private lemma alpha_eq_equivariant : EquivariantRelation πΈ (AlphaEq : NameAbstraction' πΈ X β NameAbstraction' πΈ X β Prop) := by +private lemma alpha_eq_equivariant : Rel.Equivariant πΈ (AlphaEq : NameAbstraction' πΈ X β NameAbstraction' πΈ X β Prop) := by intro x y Ο h rw [alpha_eq_iff_exists'] at * obtain β¨c, β¨hcx, β¨hcy, hcβ©β©β© := h @@ -377,11 +377,11 @@ private def map' (f : X ββ[πΈ] Y) : NameAbstraction πΈ X β NameAbstrac exact β¨hcx.left, hcy.left, - Equivariant.preserve_fresh πΈ f.equivariant hcx.right, - Equivariant.preserve_fresh πΈ f.equivariant hcy.right, + Function.Equivariant.preserve_fresh πΈ f.equivariant hcx.right, + Function.Equivariant.preserve_fresh πΈ f.equivariant hcy.right, hc'β©) -private lemma map_equivariant (f : X ββ[πΈ] Y) : Equivariant πΈ (map' πΈ f) := by +private lemma map_equivariant (f : X ββ[πΈ] Y) : Function.Equivariant πΈ (map' πΈ f) := by apply Quotient.ind intro x Ο rw [β Quotient.mk_equivariant] diff --git a/Nominal/Instances/Basic.lean b/Nominal/Instances/Basic.lean index 2ebe9b1..d41e87f 100644 --- a/Nominal/Instances/Basic.lean +++ b/Nominal/Instances/Basic.lean @@ -140,11 +140,11 @@ instance : NominalSet πΈ (X Γ Y) where lemma supp_comm {x : X} {y : Y} : NominalSet.supp πΈ (x, y) = NominalSet.supp πΈ (y, x) := by simp; apply Set.union_comm -lemma fst_equivariant : Equivariant πΈ (Prod.fst : X Γ Y β X) := by - simp [Equivariant] +lemma fst_equivariant : Function.Equivariant πΈ (Prod.fst : X Γ Y β X) := by + simp [Function.Equivariant] -lemma snd_equivariant : Equivariant πΈ (Prod.snd : X Γ Y β Y) := by - simp [Equivariant] +lemma snd_equivariant : Function.Equivariant πΈ (Prod.snd : X Γ Y β Y) := by + simp [Function.Equivariant] end Prod @@ -212,11 +212,11 @@ instance : NominalSet πΈ (X β Y) where @[simp] lemma fresh_inr {a : πΈ} {y : Y} : a # (.inr y : X β Y) β a # y := by simp [NominalSet.IsFresh] -lemma inl_equivariant : Equivariant πΈ (Sum.inl : X β X β Y) := by - simp [Equivariant] +lemma inl_equivariant : Function.Equivariant πΈ (Sum.inl : X β X β Y) := by + simp [Function.Equivariant] -lemma inr_equivariant : Equivariant πΈ (Sum.inr : Y β X β Y) := by - simp [Equivariant] +lemma inr_equivariant : Function.Equivariant πΈ (Sum.inr : Y β X β Y) := by + simp [Function.Equivariant] end Sum @@ -251,8 +251,8 @@ instance : PermSet πΈ (Quotient setoid.toSetoid) where apply Quotient.ind simp [mul_smul] -lemma mk_equivariant : Equivariant πΈ (Quotient.mk setoid.toSetoid) := by - simp [Equivariant] +lemma mk_equivariant : Function.Equivariant πΈ (Quotient.mk setoid.toSetoid) := by + simp [Function.Equivariant] variable {X : Type} [NominalSet πΈ X] {setoid : EquivariantSetoid πΈ X} @@ -265,7 +265,7 @@ lemma supp {x : X} : NominalSet.supp πΈ (Quotient.mk setoid.toSetoid x) = {a | Β· intro ha x' hx' rw [β Quotient.sound hx'] at ha have hsub : NominalSet.supp πΈ (Quotient.mk setoid.toSetoid x') β NominalSet.supp πΈ x' := - Equivariant.supp_subset πΈ (mk_equivariant πΈ) + Function.Equivariant.supp_subset πΈ (mk_equivariant πΈ) exact hsub ha Β· contrapose; intro ha simp only [Set.mem_setOf_eq, Classical.not_imp, not_forall] |
