1
1
<!--
2
2
```agda
3
3
open import 1Lab.Reflection.HLevel
4
- open import 1Lab.Reflection hiding (def ; absurd)
5
4
6
5
open import Cat.Functor.Adjoint
7
6
open import Cat.Prelude
@@ -11,42 +10,41 @@ open import Data.Partial.Base
11
10
12
11
open import Realisability.PCA
13
12
14
- import Realisability.Data.Pair
15
- import Realisability.PCA.Sugar
16
- import Realisability.Base
13
+ import 1Lab.Reflection as R
17
14
15
+ import Realisability.Data.Pair as Pair
16
+ import Realisability.PCA.Sugar as Sugar
17
+ import Realisability.Base as Logic
18
+
19
+ open R hiding (def ; absurd)
18
20
open Functor
19
21
open _=>_
20
22
open _⊣_
21
23
```
22
24
-->
23
25
24
26
``` agda
25
- module Cat.Instances.Assemblies
26
- {ℓA} {A : Type ℓA} ⦃ _ : H-Level A 2 ⦄ {_%_ : ↯ A → ↯ A → ↯ A} (p : is-pca _%_)
27
- where
27
+ module Cat.Instances.Assemblies where
28
28
```
29
29
30
30
<!--
31
31
```agda
32
- open Realisability.Data.Pair p
33
- open Realisability.PCA.Sugar p
34
- open Realisability.Base p
35
-
36
32
private variable
37
- ℓ ℓ' : Level
33
+ ℓ ℓ' ℓA : Level
34
+ 𝔸 : PCA ℓA
38
35
```
39
36
-->
40
37
41
38
# Assemblies over a PCA
42
39
43
40
``` agda
44
- record Assembly ℓ : Type (lsuc ℓ ⊔ ℓA) where
41
+ record Assembly (𝔸 : PCA ℓA) ℓ : Type (lsuc ℓ ⊔ ℓA) where
42
+ no-eta-equality
45
43
field
46
44
Ob : Type ℓ
47
45
has-is-set : is-set Ob
48
- realisers : Ob → ℙ⁺ A
49
- realised : ∀ x → ∃[ a ∈ ↯ A ] (a ∈ realisers x)
46
+ realisers : Ob → ℙ⁺ ⌞ 𝔸 ⌟
47
+ realised : ∀ x → ∃[ a ∈ ↯ ⌞ 𝔸 ⌟ ] (a ∈ realisers x)
50
48
```
51
49
52
50
<!--
@@ -56,38 +54,43 @@ record Assembly ℓ : Type (lsuc ℓ ⊔ ℓA) where
56
54
open Assembly public
57
55
58
56
private variable
59
- X Y Z : Assembly ℓ
57
+ X Y Z : Assembly 𝔸 ℓ
60
58
61
59
instance
62
- Underlying-Assembly : Underlying (Assembly ℓ)
60
+ Underlying-Assembly : Underlying (Assembly 𝔸 ℓ)
63
61
Underlying-Assembly = record { ⌞_⌟ = Assembly.Ob }
64
62
65
63
hlevel-proj-asm : hlevel-projection (quote Assembly.Ob)
66
64
hlevel-proj-asm .hlevel-projection.has-level = quote Assembly.has-is-set
67
65
hlevel-proj-asm .hlevel-projection.get-level _ = pure (quoteTerm (suc (suc zero)))
68
- hlevel-proj-asm .hlevel-projection.get-argument (_ ∷ _ ∷ _ ∷ _ ∷ _ ∷ _ ∷ c v∷ []) = pure c
66
+ hlevel-proj-asm .hlevel-projection.get-argument (_ ∷ _ ∷ _ ∷ c v∷ []) = pure c
69
67
hlevel-proj-asm .hlevel-projection.get-argument (_ ∷ c v∷ []) = pure c
70
68
{-# CATCHALL #-}
71
69
hlevel-proj-asm .hlevel-projection.get-argument _ = typeError []
72
70
73
- module _ (X : Assembly ℓ) (a : ↯ A) (x : ⌞ X ⌟) where open Ω (X .realisers x .mem a) renaming (∣_∣ to [_]_⊩_) public
71
+ module _ (X : Assembly 𝔸 ℓ) (a : ↯ ⌞ 𝔸 ⌟) (x : ⌞ X ⌟) where open Ω (X .realisers x .mem a) renaming (∣_∣ to [_]_⊩_) public
72
+
73
+ -- This module can't be parametrised so this display form can fire
74
+ -- (otherwise it gets closed over pattern variables that aren't solvable
75
+ -- from looking at the expression, like the level and the PCA):
76
+ {-# DISPLAY realisers X x .ℙ⁺.mem a = [ X ] a ⊩ x #-}
74
77
75
- subst⊩ : (X : Assembly ℓ) {x : ⌞ X ⌟} {p q : ↯ A } → [ X ] p ⊩ x → q ≡ p → [ X ] q ⊩ x
78
+ subst⊩ : {𝔸 : PCA ℓA} (X : Assembly 𝔸 ℓ) {x : ⌞ X ⌟} {p q : ↯ ⌞ 𝔸 ⌟ } → [ X ] p ⊩ x → q ≡ p → [ X ] q ⊩ x
76
79
subst⊩ X {x} hx p = subst (_∈ X .realisers x) (sym p) hx
77
80
```
78
81
-->
79
82
80
83
``` agda
81
- record Assembly-hom (X : Assembly ℓ) (Y : Assembly ℓ') : Type (ℓA ⊔ ℓ ⊔ ℓ') where
84
+ record Assembly-hom {𝔸 : PCA ℓA} (X : Assembly 𝔸 ℓ) (Y : Assembly 𝔸 ℓ') : Type (ℓA ⊔ ℓ ⊔ ℓ') where
85
+ open Logic 𝔸 using ([_]_⊢_)
86
+
82
87
field
83
88
map : ⌞ X ⌟ → ⌞ Y ⌟
84
89
tracked : ∥ [ map ] X .realisers ⊢ Y .realisers ∥
85
90
```
86
91
87
92
<!--
88
93
```agda
89
- open Assembly-hom public
90
-
91
94
private unquoteDecl eqv = declare-record-iso eqv (quote Assembly-hom)
92
95
93
96
instance
@@ -98,26 +101,52 @@ instance
98
101
Extensional-Assembly-hom ⦃ e ⦄ = injection→extensional! (λ p → Iso.injective eqv (Σ-prop-path! p)) e
99
102
100
103
Funlike-Assembly-hom : Funlike (Assembly-hom X Y) ⌞ X ⌟ λ _ → ⌞ Y ⌟
101
- Funlike-Assembly-hom = record { _·_ = λ f x → f .map x }
104
+ Funlike-Assembly-hom = record { _·_ = Assembly-hom.map }
105
+
106
+ {-# DISPLAY Assembly-hom.map f x = f · x #-}
107
+
108
+ -- Helper record for constructing an assembly map when the realiser is
109
+ -- known/does not depend on other truncated data; the 'tracks' field has
110
+ -- all visible arguments to work with `record where` syntax.
111
+
112
+ record make-assembly-hom {𝔸 : PCA ℓA} (X : Assembly 𝔸 ℓ) (Y : Assembly 𝔸 ℓ') : Type (ℓA ⊔ ℓ ⊔ ℓ') where
113
+ open PCA 𝔸 using (_%_)
114
+ field
115
+ map : ⌞ X ⌟ → ⌞ Y ⌟
116
+ realiser : ↯⁺ 𝔸
117
+ tracks : (x : ⌞ X ⌟) (a : ↯ ⌞ 𝔸 ⌟) (ah : [ X ] a ⊩ x) → [ Y ] realiser .fst % a ⊩ map x
102
118
103
- module _ where
119
+ open Assembly-hom public
120
+
121
+ to-assembly-hom
122
+ : ∀ {𝔸 : PCA ℓA} {X : Assembly 𝔸 ℓ} {Y : Assembly 𝔸 ℓ'}
123
+ → make-assembly-hom X Y
124
+ → Assembly-hom X Y
125
+ {-# INLINE to-assembly-hom #-}
126
+
127
+ to-assembly-hom f = record { make-assembly-hom f using (map) ; tracked = inc record { make-assembly-hom f } }
128
+
129
+ module _ (𝔸 : PCA ℓA) where
130
+ open Logic 𝔸
131
+ open Sugar 𝔸
132
+ open Pair 𝔸
133
+
134
+ open Assembly-hom
104
135
open Precategory
105
136
```
106
137
-->
107
138
108
139
``` agda
109
140
Assemblies : ∀ ℓ → Precategory (lsuc ℓ ⊔ ℓA) (ℓA ⊔ ℓ)
110
- Assemblies ℓ .Ob = Assembly ℓ
141
+ Assemblies ℓ .Ob = Assembly 𝔸 ℓ
111
142
Assemblies ℓ .Hom = Assembly-hom
112
143
Assemblies ℓ .Hom-set x y = hlevel 2
113
- Assemblies ℓ .id = record
114
- { map = λ x → x
115
- ; tracked = inc id⊢
116
- }
117
- Assemblies ℓ ._∘_ f g = record
118
- { map = λ x → f · (g · x)
119
- ; tracked = ⦇ f .tracked ∘⊢ g .tracked ⦈
120
- }
144
+ Assemblies ℓ .id = record where
145
+ map x = x
146
+ tracked = inc id⊢
147
+ Assemblies ℓ ._∘_ f g = record where
148
+ map x = f · (g · x)
149
+ tracked = ⦇ f .tracked ∘⊢ g .tracked ⦈
121
150
Assemblies ℓ .idr f = ext λ _ → refl
122
151
Assemblies ℓ .idl f = ext λ _ → refl
123
152
Assemblies ℓ .assoc f g h = ext λ _ → refl
@@ -126,85 +155,80 @@ module _ where
126
155
## Classical assemblies
127
156
128
157
``` agda
129
- ∇ : ∀ {ℓ} (X : Type ℓ) ⦃ _ : H-Level X 2 ⦄ → Assembly ℓ
130
- ∇ X .Ob = X
131
- ∇ X .has-is-set = hlevel 2
132
- ∇ X .realisers x = record
133
- { mem = def
134
- ; defined = λ x → x
135
- }
136
- ∇ X .realised x = inc (expr ⟨ x ⟩ x , abs↓ _ _)
137
-
138
- Cofree : Functor (Sets ℓ) (Assemblies ℓ)
139
- Cofree .F₀ X = ∇ ⌞ X ⌟
140
- Cofree .F₁ f = record
141
- { map = f
142
- ; tracked = inc record
143
- { realiser = val ⟨ x ⟩ x
144
- ; tracks = λ a ha → subst ⌞_⌟ (sym (abs-β _ [] (a , ha))) ha
145
- }
146
- }
147
- Cofree .F-id = ext λ _ → refl
148
- Cofree .F-∘ f g = ext λ _ → refl
149
-
150
- Forget : Functor (Assemblies ℓ) (Sets ℓ)
151
- Forget .F₀ X = el! ⌞ X ⌟
152
- Forget .F₁ f = f ·_
153
- Forget .F-id = refl
154
- Forget .F-∘ f g = refl
155
-
156
- Forget⊣∇ : Forget {ℓ} ⊣ Cofree
157
- Forget⊣∇ .unit .η X = record
158
- { map = λ x → x
159
- ; tracked = inc record
160
- { realiser = val ⟨ x ⟩ x
161
- ; tracks = λ a ha → subst ⌞_⌟ (sym (abs-β _ [] (a , X .realisers _ .defined ha))) (X .realisers _ .defined ha)
158
+ ∇ : ∀ {ℓ} (X : Type ℓ) ⦃ _ : H-Level X 2 ⦄ → Assembly 𝔸 ℓ
159
+ ∇ X .Ob = X
160
+ ∇ X .has-is-set = hlevel 2
161
+ ∇ X .realisers x = record
162
+ { mem = def
163
+ ; defined = λ x → x
162
164
}
163
- }
164
- Forget⊣∇ .unit .is-natural x y f = ext λ _ → refl
165
- Forget⊣∇ .counit .η X a = a
166
- Forget⊣∇ .counit .is-natural x y f = refl
167
- Forget⊣∇ .zig = refl
168
- Forget⊣∇ .zag = ext λ _ → refl
165
+ ∇ X .realised x = inc (expr ⟨ x ⟩ x , abs↓ _ _)
166
+
167
+ Cofree : Functor (Sets ℓ) (Assemblies ℓ)
168
+ Cofree .F₀ X = ∇ ⌞ X ⌟
169
+ Cofree .F₁ f = to-assembly-hom record where
170
+ map = f
171
+ realiser = val ⟨ x ⟩ x
172
+ tracks x a ha = subst ⌞_⌟ (sym (abs-β _ [] (a , ha))) ha
173
+ Cofree .F-id = ext λ _ → refl
174
+ Cofree .F-∘ f g = ext λ _ → refl
175
+
176
+ Forget : Functor (Assemblies ℓ) (Sets ℓ)
177
+ Forget .F₀ X = el! ⌞ X ⌟
178
+ Forget .F₁ f = f ·_
179
+ Forget .F-id = refl
180
+ Forget .F-∘ f g = refl
181
+
182
+ Forget⊣∇ : Forget {ℓ} ⊣ Cofree
183
+ Forget⊣∇ .unit .η X = to-assembly-hom record where
184
+ map x = x
185
+ realiser = val ⟨ x ⟩ x
186
+ tracks x a ha = subst ⌞_⌟ (sym (abs-β _ [] (a , X .defined ha))) (X .defined ha)
187
+
188
+ Forget⊣∇ .unit .is-natural x y f = ext λ _ → refl
189
+ Forget⊣∇ .counit .η X a = a
190
+ Forget⊣∇ .counit .is-natural x y f = refl
191
+ Forget⊣∇ .zig = refl
192
+ Forget⊣∇ .zag = ext λ _ → refl
169
193
```
170
194
171
- ## The assembly of booleans
195
+ ## The assembly of booleans
172
196
173
197
``` agda
174
- 𝟚 : Assembly lzero
175
- 𝟚 .Ob = Bool
176
- 𝟚 .has-is-set = hlevel 2
177
- 𝟚 .realisers true = record
178
- { mem = λ x → elΩ (`true .fst ≡ x)
179
- ; defined = rec! λ p → subst ⌞_⌟ p (`true .snd)
180
- }
181
- 𝟚 .realisers false = record
182
- { mem = λ x → elΩ (`false .fst ≡ x)
183
- ; defined = rec! λ p → subst ⌞_⌟ p (`false .snd)
184
- }
185
- 𝟚 .realised true = inc (`true .fst , inc refl)
186
- 𝟚 .realised false = inc (`false .fst , inc refl)
198
+ 𝟚 : Assembly 𝔸 lzero
199
+ 𝟚 .Ob = Bool
200
+ 𝟚 .has-is-set = hlevel 2
201
+ 𝟚 .realisers true = record
202
+ { mem = λ x → elΩ (`true .fst ≡ x)
203
+ ; defined = rec! λ p → subst ⌞_⌟ p (`true .snd)
204
+ }
205
+ 𝟚 .realisers false = record
206
+ { mem = λ x → elΩ (`false .fst ≡ x)
207
+ ; defined = rec! λ p → subst ⌞_⌟ p (`false .snd)
208
+ }
209
+ 𝟚 .realised true = inc (`true .fst , inc refl)
210
+ 𝟚 .realised false = inc (`false .fst , inc refl)
187
211
```
188
212
189
213
``` agda
190
- non-constant-nabla-map
191
- : (f : Assembly-hom (∇ Bool) 𝟚)
192
- → f · true ≠ f · false
193
- → `true .fst ≡ `false .fst
194
- non-constant-nabla-map f x = case f .tracked of λ where
195
- record { realiser = (fp , f↓) ; tracks = t } →
196
- let
197
- a = t { true} (`true .fst) (`true .snd)
198
- b = t { false} (`true .fst) (`true .snd)
199
-
200
- cases
201
- : ∀ b b' (x : ↯ A )
202
- → [ 𝟚 ] x ⊩ b → [ 𝟚 ] x ⊩ b'
203
- → b ≠ b' → `true .fst ≡ `false .fst
204
- cases = λ where
205
- true true p → rec! λ rb rb' t≠t → absurd (t≠t refl)
206
- true false p → rec! λ rb rb' _ → rb ∙ sym rb'
207
- false true p → rec! λ rb rb' _ → rb' ∙ sym rb
208
- false false p → rec! λ rb rb' f≠f → absurd (f≠f refl)
209
- in cases (f · true) (f · false) _ a b x
214
+ non-constant-nabla-map
215
+ : (f : Assembly-hom (∇ Bool) 𝟚)
216
+ → f · true ≠ f · false
217
+ → `true .fst ≡ `false .fst
218
+ non-constant-nabla-map f x = case f .tracked of λ where
219
+ record { realiser = (fp , f↓) ; tracks = t } →
220
+ let
221
+ a = t true (`true .fst) (`true .snd)
222
+ b = t false (`true .fst) (`true .snd)
223
+
224
+ cases
225
+ : ∀ b b' (x : ↯ ⌞ 𝔸 ⌟ )
226
+ → [ 𝟚 ] x ⊩ b → [ 𝟚 ] x ⊩ b'
227
+ → b ≠ b' → `true .fst ≡ `false .fst
228
+ cases = λ where
229
+ true true p → rec! λ rb rb' t≠t → absurd (t≠t refl)
230
+ true false p → rec! λ rb rb' _ → rb ∙ sym rb'
231
+ false true p → rec! λ rb rb' _ → rb' ∙ sym rb
232
+ false false p → rec! λ rb rb' f≠f → absurd (f≠f refl)
233
+ in cases (f · true) (f · false) _ a b x
210
234
```
0 commit comments