Mercurial > hg > Members > atton > agda-proofs
diff cbc/subtype-sample.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 | |
children | 4880184e4ab5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cbc/subtype-sample.agda Tue Jan 10 02:04:55 2017 +0000 @@ -0,0 +1,89 @@ +module subtype-sample where + +open import Data.Nat +open import Data.Nat.Show +open import Data.String hiding (_++_ ; show ; toList ; fromList) +open import Data.List +open import Relation.Binary.PropositionalEquality + + + +record Context : Set where + field + cycle : ℕ + led : String + signature : String + +open import subtype Context +record LoopCounter : Set where + field + count : ℕ + name : String + +record SignatureWithNum : Set where + field + signature : String + num : ℕ + +instance + contextHasLoopCounter : DataSegment LoopCounter + contextHasLoopCounter = record {get = (\c -> record {count = Context.cycle c ; + name = Context.led c }); + set = (\c l -> record {cycle = LoopCounter.count l; + led = LoopCounter.name l; + signature = Context.signature c})} + contextHasSignatureWithNum : DataSegment SignatureWithNum + contextHasSignatureWithNum = record {get = (\c -> record { signature = Context.signature c + ; num = Context.cycle c}) + ;set = (\c s -> record { cycle = SignatureWithNum.num s + ; led = Context.led c + ; signature = SignatureWithNum.signature s}) + } + +inc : LoopCounter -> LoopCounter +inc l = record l {count = suc (LoopCounter.count l)} + +firstContext : Context +firstContext = record { cycle = 3 ; led = "q" ; signature = "aaa" } + + +incContextCycle : {{_ : DataSegment LoopCounter }} -> Context -> Context +incContextCycle {{l}} c = DataSegment.set l c (inc (DataSegment.get l c)) + + +equiv : incContextCycle firstContext ≡ record { cycle = 4 ; led = "q" ; signature = "aaa" } +equiv = refl + + +csInc : CodeSegment LoopCounter LoopCounter +csInc = cs inc + + + +equiv-exec : {l : List Set} -> incContextCycle firstContext ≡ exec csInc firstContext +equiv-exec = refl + +comp-sample : {c : Context} -> CodeSegment LoopCounter LoopCounter +comp-sample {c} = (csComp {c} csInc csInc) + + +apply-sample : Context +apply-sample = exec (comp-sample {firstContext}) firstContext + + + +updateSignature : SignatureWithNum -> SignatureWithNum +updateSignature record { signature = signature ; num = num } = record { signature = (Data.String._++_) signature (show num ) ; num = num} + + +csUpdateSignature : CodeSegment SignatureWithNum SignatureWithNum +csUpdateSignature = cs updateSignature + + + +comp-sample-2 : {c : Context} -> CodeSegment LoopCounter SignatureWithNum +comp-sample-2 {c} = csComp {c} csUpdateSignature csInc + +apply-sample-2 : Context +apply-sample-2 = exec (comp-sample-2 {firstContext}) firstContext +