comparison cbc/named-product.agda @ 47:49de29c12c7b

Define code segment compose operator using type -> ds cast!
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Thu, 05 Jan 2017 03:07:32 +0000
parents af1fe3bd9f1e
children fe5755744071
comparison
equal deleted inserted replaced
46:af1fe3bd9f1e 47:49de29c12c7b
62 62
63 equiv : incContextCycle firstContext ≡ record { cycle = 4 ; led = "q" ; signature = "aaa" } 63 equiv : incContextCycle firstContext ≡ record { cycle = 4 ; led = "q" ; signature = "aaa" }
64 equiv = refl 64 equiv = refl
65 65
66 66
67
68 data CodeSegment (A B : Set) : (List Set) -> Set where 67 data CodeSegment (A B : Set) : (List Set) -> Set where
69 cs : {l : List Set} {{_ : Datum A}} {{_ : Datum B}} -> (A -> B) -> CodeSegment A B (B ∷ A ∷ l) 68 cs : {l : List Set} {{_ : Datum A}} {{_ : Datum B}} -> (A -> B) -> CodeSegment A B (B ∷ A ∷ l)
70 69
71 BasicCS : Set -> Set -> Set 70 BasicCS : Set -> Set -> Set
72 BasicCS A B = CodeSegment A B (A ∷ B ∷ []) 71 BasicCS A B = CodeSegment A B (A ∷ B ∷ [])
73 72
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
79 csInc = cs inc
80 73
81 74
82 exec : {I O : Set} -> {l : List Set} {{_ : Datum I}} {{_ : Datum O}} -> CodeSegment I O l -> Context -> Context 75 exec : {I O : Set} -> {l : List Set} {{_ : Datum I}} {{_ : Datum O}} -> CodeSegment I O l -> Context -> Context
83 exec {l} {{i}} {{o}} (cs b) c = Datum.set o c (b (get i c)) 76 exec {l} {{i}} {{o}} (cs b) c = Datum.set o c (b (get i c))
84 77
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 78
89 --downCast : {A B : Set} {{i : Datum A}} {{o : Datum B}} -> (Datum A -> Datum B) -> A -> B 79 comp : {con : Context} -> {A B C D : Set} {{_ : Datum A}} {{_ : Datum B}} {{_ : Datum C}} {{_ : Datum D}}
90 --downCast {{i = record { get = get ; set = set }}} {{record { get = get₁ ; set = set₁ }}} f a = {!!}
91
92
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 80 -> (C -> D) -> (A -> B) -> A -> D
99 _∘_ {con} {{i}} {{io}} {{oi}} {{o}} g f x = g (get oi (set io con (f x))) 81 comp {con} {{i}} {{io}} {{oi}} {{o}} g f x = g (get oi (set io con (f x)))
100 82
101 83
84 csInc : BasicCS LoopCounter LoopCounter
85 csInc = cs inc
102 86
103 87
104 88
105 89
106 equiv-exec : {l : List Set} -> incContextCycle firstContext ≡ exec csInc firstContext 90 equiv-exec : {l : List Set} -> incContextCycle firstContext ≡ exec csInc firstContext
107 equiv-exec = refl 91 equiv-exec = refl
108 92
109 93
110 _◎_ : {con : Context} {A B C D : Set} {{_ : Datum A}} {{_ : Datum B}} {{_ : Datum C}} {{_ : Datum D}} {l ll : List Set} 94 csComp : {con : Context} {A B C D : Set} {{_ : Datum A}} {{_ : Datum B}} {{_ : Datum C}} {{_ : Datum D}} {l ll : List Set}
111 -> CodeSegment C D (D ∷ C ∷ l) -> CodeSegment A B (B ∷ A ∷ ll) -> CodeSegment A D (D ∷ A ∷ C ∷ B ∷ (l ++ ll)) 95 -> CodeSegment C D (D ∷ C ∷ l) -> CodeSegment A B (B ∷ A ∷ ll) -> CodeSegment A D (D ∷ A ∷ C ∷ B ∷ (l ++ ll))
112 _◎_ {con} {A} {B} {C} {D} {{da}} {{db}} {{dc}} {{dd}} {l} {ll} (cs g) (cs f) 96 csComp {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) 97 = cs {l = (C ∷ B ∷ (l ++ ll))} {{da}} {{dd}} (comp {con} {{da}} {{db}} {{dc}} {{dd}} g f)
114 98
115 99
116 comp-sample : CodeSegment LoopCounter LoopCounter (LoopCounter ∷ LoopCounter ∷ LoopCounter ∷ LoopCounter ∷ []) 100 comp-sample : {c : Context} -> CodeSegment LoopCounter LoopCounter (LoopCounter ∷ LoopCounter ∷ LoopCounter ∷ LoopCounter ∷ [])
117 comp-sample = csInc ◎ csInc 101 comp-sample {c} = (csComp {c} csInc csInc)
118 102
119 103
120 apply-sample : Context 104 apply-sample : Context
121 apply-sample = exec comp-sample firstContext 105 apply-sample = exec (comp-sample {firstContext}) firstContext
122 106
123 {- 107
124 108
125 updateSignature : SignatureWithNum -> SignatureWithNum 109 updateSignature : SignatureWithNum -> SignatureWithNum
126 updateSignature record { signature = signature ; num = num } = record { signature = (Data.String._++_) signature (show num ) ; num = num} 110 updateSignature record { signature = signature ; num = num } = record { signature = (Data.String._++_) signature (show num ) ; num = num}
127 111
128 csUpdateSignature : basicCS SignatureWithNum SignatureWithNum 112
113 csUpdateSignature : BasicCS SignatureWithNum SignatureWithNum
129 csUpdateSignature = cs updateSignature 114 csUpdateSignature = cs updateSignature
130 115
131 --comp-sample-2 : CodeSegment LoopCounter SignatureWithNum ? 116
132 --comp-sample-2 = csUpdateSignature ◎ csInc 117
133 -} 118 comp-sample-2 : {c : Context} -> CodeSegment LoopCounter SignatureWithNum (SignatureWithNum ∷ LoopCounter ∷ SignatureWithNum ∷ LoopCounter ∷ [])
119 comp-sample-2 {c} = csComp {c} csUpdateSignature csInc
120
121 apply-sample-2 : Context
122 apply-sample-2 = exec (comp-sample-2 {firstContext}) firstContext