Skip to content

Commit 0110b4e

Browse files
committed
wip: pcas
1 parent 53169a5 commit 0110b4e

File tree

10 files changed

+777
-1
lines changed

10 files changed

+777
-1
lines changed

src/Data/Partial/Base.lagda.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ part-ap f x .elt (pf , px) = f .elt pf (x .elt px)
207207

208208
<!--
209209
```agda
210+
is-always : {A : Type ℓ} (a : ↯ A) (x : ⌞ a ⌟) → a ≡ always (a .elt x)
211+
is-always a x = part-ext (λ _ → tt) (λ z → x) λ _ _ → ↯-indep a
212+
210213
instance
211214
↯-Map : Map (eff ↯)
212215
↯-Map .Map.map = part-map
@@ -219,6 +222,18 @@ instance
219222
↯-Bind : Bind (eff ↯)
220223
↯-Bind .Bind._>>=_ = part-bind
221224
↯-Bind .Bind.Idiom-bind = ↯-Idiom
225+
226+
-- This class lets us define syntax sugar for e.g. lifted binary
227+
-- operators which automatically lifts values from the base type
228+
record To-part {ℓ'} (X : Type ℓ') (A : Type ℓ) : Type (ℓ ⊔ ℓ') where
229+
field to-part : X → ↯ A
230+
231+
instance
232+
part-to-part : To-part (↯ A) A
233+
part-to-part = record { to-part = λ x → x }
234+
235+
pure-to-part : To-part A A
236+
pure-to-part = record { to-part = always }
222237
```
223238
-->
224239

src/Data/Partial/Total.lagda.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<!--
2+
```agda
3+
open import 1Lab.Prelude
4+
5+
open import Data.Partial.Base
6+
open import Data.Nat.Base
7+
open import Data.Power using (ℙ)
8+
```
9+
-->
10+
11+
```agda
12+
module Data.Partial.Total where
13+
```
14+
15+
```agda
16+
private variable
17+
ℓ ℓ' ℓ'' : Level
18+
A B C X Y : Type ℓ
19+
```
20+
21+
# Total partial elements
22+
23+
```agda
24+
↯⁺ : Type ℓ → Type ℓ
25+
↯⁺ A = Σ[ a ∈ ↯ A ] ⌞ a ⌟
26+
```
27+
28+
<!--
29+
```agda
30+
instance
31+
fat-to-part : To-part (↯⁺ A) A
32+
fat-to-part = record { to-part = fst }
33+
34+
↯⁺-Map : Map (eff ↯⁺)
35+
↯⁺-Map .Map.map f (x , hx) = part-map f x , hx
36+
37+
↯⁺-Idiom : Idiom (eff ↯⁺)
38+
↯⁺-Idiom .Idiom.Map-idiom = ↯⁺-Map
39+
↯⁺-Idiom .Idiom.pure x = always x , tt
40+
↯⁺-Idiom .Idiom._<*>_ (f , hf) (x , hx) = part-ap f x , hf , hx
41+
42+
Extensional-↯⁺ : ⦃ _ : Extensional (↯ A) ℓ ⦄ → Extensional (↯⁺ A) ℓ
43+
Extensional-↯⁺ ⦃ e ⦄ = embedding→extensional (fst , Subset-proj-embedding (λ _ → hlevel 1)) e
44+
45+
abstract
46+
H-Level-↯⁺ : ∀ {A : Type ℓ} {n} ⦃ _ : 2 ≤ n ⦄ ⦃ _ : H-Level A n ⦄ → H-Level (↯⁺ A) n
47+
H-Level-↯⁺ {n = suc (suc n)} ⦃ s≤s (s≤s p) ⦄ = hlevel-instance $
48+
embedding→is-hlevel (1 + n) (Subset-proj-embedding λ _ → hlevel 1) (hlevel (2 + n))
49+
```
50+
-->
51+
52+
```agda
53+
from-total : ↯⁺ A → A
54+
from-total (a , ha) = a .elt ha
55+
56+
from-total-is-equiv : is-equiv (from-total {A = A})
57+
from-total-is-equiv = is-iso→is-equiv (iso pure (λ _ → refl) λ (x , a) → Σ-prop-path! (sym (is-always x a)))
58+
```
59+
60+
```agda
61+
record ℙ⁺ (A : Type ℓ) : Type ℓ where
62+
field
63+
mem : ↯ A → Ω
64+
defined : ∀ {a} → ⌞ mem a ⌟ → ⌞ a ⌟
65+
```
66+
67+
<!--
68+
```agda
69+
private unquoteDecl eqv = declare-record-iso eqv (quote ℙ⁺)
70+
open ℙ⁺ public
71+
open is-iso
72+
73+
instance
74+
Membership-ℙ⁺ : ⦃ _ : To-part X A ⦄ → Membership X (ℙ⁺ A) _
75+
Membership-ℙ⁺ = record { _∈_ = λ a p → ⌞ p .mem (to-part a) ⌟ } where open To-part ⦃ ... ⦄
76+
77+
Extensional-ℙ⁺ : ∀ {ℓr} ⦃ _ : Extensional (↯ A → Ω) ℓr ⦄ → Extensional (ℙ⁺ A) ℓr
78+
Extensional-ℙ⁺ ⦃ e ⦄ = injection→extensional! (λ p → Iso.injective eqv (Σ-prop-path! p)) e
79+
80+
H-Level-ℙ⁺ : ∀ {n} → H-Level (ℙ⁺ A) (2 + n)
81+
H-Level-ℙ⁺ = basic-instance 2 (Iso→is-hlevel 2 eqv (hlevel 2))
82+
```
83+
-->
84+
85+
```agda
86+
from-total-predicate : ℙ A → ℙ⁺ A
87+
from-total-predicate P .mem x = el (Σ[ hx ∈ x ] x .elt hx ∈ P) (hlevel 1)
88+
from-total-predicate P .defined (hx , _) = hx
89+
90+
from-total-predicate-is-equiv : is-equiv (from-total-predicate {A = A})
91+
from-total-predicate-is-equiv = is-iso→is-equiv λ where
92+
.inv P a → P .mem (always a)
93+
.rinv P → ext λ a → Ω-ua (rec! (λ ha → subst (_∈ P) (sym (is-always a ha)))) λ pa → P .defined pa , subst (_∈ P) (is-always a _) pa
94+
.linv P → ext λ a → Ω-ua snd (tt ,_)
95+
```

