Skip to content

Commit eb32396

Browse files
committed
exponential assemblies
1 parent 45addd3 commit eb32396

13 files changed

+521
-301
lines changed

src/Cat/Functor/Kan/Base.lagda.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,8 @@ record Ran (p : Functor C C') (F : Functor C D) : Type (kan-lvl p F) where
217217
module _ {p : Functor C C'} {F : Functor C D} {G : Functor C' D} {eta : F => G F∘ p} where
218218
is-lan-is-prop : is-prop (is-lan p F G eta)
219219
is-lan-is-prop a b = path where
220-
private
221-
module a = is-lan a
222-
module b = is-lan b
220+
module a = is-lan a
221+
module b = is-lan b
223222
224223
σ≡ : {M : Functor _ _} (α : F => M F∘ p) → a.σ α ≡ b.σ α
225224
σ≡ α = ext (a.σ-uniq (sym b.σ-comm) ηₚ_)
@@ -243,9 +242,8 @@ module _ {p : Functor C C'} {F : Functor C D} {G : Functor C' D} {eta : F => G F
243242
module _ {p : Functor C C'} {F : Functor C D} {G : Functor C' D} {eps : G F∘ p => F} where
244243
is-ran-is-prop : is-prop (is-ran p F G eps)
245244
is-ran-is-prop a b = path where
246-
private
247-
module a = is-ran a
248-
module b = is-ran b
245+
module a = is-ran a
246+
module b = is-ran b
249247
250248
σ≡ : {M : Functor _ _} (α : M F∘ p => F) → a.σ α ≡ b.σ α
251249
σ≡ α = ext (a.σ-uniq (sym b.σ-comm) ηₚ_)

src/Cat/Instances/Assemblies.lagda.md

Lines changed: 132 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<!--
22
```agda
33
open import 1Lab.Reflection.HLevel
4-
open import 1Lab.Reflection hiding (def ; absurd)
54
65
open import Cat.Functor.Adjoint
76
open import Cat.Prelude
@@ -11,9 +10,13 @@ open import Data.Partial.Base
1110
1211
open import Realisability.PCA
1312
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)
1720
1821
open Functor
1922
open _=>_
@@ -22,31 +25,27 @@ open _⊣_
2225
-->
2326

2427
```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
2829
```
2930

3031
<!--
3132
```agda
32-
open Realisability.Data.Pair p
33-
open Realisability.PCA.Sugar p
34-
open Realisability.Base p
35-
3633
private variable
37-
ℓ ℓ' : Level
34+
ℓ ℓ' ℓA : Level
35+
𝔸 : PCA ℓA
3836
```
3937
-->
4038

4139
# Assemblies over a PCA
4240

4341
```agda
44-
record Assembly ℓ : Type (lsuc ℓ ⊔ ℓA) where
42+
record Assembly (𝔸 : PCA ℓA) ℓ : Type (lsuc ℓ ⊔ ℓA) where
43+
no-eta-equality
4544
field
4645
Ob : Type ℓ
4746
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)
5049
```
5150

5251
<!--
@@ -56,38 +55,43 @@ record Assembly ℓ : Type (lsuc ℓ ⊔ ℓA) where
5655
open Assembly public
5756
5857
private variable
59-
X Y Z : Assembly ℓ
58+
X Y Z : Assembly 𝔸
6059
6160
instance
62-
Underlying-Assembly : Underlying (Assembly ℓ)
61+
Underlying-Assembly : Underlying (Assembly 𝔸 ℓ)
6362
Underlying-Assembly = record { ⌞_⌟ = Assembly.Ob }
6463
6564
hlevel-proj-asm : hlevel-projection (quote Assembly.Ob)
6665
hlevel-proj-asm .hlevel-projection.has-level = quote Assembly.has-is-set
6766
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
6968
hlevel-proj-asm .hlevel-projection.get-argument (_ ∷ c v∷ []) = pure c
7069
{-# CATCHALL #-}
7170
hlevel-proj-asm .hlevel-projection.get-argument _ = typeError []
7271
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
7473
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
7680
subst⊩ X {x} hx p = subst (_∈ X .realisers x) (sym p) hx
7781
```
7882
-->
7983

8084
```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+
8288
field
8389
map : ⌞ X ⌟ → ⌞ Y ⌟
8490
tracked : ∥ [ map ] X .realisers ⊢ Y .realisers ∥
8591
```
8692

8793
<!--
8894
```agda
89-
open Assembly-hom public
90-
9195
private unquoteDecl eqv = declare-record-iso eqv (quote Assembly-hom)
9296
9397
instance
@@ -98,26 +102,52 @@ instance
98102
Extensional-Assembly-hom ⦃ e ⦄ = injection→extensional! (λ p → Iso.injective eqv (Σ-prop-path! p)) e
99103
100104
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
102119
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
104136
open Precategory
105137
```
106138
-->
107139

108140
```agda
109141
Assemblies : ∀ ℓ → Precategory (lsuc ℓ ⊔ ℓA) (ℓA ⊔ ℓ)
110-
Assemblies ℓ .Ob = Assembly ℓ
142+
Assemblies ℓ .Ob = Assembly 𝔸
111143
Assemblies ℓ .Hom = Assembly-hom
112144
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 ⦈
121151
Assemblies ℓ .idr f = ext λ _ → refl
122152
Assemblies ℓ .idl f = ext λ _ → refl
123153
Assemblies ℓ .assoc f g h = ext λ _ → refl
@@ -126,85 +156,80 @@ module _ where
126156
## Classical assemblies
127157

128158
```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
162165
}
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
169194
```
170195

171-
## The assembly of booleans
196+
## The assembly of booleans
172197

173198
```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)
187212
```
188213

189214
```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
210235
```

0 commit comments

Comments
 (0)