blob: 13b54a022be102adf32695d067e7828b7a793707 (
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
import Mathlib
import Algebra.Terms
import Algebra.Derivations
open CategoryTheory
namespace NominalAlgebra
section AlgebraDefinition
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
@[ext]
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 AlgebraDefinition
section Algebra
variable {πΈ : Type} [Infinite πΈ] [Countable πΈ] [DecidableEq πΈ]
variable {sig : Signature}
namespace Algebra
def Hom.id (A : Algebra πΈ sig) : Hom πΈ sig A A where
toFun _ := EquivariantMap.id πΈ
preserve_pure _ _ _ := rfl
preserve_free _ _ _ _ := rfl
preserve_bound _ _ _ _ := rfl
def Hom.comp {A B C : Algebra πΈ sig} (h : Hom πΈ sig B C) (g : Hom πΈ sig A B) : Hom πΈ sig A C where
toFun n := EquivariantMap.comp πΈ (h n) (g n)
preserve_pure f m args := by
rw [EquivariantMap.comp_app, g.preserve_pure, h.preserve_pure]
rfl
preserve_free a f m args := by
rw [EquivariantMap.comp_app, g.preserve_free, h.preserve_free]
rfl
preserve_bound a f m args := by
rw [EquivariantMap.comp_app, g.preserve_bound, h.preserve_bound]
rfl
instance : Category (Algebra πΈ sig) where
Hom := Hom πΈ sig
id := Hom.id
comp h g := Hom.comp g h
def forgetfulFunctor : Algebra πΈ sig β₯€ Nom πΈ where
obj X := X 0
map f := f.toFun 0
end Algebra
end Algebra
end NominalAlgebra
|