Skip to content

Commit cfd3865

Browse files
committed
exponential assemblies
1 parent 45addd3 commit cfd3865

13 files changed

+520
-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: 131 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,42 +10,41 @@ 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
1714
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)
1820
open Functor
1921
open _=>_
2022
open _⊣_
2123
```
2224
-->
2325

2426
```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
2828
```
2929

3030
<!--
3131
```agda
32-
open Realisability.Data.Pair p
33-
open Realisability.PCA.Sugar p
34-
open Realisability.Base p
35-
3632
private variable
37-
ℓ ℓ' : Level
33+
ℓ ℓ' ℓA : Level
34+
𝔸 : PCA ℓA
3835
```
3936
-->
4037

4138
# Assemblies over a PCA
4239

4340
```agda
44-
record Assembly ℓ : Type (lsuc ℓ ⊔ ℓA) where
41+
record Assembly (𝔸 : PCA ℓA) ℓ : Type (lsuc ℓ ⊔ ℓA) where
42+
no-eta-equality
4543
field
4644
Ob : Type ℓ
4745
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)
5048
```
5149

5250
<!--
@@ -56,38 +54,43 @@ record Assembly ℓ : Type (lsuc ℓ ⊔ ℓA) where
5654
open Assembly public
5755
5856
private variable
59-
X Y Z : Assembly ℓ
57+
X Y Z : Assembly 𝔸
6058
6159
instance
62-
Underlying-Assembly : Underlying (Assembly ℓ)
60+
Underlying-Assembly : Underlying (Assembly 𝔸 ℓ)
6361
Underlying-Assembly = record { ⌞_⌟ = Assembly.Ob }
6462
6563
hlevel-proj-asm : hlevel-projection (quote Assembly.Ob)
6664
hlevel-proj-asm .hlevel-projection.has-level = quote Assembly.has-is-set
6765
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
6967
hlevel-proj-asm .hlevel-projection.get-argument (_ ∷ c v∷ []) = pure c
7068
{-# CATCHALL #-}
7169
hlevel-proj-asm .hlevel-projection.get-argument _ = typeError []
7270
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 #-}
7477
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
7679
subst⊩ X {x} hx p = subst (_∈ X .realisers x) (sym p) hx
7780
```
7881
-->
7982

8083
```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+
8287
field
8388
map : ⌞ X ⌟ → ⌞ Y ⌟
8489
tracked : ∥ [ map ] X .realisers ⊢ Y .realisers ∥
8590
```
8691

8792
<!--
8893
```agda
89-
open Assembly-hom public
90-
9194
private unquoteDecl eqv = declare-record-iso eqv (quote Assembly-hom)
9295
9396
instance
@@ -98,26 +101,52 @@ instance
98101
Extensional-Assembly-hom ⦃ e ⦄ = injection→extensional! (λ p → Iso.injective eqv (Σ-prop-path! p)) e
99102
100103
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
102118
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
104135
open Precategory
105136
```
106137
-->
107138

108139
```agda
109140
Assemblies : ∀ ℓ → Precategory (lsuc ℓ ⊔ ℓA) (ℓA ⊔ ℓ)
110-
Assemblies ℓ .Ob = Assembly ℓ
141+
Assemblies ℓ .Ob = Assembly 𝔸
111142
Assemblies ℓ .Hom = Assembly-hom
112143
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 ⦈
121150
Assemblies ℓ .idr f = ext λ _ → refl
122151
Assemblies ℓ .idl f = ext λ _ → refl
123152
Assemblies ℓ .assoc f g h = ext λ _ → refl
@@ -126,85 +155,80 @@ module _ where
126155
## Classical assemblies
127156

128157
```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
162164
}
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
169193
```
170194

171-
## The assembly of booleans
195+
## The assembly of booleans
172196

173197
```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)
187211
```
188212

189213
```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
210234
```

0 commit comments

Comments
 (0)