Skip to content

Commit 3176534

Browse files
committed
[ new ] Monotone Heap Monad
Includes a necessary Any property.
1 parent 1a1aa2b commit 3176534

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ Other minor additions
129129
record ReaderMonad E (M : Pred I ℓ → Pt I ℓ) : Set (suc ℓ) where
130130
record ErrorMonad (M : Pt I ℓ) : Set (suc ℓ) where
131131
record StateMonad (M : Pt I ℓ) : Set (suc ℓ) where
132+
record HeapMonad (M : Pt I ℓ) : Set (suc ℓ) where
132133
```
133134

134135
* Added new functions to `Codata.Colist`:
@@ -288,6 +289,7 @@ Other minor additions
288289
fromList⁻ : Any P (fromList xs) → List.Any P xs
289290
toList⁺ : Any P xs → List.Any P (toList xs)
290291
toList⁻ : List.Any P (toList xs) → Any P xs
292+
prefix⁺ : ∀ {xs ys} → Prefix R xs ys → Any P xs → Any P ys
291293
```
292294

293295
* Added new functions to `Data.Vec.Membership.Propositional.Properties`:

src/Category/Monad/Monotone/Heap.agda

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import Relation.Unary.Closure.Preorder as Closure
2+
open import Relation.Binary using (Preorder)
3+
4+
module Category.Monad.Monotone.Heap
5+
-- ordered heap types
6+
{ℓ}(pre : Preorder ℓ ℓ ℓ)
7+
-- types
8+
(T : Set ℓ)
9+
-- weakenable values
10+
(V : T Preorder.Carrier pre Set ℓ) ⦃ wkV : {a} Closure.Closed pre (V a) ⦄
11+
-- heaps indexed by the heap type
12+
(H : Preorder.Carrier pre Set ℓ)
13+
-- weakenable heap type membership
14+
(_∈_ : T Preorder.Carrier pre Set ℓ) ⦃ wk∈ : {a} Closure.Closed pre (_∈_ a) ⦄ where
15+
16+
open Preorder pre renaming (Carrier to I)
17+
18+
open import Level
19+
open import Data.Unit using (⊤; tt)
20+
open import Data.Product
21+
22+
open import Relation.Unary hiding (_∈_)
23+
open import Relation.Unary.PredicateTransformer using (Pt)
24+
open import Relation.Unary.Closure.Preorder pre
25+
26+
open import Category.Monad.Monotone pre
27+
open import Category.Monad.Monotone.State pre H
28+
29+
open Closed ⦃...⦄
30+
31+
record HeapMonad (M : Pt I ℓ) : Set (suc ℓ) where
32+
field
33+
super : StateMonad M
34+
35+
open StateMonad super public
36+
37+
field
38+
store : {a} V a ⊆ M (λ W a ∈ W)
39+
modify : {a} _∈_ a ⊆ V a ⇒ M (V a)
40+
deref : {a} _∈_ a ⊆ M (V a)
41+
42+
module HeapMonadOps (m : RawMPMonad M) where
43+
open RawMPMonad m
44+
open import Data.List.All as All
45+
46+
storeₙ : {W as} All (λ a V a W) as M (λ W' All (λ a a ∈ W') as) W
47+
storeₙ vs = sequence (All.map (λ v {x} ext store (next v ext)) vs)
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
-- An example implementation of the monotone HeapMonad
2+
-- using heterogeneous lists as a memory model.
3+
4+
import Relation.Unary.Closure.Preorder as Closure
5+
import Relation.Binary.PropositionalEquality as P
6+
open import Data.List.Relation.Prefix.Heterogeneous.Properties using (preorder)
7+
open import Data.List
8+
9+
module Category.Monad.Monotone.Heap.HList
10+
(T : Set)
11+
(V : T List T Set)
12+
⦃ wkV : {a} Closure.Closed (preorder P.isEquivalence) (V a) ⦄ where
13+
14+
open import Function
15+
open import Data.Product
16+
open import Data.List.All as All
17+
open import Data.List.All.Properties
18+
open import Data.List.Any
19+
open import Data.List.Any.Properties
20+
open import Data.List.Membership.Propositional using (_∈_)
21+
open import Data.List.Relation.Prefix.Heterogeneous
22+
import Data.List.Relation.Pointwise as PW
23+
24+
open import Relation.Unary using (Pred)
25+
open import Relation.Binary using (Preorder)
26+
27+
open import Category.Monad using (RawMonad)
28+
29+
ord : Preorder _ _ _
30+
ord = (preorder {A = T} P.isEquivalence)
31+
32+
open Preorder ord renaming (refl to ∼-refl)
33+
open import Relation.Unary.Closure.Preorder ord
34+
open Closed ⦃...⦄
35+
36+
instance
37+
_ = ∼-closed
38+
39+
∈-closed : {x} Closed (x ∈_)
40+
∈-closed = record
41+
{ next = λ x∈xs xs∼ys prefix⁺ (flip P.trans) xs∼ys x∈xs }
42+
43+
All-closed : {ys} Closed (λ xs All (λ y V y xs) ys)
44+
All-closed = record
45+
{ next = λ pys xs∼zs All.map (λ p next p xs∼zs) pys }
46+
47+
HeapT : Set
48+
HeapT = List T
49+
50+
Heap : Pred HeapT _
51+
Heap = λ W All (λ a V a W) W
52+
53+
open import Category.Monad.Monotone ord
54+
open import Category.Monad.Monotone.State ord Heap
55+
open import Category.Monad.Monotone.Heap ord T V Heap _∈_
56+
57+
module _ {M : Set Set}(mon : RawMonad M) where
58+
private module M = RawMonad mon
59+
60+
open HeapMonad
61+
hlist-heap-monad : HeapMonad (MST M)
62+
super hlist-heap-monad = mst-monad-ops mon
63+
store hlist-heap-monad {x}{xs} v μ =
64+
let ext = fromView (PW.refl P.refl PrefixView.++ [ x ])
65+
in M.return (
66+
xs ∷ʳ x ,
67+
ext ,
68+
∷ʳ⁺ (next μ ext) (next v ext) ,
69+
++⁺ʳ xs (here P.refl))
70+
modify hlist-heap-monad ptr v μ =
71+
M.return (-, ∼-refl , μ [ ptr ]≔ v , All.lookup μ ptr)
72+
deref hlist-heap-monad ptr μ =
73+
M.return (-, ∼-refl , μ , All.lookup μ ptr)
74+
75+
open HeapMonadOps hlist-heap-monad public

src/Data/List/Any/Properties.agda

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,3 +579,15 @@ module _ {ℓ} {A B : Set ℓ} where
579579
(Any P xs × Any Q ys) ↔⟨ ×↔ ⟩
580580
Any (λ x Any (λ y P x × Q y) ys) xs ↔⟨ ⊗↔ ⟩
581581
Any (P ⟨×⟩ Q) (xs ⊗ ys) ∎
582+
583+
------------------------------------------------------------------------
584+
-- Prefix
585+
586+
module _ {a r p} {A : Set a} {R : Rel A r} {P : Pred A p}
587+
(resp : P Respects R) where
588+
589+
open import Data.List.Relation.Prefix.Heterogeneous as Prefix
590+
591+
prefix⁺ : {xs ys} Prefix R xs ys Any P xs Any P ys
592+
prefix⁺ rs e with toView rs
593+
prefix⁺ rs e | ss Prefix.++ ts = ++⁺ˡ (lift-resp resp ss e)

0 commit comments

Comments
 (0)