Transformation of Applicative Specifications into Imperative ...

Transformation of Applicative Specifications into Imperative ... Transformation of Applicative Specifications into Imperative ...

26.09.2013 Views

APPENDIX D. SPECIFICATION OF TRANSFORMER IN RSL1 else 〈getSecondENV(hd getENVMapEntranceList(env))〉 rangeENV(mk_ENV(tl getENVMapEntranceList(env))) end, overrideENV : ENV × ENV → ENV overrideENV(e1, e2) ≡ if getENVMapEntranceList(e1) = 〈〉 then e2 else if isinId( getFirstENV(hd getENVMapEntranceList(e1)), domainENV(e2)) then overrideENV( mk_ENV(tl getENVMapEntranceList(e1)), e2) else overrideENV( mk_ENV(tl getENVMapEntranceList(e1)), mk_ENV( getENVMapEntranceList(e2) 〈hd getENVMapEntranceList(e1)〉)) end end, removeENV : ENV × Id → ENV removeENV(env, id) ≡ if getENVMapEntranceList(env) = 〈〉 then env else if getTextId( getFirstENV(hd getENVMapEntranceList(env))) = getTextId(id) then removeENV( mk_ENV(tl getENVMapEntranceList(env)), id) else mk_ENV( 〈getHeadENV(env)〉 getENVMapEntranceList( removeENV( mk_ENV(tl getENVMapEntranceList(env)), id))) end 462

D.2. FORMAL SPECIFICATION OF THE TRANSFORMER IN RSL1 end, getFirstENV : ENVMapEntrance → Id getFirstENV(me) ≡ first(me), getSecondENV : ENVMapEntrance → Binding getSecondENV(me) ≡ second(me), getENVMapEntranceList : ENV → ENVMapEntrance ∗ getENVMapEntranceList(env) ≡ map(env), getHeadENV : ENV → ENVMapEntrance getHeadENV(env) ≡ hd getENVMapEntranceList(env), /∗**** ENV end ****∗/ /∗**** TYPES ****∗/ makeTYPES : LetBinding × ExpType × TRANS → TYPES makeTYPES(lb, et, trans) ≡ case lb of MakeBinding(b) → makeTYPESBinding(b, et, trans), → (mk_TYPES(〈〉)) end, makeTYPESBinding : Binding × ExpType × TRANS → TYPES makeTYPESBinding(b, et, trans) ≡ case b of IdBinding(id) → mk_TYPES(〈mk_TYPESMapEntrance(b, et)〉), Make_ProductBinding(pb) → makeTYPESBindingList( binding_list(pb), expTypeToExpTypeList( removeBrackets(et), lengthBinding(binding_list(pb))), trans) end, makeTYPESBindingList : Binding ∗ × ExpType ∗ × TRANS → TYPES makeTYPESBindingList(bl, etl, trans) ≡ if bl = 〈〉 then mk_TYPES(〈〉) else 463

APPENDIX D. SPECIFICATION OF TRANSFORMER IN RSL1<br />

else<br />

〈getSecondENV(hd getENVMapEntranceList(env))〉 <br />

rangeENV(mk_ENV(tl getENVMapEntranceList(env)))<br />

end,<br />

overrideENV : ENV × ENV → ENV<br />

overrideENV(e1, e2) ≡<br />

if getENVMapEntranceList(e1) = 〈〉 then e2<br />

else<br />

if<br />

isinId(<br />

getFirstENV(hd getENVMapEntranceList(e1)),<br />

domainENV(e2))<br />

then<br />

overrideENV(<br />

mk_ENV(tl getENVMapEntranceList(e1)), e2)<br />

else<br />

overrideENV(<br />

mk_ENV(tl getENVMapEntranceList(e1)),<br />

mk_ENV(<br />

getENVMapEntranceList(e2) <br />

〈hd getENVMapEntranceList(e1)〉))<br />

end<br />

end,<br />

removeENV : ENV × Id → ENV<br />

removeENV(env, id) ≡<br />

if getENVMapEntranceList(env) = 〈〉 then env<br />

else<br />

if<br />

getTextId(<br />

getFirstENV(hd getENVMapEntranceList(env))) =<br />

getTextId(id)<br />

then<br />

removeENV(<br />

mk_ENV(tl getENVMapEntranceList(env)), id)<br />

else<br />

mk_ENV(<br />

〈getHeadENV(env)〉 <br />

getENVMapEntranceList(<br />

removeENV(<br />

mk_ENV(tl getENVMapEntranceList(env)),<br />

id)))<br />

end<br />

462

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!