blob: f5160dd1a67e4dd688a5597d1d14e6a4444b8ec9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import Mathlib
import Algebra.Terms
import Algebra.Derivations
namespace NominalAlgebra
variable (πΈ : Type) [Infinite πΈ] [Countable πΈ] [DecidableEq πΈ]
variable (sig : Signature)
structure Algebra where
carrier : β β Nom πΈ
pure (f : sig.pure) {m : β} :
(sig.pureArgs f β carrier m) ββ[πΈ] carrier (m + sig.pureDepth f)
free (f : sig.free) {m : β} :
(πΈ Γ (sig.freeArgs f β carrier m)) ββ[πΈ] carrier (m + sig.freeDepth f)
bound (f : sig.bound) {m : β} :
NameAbstraction πΈ (sig.boundArgs f β carrier m) ββ[πΈ] carrier (m + sig.boundDepth f)
instance : CoeFun (Algebra πΈ sig) (fun _ => β β Nom πΈ) where
coe A := A.carrier
structure Algebra.Hom (A B : Algebra πΈ sig) where
toFun : (n : β) β (A n ββ[πΈ] B n)
preserve_pure : β (f : sig.pure) {m : β} (args : sig.pureArgs f β A m),
toFun (m + sig.pureDepth f) (A.pure f args) = B.pure f (toFun m β args)
preserve_free : β (a : πΈ) (f : sig.free) {m : β} (args : sig.freeArgs f β A m),
toFun (m + sig.freeDepth f) (A.free f β¨a, argsβ©) = B.free f β¨a, toFun m β argsβ©
preserve_bound : β (a : πΈ) (f : sig.bound) {m : β} (args : sig.boundArgs f β A m),
toFun (m + sig.boundDepth f) (A.bound f (βͺaβ« args)) = B.bound f (βͺaβ« toFun m β args)
instance {A B : Algebra πΈ sig} : CoeFun (Algebra.Hom πΈ sig A B) (fun _ => (n : β) β (A n ββ[πΈ] B n)) where
coe h := h.toFun
end NominalAlgebra
|