my - cs.ox.ac.ukko-lecture2.pdf · plan • review well-behavedness, with partiality explicitly...
TRANSCRIPT
BiGUL’sBidirectionality
ZhenjiangHu&JoshKoNationalInstituteofInformatics,Japan
OxfordSummerSchoolonBidirectionalTransformations 27July2016
Plan• Reviewwell-behavedness,withpartialityexplicitlyrepresented.
• Getatasteofputback-baseddesignbylookingatseveralBiGULconstructs.
• Startwithanaturalputsemantics,andthenreviseitsothatacorrespondinggetexists.
(Well-behaved)Lensput::s->v->Maybesget::s->Maybev
PutGet
GetPut
UniquenessofgetForanylenseslandr,putl=putr==>getl=getr
Proof
Replace::BiGULvvputReplacesv=Justv
Skip::BiGULsv(?)putSkipsv=Justs
Skip::(s->v)->BiGULsvput(Skipf)sv=ifv==fsthenJustselseNothing
Prod::BiGULslvl->BiGULsrvr->BiGUL(sl,sr)(vl,vr)
put(l`Prod`r)(sl,sr)(vl,vr)=dosl’<-putlslvlsr’<-putrsrvrreturn(sl’,sr’)
get(l`Prod`r)(sl,sr)=dovl<-getlslvr<-getrsrreturn(vl,vr)
PutGetforProdAssumeput(l`Prod`r)(sa,sb)(va,vb)=Just(sa’,sb’)
Proveget(l`Prod`r)(sa’,sb’)=(va,vb)
(dosl’<-putlsavasr’<-putrsbvbreturn(sl’,sr’))=Just(sa’,sb’)
(dovl<-getlsa’vr<-getrsb’return(vl,vr))=Just(va,vb)
PutGetforProd(dosl’<-putlsavasr’<-putrsbvbreturn(sl’,sr’))=Just(sa’,sb’)
∃sl’.putlsava=Justsl’∧∃sr’.putrsbvb=Justsr’∧Just(sl’,sr’)=Just(sa’,sb’)
putlsava=Justsa’∧putrsbvb=Justsb’
PutGetforProdAssumeputlsava=Justsa’putrsbvb=Justsb’
Provegetlsa’=Justvagetrsb’=Justvb
Case(binary)
put(Case(pl,l)(pr,r))sv=ifplsvthenputlsvelseifprsvthenputrsvelseNothing
typeCaseBranchsv=(s→v→Bool,BiGULsv)
Case::CaseBranchsv->CaseBranchsv->BiGULsv
Case(withexitconditionsandadaptation)typeCaseBranchsv=(s→v→Bool,BiGULsv,s->Bool)
typeCaseAdaptiveBranchsv=(s->v->Bool,s->v->s)
Case::CaseBranchsv->CaseBranchsv->CaseAdaptiveBranchsv->BiGULsv
Rearrangement• $(rearrV[|\(Left(x,y))->(y,x)|])…
• Key:patternmatchingandexpressionevaluationareinvertible
• Type-safeimplementationwithHaskell’sgeneralisedalgebraicdatatypes