view cbc/maybe-subtype-sample.agda @ 60:bd428bd6b394

Trying define n-push/n-pop
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Sat, 14 Jan 2017 00:00:40 +0000
parents 352e8a724829
children
line wrap: on
line source

module maybe-subtype-sample (A : Set) where

open import Level
open import Data.Maybe
open import Function using (id)
open import Relation.Binary.PropositionalEquality

open import maybe-subtype A
open import subtype A as N
open import subtype (Meta A) as M

instance
  MetaIsMetaDataSegment : {{_ : M.DataSegment A}} -> M.DataSegment (Meta A)
  MetaIsMetaDataSegment    = record {get = (\mc -> mc) ; set = (\_ mc -> mc)}
  ContextIsMetaDataSegment : M.DataSegment (Context)
  ContextIsMetaDataSegment = record {get = Meta.context ; set = (\mc c -> record mc {context = c})}





return : {X : Set} {_ : Context} {_ : Meta A} {{_ : N.DataSegment X}} {{_ : M.DataSegment X}} -> X -> Meta X
return {c} {mc} {{nd}} {{md}} a = record {context = record {} ; maybeElem = just a}


fmap' : {B : Set} -> (A -> B) -> Meta A -> Meta B
fmap' f record { maybeElem = (just x) } = record {maybeElem = just (f x)}
fmap' f record { maybeElem = nothing }  = record {maybeElem = nothing}


fmap : {c : Context} {B : Set}
       {{_ : M.DataSegment A}} {{_ : M.DataSegment B}} {{_ : M.DataSegment (Meta A)}}{{_ : M.DataSegment (Meta B)}}
      -> M.CodeSegment A B -> M.CodeSegment (Meta A) (Meta B)
fmap  {c} {B} {{na}} {{nb}} {{ma}}  (N.cs f) = M.cs {{ma}} (fmap' {B} f)


liftMeta : {B : Set} {{_ : M.DataSegment A}} {{_ : M.DataSegment B}} -> N.CodeSegment A B -> M.CodeSegment A B
liftMeta (N.cs f) = M.cs f


fmap-preserve-id : {x : Meta A} {{nx : N.DataSegment A }}{{mx : M.DataSegment A}} {{mmx : M.DataSegment (Meta A)}}
                 -> M.exec {{mmx}} {{mmx}} (fmap {{mx}} {{mx}} {{mmx}} {{mmx}} (M.cs id)) x ≡ M.exec (liftMeta (N.cs id)) x
fmap-preserve-id = {!!}