diff options
| author | Hannes Schulze <contact@haschu.me> | 2026-04-14 16:04:44 +0200 |
|---|---|---|
| committer | Hannes Schulze <contact@haschu.me> | 2026-04-15 13:22:40 +0200 |
| commit | a5ff8efe5b5e314e0aa759318e5fb194e066f612 (patch) | |
| tree | 4d13dd84ac4ced2360a51799f0e5c846bd733872 /Nominal | |
| parent | 43942e78f4b3ed4cfca3b508f06161d0983c545e (diff) | |
update lean
Diffstat (limited to 'Nominal')
| -rw-r--r-- | Nominal/Equivariance.lean | 9 | ||||
| -rw-r--r-- | Nominal/Helpers/CountableString.lean | 6 | ||||
| -rw-r--r-- | Nominal/Instances/Abstraction.lean | 12 | ||||
| -rw-r--r-- | Nominal/Instances/Basic.lean | 10 | ||||
| -rw-r--r-- | Nominal/LambdaCalculus/Terms.lean | 22 | ||||
| -rw-r--r-- | Nominal/Permutations.lean | 6 | ||||
| -rw-r--r-- | Nominal/Support.lean | 2 |
7 files changed, 32 insertions, 35 deletions
diff --git a/Nominal/Equivariance.lean b/Nominal/Equivariance.lean index 2682a55..e9bd850 100644 --- a/Nominal/Equivariance.lean +++ b/Nominal/Equivariance.lean @@ -25,7 +25,7 @@ class inductive Function.Equivariant (f : X β Y) : Prop lemma Function.equivariant (f : X β Y) [Equivariant πΈ f] : β (x : X) (Ο : FPerm πΈ), f (Ο β’ x) = Ο β’ f x := by - cases (inferInstanceAs (Equivariant πΈ f)); assumption + cases (inferInstance : Equivariant πΈ f); assumption /-- A set is equivariant if it is closed under permutations. -/ class inductive Set.Equivariant (S : Set X) : Prop @@ -34,7 +34,7 @@ class inductive Set.Equivariant (S : Set X) : Prop /-- For equivariant sets, we even have "if and only if". -/ lemma Set.equivariant (S : Set X) [Equivariant πΈ S] : β (x : X) (Ο : FPerm πΈ), x β S β Ο β’ x β S := by - cases (inferInstanceAs (Equivariant πΈ S)); rename_i h + cases (inferInstance : Equivariant πΈ S); rename_i h intro x Ο; constructor Β· intro hx; exact h x Ο hx Β· intro hx @@ -49,7 +49,7 @@ class inductive Rel.Equivariant (R : Rel X Y) : Prop /-- For equivariant relations, we even have "if and only if". -/ lemma Rel.equivariant (R : Rel X Y) [Rel.Equivariant πΈ R] : β (x : X) (y : Y) (Ο : FPerm πΈ), R x y β R (Ο β’ x) (Ο β’ y) := by - cases (inferInstanceAs (Equivariant πΈ R)); rename_i h + cases (inferInstance : Equivariant πΈ R); rename_i h intro x y Ο; constructor Β· intro hxy; exact h x y Ο hxy Β· intro hxy @@ -83,6 +83,7 @@ instance Function.Equivariant.comp _ = Ο β’ (f (g x)) := by rw [β Function.equivariant πΈ f] /-- If a function is equivariant, its inverse is also equivariant. -/ +@[reducible] def Function.Equivariant.inv {f : X β Y} [Function.Equivariant πΈ f] {inv : Y β X} (hleft : Function.LeftInverse inv f) @@ -191,6 +192,7 @@ lemma preserve_fresh_inj {a : πΈ} {x : X} {f : X β Y} [Equivariant πΈ f] : end Function.Equivariant /-- If there is an equivariant surjection from a nominal set into an (FPerm πΈ)-Set, then that set is nominal. -/ +@[reducible] def NominalSet.ofEquivariantSurjective {X Y : Type} [NominalSet πΈ X] [PermSet πΈ Y] (f : X β Y) [Function.Equivariant πΈ f] (hsurj : Function.Surjective f) : @@ -385,6 +387,7 @@ instance EquivariantEquiv.invFunEquivariant equiv.invFun_equivariant /-- If an (FPerm πΈ)-Set is equivalent to a nominal set, it is also a nominal set. -/ +@[reducible] def NominalSet.ofEquivariantEquiv {X Y : Type} [PermSet πΈ X] [NominalSet πΈ Y] (equiv : EquivariantEquiv πΈ X Y) : NominalSet πΈ X := NominalSet.ofEquivariantSurjective πΈ equiv.invFun equiv.symm.surjective diff --git a/Nominal/Helpers/CountableString.lean b/Nominal/Helpers/CountableString.lean index b6f59f8..c887f96 100644 --- a/Nominal/Helpers/CountableString.lean +++ b/Nominal/Helpers/CountableString.lean @@ -5,10 +5,10 @@ instance : Countable Char where use Char.toNat intro cβ cβ hc rw [Char.toNat, Char.toNat, UInt32.toNat_inj] at hc - exact Char.eq_of_val_eq hc + exact Char.ext hc instance : Countable String := Countable.of_equiv (List Char) - { toFun := String.mk - invFun := String.data + { toFun := String.ofList + invFun := String.toList left_inv x := by simp right_inv x := by simp } diff --git a/Nominal/Instances/Abstraction.lean b/Nominal/Instances/Abstraction.lean index e03d67a..f1a711b 100644 --- a/Nominal/Instances/Abstraction.lean +++ b/Nominal/Instances/Abstraction.lean @@ -225,16 +225,12 @@ instance NameAbstraction.setoid_equivariant : Rel.Equivariant πΈ (setoid πΈ instAlphaEqEquivariant /-- Define name abstractions as the quotient set (πΈ Γ X)/β. -/ -def NameAbstraction := Quotient (NameAbstraction.setoid πΈ X) +abbrev NameAbstraction := Quotient (NameAbstraction.setoid πΈ X) namespace NameAbstraction -/-- The equivalence class of a name abstraction (a, x), often written `βͺaβ« x` -/ -abbrev mk {πΈ : Type} [Infinite πΈ] [Countable πΈ] [DecidableEq πΈ] {X : Type} [NominalSet πΈ X] (a : πΈ) (x : X) : NameAbstraction πΈ X := - Quotient.mk (setoid πΈ X) (.mk a x) - /-- We write `βͺaβ« x` instead of the usual `β¨aβ© x` because `β¨β©` is already heavily used in Lean for constructors. -/ -notation "βͺ" a "β« " x:60 => mk a x +notation "βͺ" a "β« " x:60 => (β¦β¨a, xβ©β§ : NameAbstraction _ _) instance : NominalSet πΈ (NameAbstraction πΈ X) := Quotient.instNominalSet πΈ @@ -390,13 +386,13 @@ private lemma map_id : map πΈ (EquivariantMap.id πΈ : X ββ[πΈ] X) = Eq suffices β (x : NameAbstraction πΈ X), map' πΈ (EquivariantMap.id πΈ) x = x by ext x; exact this x apply Quotient.ind intro x - simp [map', NameAbstraction.mk] + simp [map'] private lemma map_comp (f : Y ββ[πΈ] Z) (g : X ββ[πΈ] Y) : map πΈ (EquivariantMap.comp πΈ f g) = EquivariantMap.comp πΈ (map πΈ f) (map πΈ g) := by suffices β (x : NameAbstraction πΈ X), map' πΈ (EquivariantMap.comp πΈ f g) x = (map' πΈ f) ((map' πΈ g) x) by ext x; exact this x apply Quotient.ind intro x - simp [map', NameAbstraction.mk] + simp [map'] /-- Name abstractions form a functor `Nom β₯€ Nom`. -/ def Functor : Nom πΈ β₯€ Nom πΈ := diff --git a/Nominal/Instances/Basic.lean b/Nominal/Instances/Basic.lean index b627c1b..7a88eeb 100644 --- a/Nominal/Instances/Basic.lean +++ b/Nominal/Instances/Basic.lean @@ -59,6 +59,7 @@ Every set can be made into a discrete nominal set, where supp x = β
. -/ section Discrete +@[reducible] def NominalSet.mkDiscrete (X : Type) : NominalSet.Discrete πΈ X where smul Ο x := x one_smul := by intro; rfl @@ -330,6 +331,7 @@ instance : PermSet πΈ (Quotient setoid) where instance instMkEquivariant : Function.Equivariant πΈ (Quotient.mk setoid) := by constructor; simp +@[reducible] def lift_equivariant {Y : Type} [PermSet πΈ Y] (f : X β Y) [Function.Equivariant πΈ f] (h : β (a b : X), a β b β f a = f b) : @@ -392,11 +394,11 @@ instance : PermSet πΈ S where rw [β Set.equivariant πΈ S] exact x.propβ© one_smul x := by - apply Subtype.eq + apply Subtype.ext exact MulAction.one_smul x.val mul_smul Ο Ο x := by - apply Subtype.eq - exact MulAction.mul_smul Ο Ο x.val + apply Subtype.ext + exact SemigroupAction.mul_smul Ο Ο x.val @[simp] lemma smul_val (Ο : FPerm πΈ) (x : S) : (Ο β’ x).val = Ο β’ x.val := rfl @@ -410,7 +412,7 @@ instance : NominalSet πΈ S where use NominalSet.supp πΈ x.val constructor Β· intro Ο hΟ - apply Subtype.eq + apply Subtype.ext exact NominalSet.supp_is_support πΈ hΟ Β· exact NominalSet.supp_finite πΈ diff --git a/Nominal/LambdaCalculus/Terms.lean b/Nominal/LambdaCalculus/Terms.lean index 91f4fb8..7af82cd 100644 --- a/Nominal/LambdaCalculus/Terms.lean +++ b/Nominal/LambdaCalculus/Terms.lean @@ -53,40 +53,37 @@ instance Preterm.instSetoidEquivariant : Rel.Equivariant Var setoid.r := by exact h /-- Define Ξ»-terms as the quotient Preterm/β. -/ -def Term := Quotient Preterm.setoid +abbrev Term := Quotient Preterm.setoid namespace Term -/-- The equivalence class of a Ξ»-preterm. -/ -abbrev mk : Preterm β Term := Quotient.mk Preterm.setoid - instance : NominalSet Var Term := Quotient.instNominalSet Var @[simp] -lemma smul {Ο : FPerm Var} {t : Preterm} : Ο β’ Term.mk t = Term.mk (Ο β’ t) := by congr +lemma smul {Ο : FPerm Var} {t : Preterm} : Ο β’ (β¦tβ§ : Term) = β¦Ο β’ tβ§ := by congr private lemma alpha_eq {t u : Preterm} : t β u β AlphaEq t u := by rfl -lemma eq_iff_alpha_eq {t u : Preterm} : mk t = mk u β t β u := by +lemma eq_iff_alpha_eq {t u : Preterm} : (β¦tβ§ : Term) = (β¦uβ§ : Term) β t β u := by rw [Quotient.eq_iff_equiv] -def var : Var β Term := fun x => mk (.var x) +def var : Var β Term := fun x => β¦.var xβ§ def abs : Var β Term β Term := fun x => Quotient.lift - (fun t => mk (.abs x t)) + (fun t => β¦.abs x tβ§) (by intro t t'; rw [eq_iff_alpha_eq]; exact AlphaEq.cong_abs) def app : Term β Term β Term := Quotient.liftβ - (fun t u => mk (.app t u)) + (fun t u => β¦.app t uβ§) (by intro tβ tβ uβ uβ; rw [eq_iff_alpha_eq]; exact AlphaEq.cong_app) @[simp] -lemma abs_preterm {x : Var} {t : Preterm} : abs x (mk t) = mk (.abs x t) := rfl +lemma abs_preterm {x : Var} {t : Preterm} : abs x β¦tβ§ = β¦.abs x tβ§ := rfl @[simp] -lemma app_preterm {t u : Preterm} : app (mk t) (mk u) = mk (.app t u) := rfl +lemma app_preterm {t u : Preterm} : app β¦tβ§ β¦uβ§ = β¦.app t uβ§ := rfl /-- Alternative characterization of Ξ±-equivalence for each preterm constructor. -/ inductive AlphaEq' : Preterm β Preterm β Prop where @@ -242,7 +239,6 @@ lemma eq_abs {x y : Var} {t u : Term} : Term.abs x t = Term.abs y u β βͺxβ« obtain β¨u', hu'β© := u.exists_rep simp only [abs, β ht', Quotient.lift_mk, β hu'] rw [Quotient.eq_iff_equiv, alpha_eq_abs] - rfl /-- Alternative characterization of Ξ±-equivalence for application preterms. -/ lemma alpha_eq_app {tβ tβ uβ uβ : Preterm} : Preterm.app tβ tβ β Preterm.app uβ uβ β tβ β uβ β§ tβ β uβ := by @@ -295,7 +291,7 @@ private def equiv : EquivariantEquiv Var Term (Var β (NameAbstraction Var Term (by intro t u htu rw [alpha_eq, alpha_eq_iff] at htu - cases htu <;> simp only [Sum.inr.injEq, Sum.inl.injEq, *]; assumption) + cases htu <;> simp [*]) invFun | .inl x => .var x | .inr (.inl x) => Quotient.liftOn x diff --git a/Nominal/Permutations.lean b/Nominal/Permutations.lean index 0a4974a..f1115d3 100644 --- a/Nominal/Permutations.lean +++ b/Nominal/Permutations.lean @@ -42,7 +42,7 @@ lemma supp_one : (1 : Equiv.Perm X).supp = β
:= by /-- The support of the inverse function is the same as the function's support. -/ lemma supp_inv (Ο : Equiv.Perm X) : Οβ»ΒΉ.supp = Ο.supp := by - simp [supp, set_support_inv_eq] + simp [supp, set_support_symm_eq] /-- The support of two concatenated permutations is a subset of the individual supports as a union. -/ lemma supp_mul_subset (Ο Ο : Equiv.Perm X) : (Ο * Ο).supp β Ο.supp βͺ Ο.supp := by @@ -199,10 +199,10 @@ instance : PermSet πΈ πΈ where instance : OrbitFinite πΈ πΈ where fin_orbits := Finite.of_equiv Unit - { toFun _ := Quotient.mk _ (inferInstanceAs (Nonempty πΈ)).some + { toFun _ := Quotient.mk _ (inferInstance : Nonempty πΈ).some invFun _ := () right_inv := by - let chosen := (inferInstanceAs (Nonempty πΈ)).some + let chosen := (inferInstance : Nonempty πΈ).some apply Quotient.ind; intro a rw [Quotient.eq] show chosen β MulAction.orbit (FPerm πΈ) a diff --git a/Nominal/Support.lean b/Nominal/Support.lean index 7888a68..fde20c7 100644 --- a/Nominal/Support.lean +++ b/Nominal/Support.lean @@ -79,7 +79,7 @@ lemma support_inter {x : X} {S T : Set πΈ} : HasSupport πΈ x S β S.Finite simp) let m' := (S \ T).restrict m rw [Set.injOn_iff_injective, show (S \ T).restrict m = m' by rfl] at h_m_injective - obtain h_m_inv := Function.partialInv_of_injective h_m_injective + obtain h_m_inv := h_m_injective.isPartialInv have h_m_image : m '' (S \ T) β (Ο'.supp βͺ S βͺ T)αΆ := Set.image_subset_iff.mpr h_m_preimage |
