Mercurial > hg > Members > atton > agda-proofs
comparison cbc/named-product.agda @ 46:af1fe3bd9f1e
Define code segment compose operator using type -> ds cast
author | atton <atton@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 05 Jan 2017 03:02:23 +0000 |
parents | 08b695ca359c |
children | 49de29c12c7b |
comparison
equal
deleted
inserted
replaced
45:08b695ca359c | 46:af1fe3bd9f1e |
---|---|
1 module named-product where | 1 module named-product where |
2 | 2 |
3 open import Function | 3 |
4 open import Data.Bool | 4 open import Data.Bool |
5 open import Data.Nat | 5 open import Data.Nat |
6 open import Data.Nat.Show | 6 open import Data.Nat.Show |
7 open import Data.String hiding (_++_ ; show) | 7 open import Data.String hiding (_++_ ; show) |
8 open import Data.List | 8 open import Data.List |
19 | 19 |
20 record Datum (A : Set) : Set where | 20 record Datum (A : Set) : Set where |
21 field | 21 field |
22 get : Context -> A | 22 get : Context -> A |
23 set : Context -> A -> Context | 23 set : Context -> A -> Context |
24 | 24 open Datum |
25 | 25 |
26 record LoopCounter : Set where | 26 record LoopCounter : Set where |
27 field | 27 field |
28 count : ℕ | 28 count : ℕ |
29 name : String | 29 name : String |
53 inc l = record l {count = suc (LoopCounter.count l)} | 53 inc l = record l {count = suc (LoopCounter.count l)} |
54 | 54 |
55 firstContext : Context | 55 firstContext : Context |
56 firstContext = record { cycle = 3 ; led = "q" ; signature = "aaa" } | 56 firstContext = record { cycle = 3 ; led = "q" ; signature = "aaa" } |
57 | 57 |
58 | |
58 incContextCycle : {{_ : Datum LoopCounter }} -> Context -> Context | 59 incContextCycle : {{_ : Datum LoopCounter }} -> Context -> Context |
59 incContextCycle {{l}} c = Datum.set l c (inc (Datum.get l c)) | 60 incContextCycle {{l}} c = Datum.set l c (inc (Datum.get l c)) |
60 | 61 |
61 | 62 |
62 equiv : incContextCycle firstContext ≡ record { cycle = 4 ; led = "q" ; signature = "aaa" } | 63 equiv : incContextCycle firstContext ≡ record { cycle = 4 ; led = "q" ; signature = "aaa" } |
63 equiv = refl | 64 equiv = refl |
64 | 65 |
65 | 66 |
66 | 67 |
67 data CodeSegment (A B : Set) : (List Set) -> Set where | 68 data CodeSegment (A B : Set) : (List Set) -> Set where |
68 cs : {l : List Set} {{_ : Datum A}} {{_ : Datum B}} -> (A -> B) -> CodeSegment A B (A ∷ B ∷ l) | 69 cs : {l : List Set} {{_ : Datum A}} {{_ : Datum B}} -> (A -> B) -> CodeSegment A B (B ∷ A ∷ l) |
69 | 70 |
70 basicCS : Set -> Set -> Set | 71 BasicCS : Set -> Set -> Set |
71 basicCS A B = CodeSegment A B (A ∷ B ∷ []) | 72 BasicCS A B = CodeSegment A B (A ∷ B ∷ []) |
72 | 73 |
73 csInc : basicCS LoopCounter LoopCounter | 74 up : {A B : Set} {{_ : Datum A}} {{_ : Datum B}} -> (A -> B) -> Context -> B |
75 up {{i}} {{o}} f c = f (Datum.get i c) | |
76 | |
77 | |
78 csInc : BasicCS LoopCounter LoopCounter | |
74 csInc = cs inc | 79 csInc = cs inc |
75 | 80 |
76 | 81 |
77 exec : {I O : Set} -> {l : List Set} {{_ : Datum I}} {{_ : Datum O}} -> CodeSegment I O l -> Context -> Context | 82 exec : {I O : Set} -> {l : List Set} {{_ : Datum I}} {{_ : Datum O}} -> CodeSegment I O l -> Context -> Context |
78 exec {l} {{i}} {{o}} (cs b) c = Datum.set o c (b (Datum.get i c)) | 83 exec {l} {{i}} {{o}} (cs b) c = Datum.set o c (b (get i c)) |
84 | |
85 --upCast : {A B : Set} {{_ : Datum A}} {{_ : Datum B}} -> (A -> B) -> (Datum A -> Datum B) | |
86 --upCast {{i}} {{o}} f a = record { get = (\c -> f (Datum.get a c)) | |
87 -- ; set = (\c b -> Datum.set o c b)} | |
88 | |
89 --downCast : {A B : Set} {{i : Datum A}} {{o : Datum B}} -> (Datum A -> Datum B) -> A -> B | |
90 --downCast {{i = record { get = get ; set = set }}} {{record { get = get₁ ; set = set₁ }}} f a = {!!} | |
79 | 91 |
80 | 92 |
81 equiv-exec : {l : List Set} -> incContextCycle firstContext ≡ exec (cs {l = l} inc) firstContext | 93 apply : {A B : Set} {{_ : Datum A}} {{_ : Datum B}} -> (A -> B) -> Context -> B |
94 apply {{i}} {{o}} f c = f (get i c) | |
95 | |
96 | |
97 _∘_ : {con : Context} -> {A B C D : Set} {{_ : Datum A}} {{_ : Datum B}} {{_ : Datum C}} {{_ : Datum D}} | |
98 -> (C -> D) -> (A -> B) -> A -> D | |
99 _∘_ {con} {{i}} {{io}} {{oi}} {{o}} g f x = g (get oi (set io con (f x))) | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 equiv-exec : {l : List Set} -> incContextCycle firstContext ≡ exec csInc firstContext | |
82 equiv-exec = refl | 107 equiv-exec = refl |
83 | 108 |
84 | 109 |
85 _◎_ : {A B C : Set} {{_ : Datum A}} {{_ : Datum B}} {{_ : Datum C}} {l ll : List Set} | 110 _◎_ : {con : Context} {A B C D : Set} {{_ : Datum A}} {{_ : Datum B}} {{_ : Datum C}} {{_ : Datum D}} {l ll : List Set} |
86 -> CodeSegment B C (B ∷ C ∷ l) -> CodeSegment A B (A ∷ B ∷ ll) -> CodeSegment A C (A ∷ C ∷ B ∷ (l ++ ll)) | 111 -> CodeSegment C D (D ∷ C ∷ l) -> CodeSegment A B (B ∷ A ∷ ll) -> CodeSegment A D (D ∷ A ∷ C ∷ B ∷ (l ++ ll)) |
87 _◎_ {A} {B} {C} {{da}} {{_}} {{dc}} {l} {ll} (cs g) (cs f) = cs {l = (B ∷ (l ++ ll))} {{da}} {{dc}} (g ∘ f) | 112 _◎_ {con} {A} {B} {C} {D} {{da}} {{db}} {{dc}} {{dd}} {l} {ll} (cs g) (cs f) |
113 = cs {l = (C ∷ B ∷ (l ++ ll))} {{da}} {{dd}} (_∘_ {con} {{da}} {{db}} {{dc}} {{dd}} g f) | |
88 | 114 |
89 | 115 |
90 comp-sample : CodeSegment LoopCounter LoopCounter (LoopCounter ∷ LoopCounter ∷ LoopCounter ∷ []) | 116 comp-sample : CodeSegment LoopCounter LoopCounter (LoopCounter ∷ LoopCounter ∷ LoopCounter ∷ LoopCounter ∷ []) |
91 comp-sample = csInc ◎ csInc | 117 comp-sample = csInc ◎ csInc |
118 | |
92 | 119 |
93 apply-sample : Context | 120 apply-sample : Context |
94 apply-sample = exec comp-sample firstContext | 121 apply-sample = exec comp-sample firstContext |
95 | 122 |
123 {- | |
96 | 124 |
97 updateSignature : SignatureWithNum -> SignatureWithNum | 125 updateSignature : SignatureWithNum -> SignatureWithNum |
98 updateSignature record { signature = signature ; num = num } = record { signature = (Data.String._++_) signature (show num ) ; num = num} | 126 updateSignature record { signature = signature ; num = num } = record { signature = (Data.String._++_) signature (show num ) ; num = num} |
99 | 127 |
100 csUpdateSignature : basicCS SignatureWithNum SignatureWithNum | 128 csUpdateSignature : basicCS SignatureWithNum SignatureWithNum |
101 csUpdateSignature = cs updateSignature | 129 csUpdateSignature = cs updateSignature |
102 | 130 |
103 comp-sample-2 : CodeSegment LoopCounter SignatureWithNum ? | 131 --comp-sample-2 : CodeSegment LoopCounter SignatureWithNum ? |
104 comp-sample-2 = csUpdateSignature ◎ csInc | 132 --comp-sample-2 = csUpdateSignature ◎ csInc |
133 -} |