diff options
| author | Hannes Schulze <haschu0103@outlook.de> | 2025-12-03 20:34:41 +0100 |
|---|---|---|
| committer | Hannes Schulze <haschu0103@outlook.de> | 2025-12-03 20:34:41 +0100 |
| commit | 71a6a3d5b6f4b428b463bc4a0766c91d8c1d5768 (patch) | |
| tree | add4bf6d650df4b8ec743de45fc37dc7de16baaa /Nominal/Instances/Basic.lean | |
| parent | 4ba4f11725d42286a2e94ee78dd938636ad2528a (diff) | |
refactor equivariant props to use type classes
Diffstat (limited to 'Nominal/Instances/Basic.lean')
| -rw-r--r-- | Nominal/Instances/Basic.lean | 111 |
1 files changed, 82 insertions, 29 deletions
diff --git a/Nominal/Instances/Basic.lean b/Nominal/Instances/Basic.lean index 7f461ac..dcca75b 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 : Function.Equivariant πΈ (Prod.fst : X Γ Y β X) := by - simp [Function.Equivariant] +instance instFstEquivariant : Function.Equivariant πΈ (Prod.fst : X Γ Y β X) := by + constructor; simp -lemma snd_equivariant : Function.Equivariant πΈ (Prod.snd : X Γ Y β Y) := by - simp [Function.Equivariant] +instance instSndEquivariant : Function.Equivariant πΈ (Prod.snd : X Γ Y β Y) := by + constructor; simp 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 : Function.Equivariant πΈ (Sum.inl : X β X β Y) := by - simp [Function.Equivariant] +instance instInlEquivariant : Function.Equivariant πΈ (Sum.inl : X β X β Y) := by + constructor; simp -lemma inr_equivariant : Function.Equivariant πΈ (Sum.inr : Y β X β Y) := by - simp [Function.Equivariant] +instance instInrEquivariant : Function.Equivariant πΈ (Sum.inr : Y β X β Y) := by + constructor; simp end Sum @@ -231,17 +231,18 @@ section Quotient namespace Quotient -variable {X : Type} [PermSet πΈ X] {setoid : EquivariantSetoid πΈ X} +variable {X : Type} [PermSet πΈ X] {setoid : Setoid X} [Rel.Equivariant πΈ setoid.r] -instance : SMul (FPerm πΈ) (Quotient setoid.toSetoid) where +instance : SMul (FPerm πΈ) (Quotient setoid) where smul Ο := Quotient.lift (fun x => β¦Ο β’ xβ§) (by intro x y hxy simp only [Quotient.eq] - apply setoid.equivariant x y Ο hxy) + rw [β Rel.equivariant πΈ setoid.r] + exact hxy) -@[simp] lemma smul_quotient (Ο : FPerm πΈ) (x : X) : (Ο β’ Quotient.mk setoid.toSetoid x) = β¦Ο β’ xβ§ := rfl +@[simp] lemma smul_quotient (Ο : FPerm πΈ) (x : X) : (Ο β’ Quotient.mk setoid x) = β¦Ο β’ xβ§ := rfl -instance : PermSet πΈ (Quotient setoid.toSetoid) where +instance : PermSet πΈ (Quotient setoid) where one_smul := by apply Quotient.ind intro x @@ -251,32 +252,33 @@ instance : PermSet πΈ (Quotient setoid.toSetoid) where apply Quotient.ind simp [mul_smul] -lemma mk_equivariant : Function.Equivariant πΈ (Quotient.mk setoid.toSetoid) := by - simp [Function.Equivariant] +instance instMkEquivariant : Function.Equivariant πΈ (Quotient.mk setoid) := by + constructor; simp -lemma lift_equivariant - {Y : Type} [PermSet πΈ Y] (f : X β Y) (h : β (a b : X), a β b β f a = f b) : - Function.Equivariant πΈ f β Function.Equivariant πΈ (Quotient.lift f h) := by - intro hequi x Ο +def lift_equivariant + {Y : Type} [PermSet πΈ Y] (f : X β Y) [Function.Equivariant πΈ f] + (h : β (a b : X), a β b β f a = f b) : + Function.Equivariant πΈ (Quotient.lift f h) := by + constructor; intro x Ο obtain β¨x', hx'β© := x.exists_rep - simp [β hx', hequi x' Ο] + simp [β hx', Function.equivariant πΈ f] -variable {X : Type} [NominalSet πΈ X] {setoid : EquivariantSetoid πΈ X} +variable {X : Type} [NominalSet πΈ X] {setoid : Setoid X} [Rel.Equivariant πΈ setoid.r] -instance : NominalSet πΈ (Quotient setoid.toSetoid) := - NominalSet.fromEquivariantSurjective πΈ (Quotient.mk setoid.toSetoid) (mk_equivariant πΈ) mk_surjective +instance : NominalSet πΈ (Quotient setoid) := + NominalSet.ofEquivariantSurjective πΈ (Quotient.mk setoid) mk_surjective -lemma supp {x : X} : NominalSet.supp πΈ (Quotient.mk setoid.toSetoid x) = {a | β (x' : X), x' β x β a β NominalSet.supp πΈ x'} := by +lemma supp {x : X} : NominalSet.supp πΈ (Quotient.mk setoid x) = {a | β (x' : X), x' β x β a β NominalSet.supp πΈ x'} := by ext a constructor Β· intro ha x' hx' rw [β Quotient.sound hx'] at ha - have hsub : NominalSet.supp πΈ (Quotient.mk setoid.toSetoid x') β NominalSet.supp πΈ x' := - Function.Equivariant.supp_subset πΈ (mk_equivariant πΈ) + have hsub : NominalSet.supp πΈ (Quotient.mk setoid x') β NominalSet.supp πΈ x' := + Function.Equivariant.supp_subset πΈ exact hsub ha Β· contrapose; intro ha simp only [Set.mem_setOf_eq, Classical.not_imp, not_forall] - have hfinβ : (NominalSet.supp πΈ (Quotient.mk setoid.toSetoid x)).Finite := NominalSet.supp_finite πΈ + have hfinβ : (NominalSet.supp πΈ (Quotient.mk setoid x)).Finite := NominalSet.supp_finite πΈ have hfinβ : (NominalSet.supp πΈ x).Finite := NominalSet.supp_finite πΈ -- Show that we can find a fresh c for which (a c) β’ β¦xβ§ = β¦xβ§ obtain β¨c, hcβ© := Infinite.exists_notMem_finset (hfinβ.toFinset βͺ hfinβ.toFinset) @@ -285,15 +287,66 @@ lemma supp {x : X} : NominalSet.supp πΈ (Quotient.mk setoid.toSetoid x) = {a | Β· apply Quotient.exact rw [β smul_quotient] exact NominalSet.fresh_swap_fix πΈ ha hc.left - Β· rw [NominalSet.supp_equivariant, Set.mem_smul_set_iff_inv_smul_mem] + Β· rw [Function.equivariant πΈ (NominalSet.supp πΈ), Set.mem_smul_set_iff_inv_smul_mem] simp only [FPerm.swap_inv, PermSet.atom_swap, Equiv.swap_apply_left] exact hc.right /-- If an atom is not in the support of the equivalence class, one can always pick a representative where it is not in the least support. -/ -lemma supp_pick_fresh {a : πΈ} {x : X} : a β NominalSet.supp πΈ (Quotient.mk setoid.toSetoid x) β β (y : X), y β x β§ a β NominalSet.supp πΈ y := by +lemma supp_pick_fresh {a : πΈ} {x : X} : a β NominalSet.supp πΈ (Quotient.mk setoid x) β β (y : X), y β x β§ a β NominalSet.supp πΈ y := by contrapose simp [not_exists, not_and, not_not, supp] end Quotient end Quotient + +/-! +## Subtypes + +If X is a nominal set, Y is a subtype of X, and Ο β’ x β Y for all Ο β FPerm πΈ and x β X, then Y is +also a nominal set. +-/ +section Subtype + +namespace Subtype + +variable {X : Type} [PermSet πΈ X] {S : Set X} [Set.Equivariant πΈ S] + +instance : PermSet πΈ S where + smul Ο x := β¨Ο β’ x.val, by + rw [β Set.equivariant πΈ S] + exact x.propβ© + one_smul x := by + apply Subtype.eq + exact MulAction.one_smul x.val + mul_smul Ο Ο x := by + apply Subtype.eq + exact MulAction.mul_smul Ο Ο x.val + +@[simp] lemma smul_val (Ο : FPerm πΈ) (x : S) : (Ο β’ x).val = Ο β’ x.val := rfl + +instance instValEquivariant : Function.Equivariant πΈ (Subtype.val : S β X) := by + constructor; simp + +variable {X : Type} [NominalSet πΈ X] {S : Set X} [Set.Equivariant πΈ S] + +instance : NominalSet πΈ S where + fin_supp x := by + use NominalSet.supp πΈ x.val + constructor + Β· intro Ο hΟ + apply Subtype.eq + exact NominalSet.supp_is_support πΈ hΟ + Β· exact NominalSet.supp_finite πΈ + +@[simp] lemma supp {x : S} : NominalSet.supp πΈ x = NominalSet.supp πΈ x.val := by + symm + apply Function.Equivariant.supp_eq_if_inj + exact val_injective + +@[simp] lemma fresh {a : πΈ} {x : S} : a # x β a # x.val := by + simp [NominalSet.IsFresh] + +end Subtype + +end Subtype |