src/Data/Vec/Base.lagda.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ open import 1Lab.Path
44
open import 1Lab.Type
55
66
open import Data.Product.NAry
7-
open import Data.List.Base hiding (lookup ; tabulate)
7+
open import Data.List.Base hiding (lookup ; tabulate ; _++_)
88
open import Data.Fin.Base
99
open import Data.Nat.Base
1010
```
@@ -86,6 +86,10 @@ map : (A → B) → Vec A n → Vec B n
8686
map f [] = []
8787
map f (x ∷ xs) = f x ∷ map f xs
8888
89+
_++_ : ∀ {n k} → Vec A n → Vec A k → Vec A (n + k)
90+
[] ++ ys = ys
91+
(x ∷ xs) ++ ys = x ∷ (xs ++ ys)
92+
8993
zip-with : (A → B → C) → Vec A n → Vec B n → Vec C n
9094
zip-with f [] [] = []
9195
zip-with f (x ∷ xs) (y ∷ ys) = f x y ∷ zip-with f xs ys

src/Realisability/Base.lagda.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<!--
2+
```agda
3+
open import 1Lab.Prelude
4+
5+
open import Data.Partial.Total
6+
open import Data.Partial.Base
7+
open import Data.Vec.Base
8+
9+
open import Realisability.PCA
10+
11+
import Realisability.Data.Pair as pairs
12+
import Realisability.PCA.Sugar as S
13+
import Realisability.Data.Sum as sums
14+
```
15+
-->
16+
17+
```agda
18+
module Realisability.Base
19+
{ℓ} {𝔸 : Type ℓ} (_%_ : ↯ 𝔸 → ↯ 𝔸 → ↯ 𝔸) (p : is-pca _%_)
20+
where
21+
```
22+
23+
<!--
24+
```agda
25+
open pairs p
26+
open sums p
27+
open S p
28+
29+
private variable
30+
ℓ' ℓ'' : Level
31+
X Y Z : Type ℓ'
32+
n : Nat
33+
```
34+
-->
35+
36+
# Realisability logic
37+
38+
```agda
39+
record [_]_⊢_ (f : X → Y) (P : X → ℙ⁺ 𝔸) (Q : Y → ℙ⁺ 𝔸) : Type (level-of X ⊔ level-of Y ⊔ ℓ) where
40+
field
41+
realiser : ↯⁺ 𝔸
42+
tracks : ∀ {x} (a : ↯ 𝔸) (ah : a ∈ P x) → realiser ⋆ a ∈ Q (f x)
43+
44+
realiser↓ : ∀ {x} (a : ↯ 𝔸) (ah : a ∈ P x) → ⌞ realiser ⋆ a ⌟
45+
realiser↓ a ah = Q _ .defined (tracks a ah)
46+
```
47+
48+
<!--
49+
```agda
50+
private unquoteDecl eqv' = declare-record-iso eqv' (quote [_]_⊢_)
51+
52+
open [_]_⊢_
53+
54+
instance
55+
tracks-to-term : ∀ {V : Type} {P : X → ℙ⁺ 𝔸} {Q : Y → ℙ⁺ 𝔸} {f : X → Y} → To-term V ([ f ] P ⊢ Q)
56+
tracks-to-term = record { to = λ x → const (x .realiser) }
57+
58+
tracks-to-part : ∀ {P : X → ℙ⁺ 𝔸} {Q : Y → ℙ⁺ 𝔸} {f : X → Y} → To-part ([ f ] P ⊢ Q) 𝔸
59+
tracks-to-part = record { to-part = λ x → x .realiser .fst }
60+
61+
private
62+
variable P Q R : X → ℙ⁺ 𝔸
63+
64+
subst-∈ : (P : ℙ⁺ 𝔸) {x y : ↯ 𝔸} → x ∈ P → y ≡ x → y ∈ P
65+
subst-∈ P hx p = subst (_∈ P) (sym p) hx
66+
```
67+
-->
68+
69+
## Basic structural rules
70+
71+
```agda
72+
id⊢ : [ id ] P ⊢ P
73+
id⊢ {P = P} = record
74+
{ realiser = val ⟨ x ⟩ x
75+
; tracks = λ {x} a ha → subst-∈ (P x) ha (abs-β _ [] (a , P x .defined ha))
76+
}
77+
78+
_∘⊢_ : ∀ {f g} → [ g ] Q ⊢ R → [ f ] P ⊢ Q → [ g ∘ f ] P ⊢ R
79+
_∘⊢_ {R = R} {P = P} α β = record
80+
{ realiser = val ⟨ x ⟩ α `· (β `· x)
81+
; tracks = λ a ha → subst-∈ (R _) (α .tracks (β ⋆ a) (β .tracks a ha)) $
82+
(val ⟨ x ⟩ α `· (β `· x)) ⋆ a ≡⟨ abs-β _ [] (a , P _ .defined ha) ⟩
83+
α ⋆ (β ⋆ a) ∎
84+
}
85+
```
86+
87+
## Conjunction
88+
89+
```agda
90+
_∧T_ : (P Q : X → ℙ⁺ 𝔸) → X → ℙ⁺ 𝔸
91+
(P ∧T Q) x = record
92+
{ mem = λ a → elΩ (Σ[ u ∈ ↯⁺ 𝔸 ] Σ[ v ∈ ↯⁺ 𝔸 ] (a ≡ `pair ⋆ u ⋆ v × u ∈ P x × v ∈ Q x))
93+
; defined = rec! (λ u hu v hv α _ _ → subst ⌞_⌟ (sym α) (`pair↓₂ hu hv))
94+
}
95+
96+
π₁⊢ : [ id ] (P ∧T Q) ⊢ P
97+
π₁⊢ {P = P} {Q = Q} = record { realiser = `fst ; tracks = tr } where
98+
tr : ∀ {x} (a : ↯ 𝔸) (ah : a ∈ (P ∧T Q) x) → `fst ⋆ a ∈ P x
99+
tr {x} = elim! λ a p hp q hq α pp qq → subst-∈ (P _) pp $
100+
`fst ⋆ a ≡⟨ ap (`fst ⋆_) α ⟩
101+
`fst ⋆ (`pair ⋆ p ⋆ q) ≡⟨ `fst-β hp hq ⟩
102+
p ∎
103+
104+
π₂⊢ : [ id ] (P ∧T Q) ⊢ Q
105+
π₂⊢ {P = P} {Q = Q} = record { realiser = `snd ; tracks = tr } where
106+
tr : ∀ {x} (a : ↯ 𝔸) (ah : a ∈ (P ∧T Q) x) → `snd ⋆ a ∈ Q x
107+
tr {x} = elim! λ a p hp q hq α pp qq → subst-∈ (Q _) qq $
108+
`snd ⋆ a ≡⟨ ap (`snd ⋆_) α ⟩
109+
`snd ⋆ (`pair ⋆ p ⋆ q) ≡⟨ `snd-β hp hq ⟩
110+
q ∎
111+
```

src/Realisability/Data/Pair.lagda.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<!--
2+
```agda
3+
open import 1Lab.Prelude
4+
5+
open import Data.Partial.Total
6+
open import Data.Partial.Base
7+
open import Data.Vec.Base
8+
9+
open import Realisability.PCA
10+
11+
import Realisability.PCA.Sugar as S
12+
```
13+
-->
14+
15+
```agda
16+
module Realisability.Data.Pair
17+
```
18+
19+
<!--
20+
```agda
21+
{ℓ} {A : Type ℓ} {_%_ : ↯ A → ↯ A → ↯ A} (pca : is-pca _%_)
22+
(let infixl 8 _%_; _%_ = _%_)
23+
where
24+
25+
open S pca
26+
```
27+
-->
28+
29+
# Pairs in a PCA
30+
31+
```agda
32+
`true : ↯⁺ A
33+
`true = val ⟨ x ⟩ ⟨ y ⟩ x
34+
35+
`false : ↯⁺ A
36+
`false = val ⟨ x ⟩ ⟨ y ⟩ y
37+
38+
abstract
39+
`false-β : {a b : ↯ A} → ⌞ a ⌟ → ⌞ b ⌟ → `false ⋆ a ⋆ b ≡ b
40+
`false-β {a} {b} ah bh = abs-βₙ [] ((b , bh) ∷ (a , ah) ∷ [])
41+
42+
`true-β : {a b : ↯ A} → ⌞ a ⌟ → ⌞ b ⌟ → `true ⋆ a ⋆ b ≡ a
43+
`true-β {a} {b} ah bh = abs-βₙ [] ((b , bh) ∷ (a , ah) ∷ [])
44+
45+
`pair : ↯⁺ A
46+
`pair = val ⟨ a ⟩ ⟨ b ⟩ ⟨ i ⟩ i `· a `· b
47+
48+
abstract
49+
`pair↓₂ : ∀ {a b} → ⌞ a ⌟ → ⌞ b ⌟ → ⌞ `pair .fst % a % b ⌟
50+
`pair↓₂ {a} {b} ah bh = subst ⌞_⌟ (sym (abs-βₙ [] ((b , bh) ∷ (a , ah) ∷ []))) (abs↓ _ ((b , bh) ∷ (a , ah) ∷ []))
51+
52+
`fst : ↯⁺ A
53+
`fst = val ⟨ p ⟩ p `· `true
54+
55+
`snd : ↯⁺ A
56+
`snd = val ⟨ p ⟩ p `· `false
57+
58+
`fst-β : ∀ {a b} → ⌞ a ⌟ → ⌞ b ⌟ → `fst ⋆ (`pair ⋆ a ⋆ b) ≡ a
59+
`fst-β {a} {b} ah bh =
60+
`fst ⋆ (`pair ⋆ a ⋆ b) ≡⟨ abs-β _ [] (_ , `pair↓₂ ah bh) ⟩
61+
`pair ⋆ a ⋆ b ⋆ `true ≡⟨ abs-βₙ [] (`true ∷ (b , bh) ∷ (a , ah) ∷ []) ⟩
62+
`true ⋆ a ⋆ b ≡⟨ `true-β ah bh ⟩
63+
a ∎
64+
65+
`snd-β : ∀ {a b} → ⌞ a ⌟ → ⌞ b ⌟ → `snd ⋆ (`pair ⋆ a ⋆ b) ≡ b
66+
`snd-β {a} {b} ah bh =
67+
`snd ⋆ (`pair ⋆ a ⋆ b) ≡⟨ abs-β _ [] (_ , `pair↓₂ ah bh) ⟩
68+
`pair ⋆ a ⋆ b ⋆ `false ≡⟨ abs-βₙ [] (`false ∷ (b , bh) ∷ (a , ah) ∷ []) ⟩
69+
`false ⋆ a ⋆ b ≡⟨ `false-β ah bh ⟩
70+
b ∎
71+
```

0 commit comments

Comments
 (0)