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