Mercurial > hg > Members > atton > agda-proofs
comparison cbc/subtype.agda @ 51:16e27df74ec5
Split subtype definitions for reuse context
author | atton <atton@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 10 Jan 2017 02:04:55 +0000 |
parents | ccb34e3f1514 |
children | 4880184e4ab5 |
comparison
equal
deleted
inserted
replaced
50:ccb34e3f1514 | 51:16e27df74ec5 |
---|---|
1 module subtype where | 1 module subtype (Context : Set) where |
2 | 2 |
3 open import Data.Bool | |
4 open import Data.Nat | |
5 open import Data.Nat.Show | |
6 open import Data.String hiding (_++_ ; show ; toList ; fromList) | |
7 open import Data.List | |
8 open import Data.AVL.Sets | |
9 open import Relation.Binary.PropositionalEquality | 3 open import Relation.Binary.PropositionalEquality |
10 | 4 |
11 | 5 |
12 record Context : Set where | 6 record DataSegment (A : Set) : Set where |
13 field | 7 field |
14 cycle : ℕ | |
15 led : String | |
16 signature : String | |
17 | |
18 record Datum (A : Set) : Set where | |
19 field | |
20 get : Context -> A | 8 get : Context -> A |
21 set : Context -> A -> Context | 9 set : Context -> A -> Context |
22 open Datum | 10 open DataSegment |
23 | 11 |
24 record LoopCounter : Set where | 12 data CodeSegment (A B : Set) : Set where |
25 field | 13 cs : {{_ : DataSegment A}} {{_ : DataSegment B}} -> (A -> B) -> CodeSegment A B |
26 count : ℕ | |
27 name : String | |
28 | |
29 record SignatureWithNum : Set where | |
30 field | |
31 signature : String | |
32 num : ℕ | |
33 | |
34 instance | |
35 contextHasLoopCounter : Datum LoopCounter | |
36 contextHasLoopCounter = record {get = (\c -> record {count = Context.cycle c ; | |
37 name = Context.led c }); | |
38 set = (\c l -> record {cycle = LoopCounter.count l; | |
39 led = LoopCounter.name l; | |
40 signature = Context.signature c})} | |
41 contextHasSignatureWithNum : Datum SignatureWithNum | |
42 contextHasSignatureWithNum = record {get = (\c -> record { signature = Context.signature c | |
43 ; num = Context.cycle c}) | |
44 ;set = (\c s -> record { cycle = SignatureWithNum.num s | |
45 ; led = Context.led c | |
46 ; signature = SignatureWithNum.signature s}) | |
47 } | |
48 | 14 |
49 | 15 |
50 inc : LoopCounter -> LoopCounter | 16 exec : {I O : Set} {{_ : DataSegment I}} {{_ : DataSegment O}} -> CodeSegment I O -> Context -> Context |
51 inc l = record l {count = suc (LoopCounter.count l)} | 17 exec {l} {{i}} {{o}} (cs b) c = DataSegment.set o c (b (get i c)) |
52 | |
53 firstContext : Context | |
54 firstContext = record { cycle = 3 ; led = "q" ; signature = "aaa" } | |
55 | 18 |
56 | 19 |
57 incContextCycle : {{_ : Datum LoopCounter }} -> Context -> Context | 20 comp : {con : Context} -> {A B C D : Set} {{_ : DataSegment A}} {{_ : DataSegment B}} {{_ : DataSegment C}} {{_ : DataSegment D}} |
58 incContextCycle {{l}} c = Datum.set l c (inc (Datum.get l c)) | |
59 | |
60 | |
61 equiv : incContextCycle firstContext ≡ record { cycle = 4 ; led = "q" ; signature = "aaa" } | |
62 equiv = refl | |
63 | |
64 | |
65 data CodeSegment (A B : Set) : Set where | |
66 cs : {{_ : Datum A}} {{_ : Datum B}} -> (A -> B) -> CodeSegment A B | |
67 | |
68 BasicCS : Set -> Set -> Set | |
69 BasicCS A B = CodeSegment A B | |
70 | |
71 | |
72 exec : {I O : Set} {{_ : Datum I}} {{_ : Datum O}} -> CodeSegment I O -> Context -> Context | |
73 exec {l} {{i}} {{o}} (cs b) c = Datum.set o c (b (get i c)) | |
74 | |
75 | |
76 comp : {con : Context} -> {A B C D : Set} {{_ : Datum A}} {{_ : Datum B}} {{_ : Datum C}} {{_ : Datum D}} | |
77 -> (C -> D) -> (A -> B) -> A -> D | 21 -> (C -> D) -> (A -> B) -> A -> D |
78 comp {con} {{i}} {{io}} {{oi}} {{o}} g f x = g (get oi (set io con (f x))) | 22 comp {con} {{i}} {{io}} {{oi}} {{o}} g f x = g (get oi (set io con (f x))) |
79 | |
80 | |
81 csInc : BasicCS LoopCounter LoopCounter | |
82 csInc = cs inc | |
83 | |
84 | 23 |
85 | 24 csComp : {con : Context} {A B C D : Set} |
86 equiv-exec : {l : List Set} -> incContextCycle firstContext ≡ exec csInc firstContext | 25 {{_ : DataSegment A}} {{_ : DataSegment B}} {{_ : DataSegment C}} {{_ : DataSegment D}} |
87 equiv-exec = refl | |
88 | |
89 | |
90 csComp : {con : Context} {A B C D : Set} {{_ : Datum A}} {{_ : Datum B}} {{_ : Datum C}} {{_ : Datum D}} | |
91 -> CodeSegment C D -> CodeSegment A B -> CodeSegment A D | 26 -> CodeSegment C D -> CodeSegment A B -> CodeSegment A D |
92 csComp {con} {A} {B} {C} {D} {{da}} {{db}} {{dc}} {{dd}} (cs g) (cs f) | 27 csComp {con} {A} {B} {C} {D} {{da}} {{db}} {{dc}} {{dd}} (cs g) (cs f) |
93 = cs {{da}} {{dd}} (comp {con} {{da}} {{db}} {{dc}} {{dd}} g f) | 28 = cs {{da}} {{dd}} (comp {con} {{da}} {{db}} {{dc}} {{dd}} g f) |
94 | 29 |
95 comp-sample : {c : Context} -> CodeSegment LoopCounter LoopCounter | |
96 comp-sample {c} = (csComp {c} csInc csInc) | |
97 | |
98 | |
99 apply-sample : Context | |
100 apply-sample = exec (comp-sample {firstContext}) firstContext | |
101 | |
102 | |
103 | |
104 updateSignature : SignatureWithNum -> SignatureWithNum | |
105 updateSignature record { signature = signature ; num = num } = record { signature = (Data.String._++_) signature (show num ) ; num = num} | |
106 | |
107 | |
108 csUpdateSignature : BasicCS SignatureWithNum SignatureWithNum | |
109 csUpdateSignature = cs updateSignature | |
110 | |
111 | |
112 | |
113 comp-sample-2 : {c : Context} -> CodeSegment LoopCounter SignatureWithNum | |
114 comp-sample-2 {c} = csComp {c} csUpdateSignature csInc | |
115 | |
116 apply-sample-2 : Context | |
117 apply-sample-2 = exec (comp-sample-2 {firstContext}) firstContext | |
118 | |
119 | 30 |
120 | 31 |
121 comp-associative : {A B C D E F : Set} {con : Context} | 32 comp-associative : {A B C D E F : Set} {con : Context} |
122 {{da : Datum A}} {{db : Datum B}} {{dc : Datum C}} {{dd : Datum D}} {{de : Datum E}} {{df : Datum F}} | 33 {{da : DataSegment A}} {{db : DataSegment B}} {{dc : DataSegment C}} |
34 {{dd : DataSegment D}} {{de : DataSegment E}} {{df : DataSegment F}} | |
123 -> (a : CodeSegment A B) (b : CodeSegment C D) (c : CodeSegment E F) | 35 -> (a : CodeSegment A B) (b : CodeSegment C D) (c : CodeSegment E F) |
124 -> csComp {con} c (csComp {con} b a) ≡ csComp {con} (csComp {con} c b) a | 36 -> csComp {con} c (csComp {con} b a) ≡ csComp {con} (csComp {con} c b) a |
125 comp-associative (cs _) (cs _) (cs _) = refl | 37 comp-associative (cs _) (cs _) (cs _) = refl |