Transformation of Applicative Specifications into Imperative ...

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

26.09.2013 Views

APPENDIX C. FORMAL SPECIFICATIONS OF TRANSFORMATIONS getAccessObs(idset, ve, et, func, trans) ≡ case ve of Make_ValueLiteral(vl) → mk_AccessResult(〈〉, idset), Make_ValueOrVariableName(vn) → mk_AccessResult(〈〉, idset), Make_BasicExpr(be) → mk_AccessResult(〈〉, idset), ProductExpr(vel) → getAccessObsList(idset, vel, et, func, trans), Make_SetExpr(se) → getAccessObsSetExpr( idset, se, getSetType(et), func, trans), Make_ListExpr(le) → getAccessObsListExpr( idset, le, getListType(et), func, trans), Make_MapExpr(me) → getAccessObsMapExpr( idset, me, getMapType(et), func, trans), ApplicationExpr(ave, vl) → case ave of Make_ValueOrVariableName(vn) → if id(vn) ∈ dom func then if id(vn) ∈ idset then case type_expr(func(id(vn))) of FunctionTypeExpr(arg, fa, res) → /∗Already evaluated.∗/ let ar = getAccessObsListList( idset, vl, expTypeList(arg, len vl), func, trans) in mk_AccessResult( removeDuplets( accessList(ar) getSequencingAccess( ve, type_expr(res), et, trans, func)), idSet(ar)) end end else 250

C.1. FORMAL SPECIFICATION OF THE TRANSFORMER /∗Not evaluated yet.∗/ case type_expr(func(id(vn))) of FunctionTypeExpr(arg, fa, res) → let ar = getAccessObs( idset ∪ {id(vn)}, value_expr(func(id(vn))), Known(type_expr(res)), func, trans), ar ′ = getAccessObsListList( idset, vl, expTypeList(arg, len vl), func, trans) in mk_AccessResult( removeDuplets( getAccess(arg, trans) accessList(ar) accessList(ar ′ ) getSequencingAccess( ve, type_expr(res), et, trans, func)), idSet(ar) ∪ idSet(ar ′ )) end end end else getAccessObsList( idset, vl, et, func, trans) end, → getAccessObsList(idset, vl, et, func, trans) end, BracketedExpr(bve) → getAccessObs(idset, bve, et, func, trans), ValueInfixExpr(first, op, second) → getAccessObsList( idset, 〈first, second〉, Unknown, func, trans ), ValuePrefixExpr(op, operand) → getAccessObs( idset, operand, Unknown, func, trans), 251

APPENDIX C. FORMAL SPECIFICATIONS OF TRANSFORMATIONS<br />

getAccessObs(idset, ve, et, func, trans) ≡<br />

case ve <strong>of</strong><br />

Make_ValueLiteral(vl) →<br />

mk_AccessResult(〈〉, idset),<br />

Make_ValueOrVariableName(vn) →<br />

mk_AccessResult(〈〉, idset),<br />

Make_BasicExpr(be) → mk_AccessResult(〈〉, idset),<br />

ProductExpr(vel) →<br />

getAccessObsList(idset, vel, et, func, trans),<br />

Make_SetExpr(se) →<br />

getAccessObsSetExpr(<br />

idset, se, getSetType(et), func, trans),<br />

Make_ListExpr(le) →<br />

getAccessObsListExpr(<br />

idset, le, getListType(et), func, trans),<br />

Make_MapExpr(me) →<br />

getAccessObsMapExpr(<br />

idset, me, getMapType(et), func, trans),<br />

ApplicationExpr(ave, vl) →<br />

case ave <strong>of</strong><br />

Make_ValueOrVariableName(vn) →<br />

if id(vn) ∈ dom func<br />

then<br />

if id(vn) ∈ idset<br />

then<br />

case type_expr(func(id(vn))) <strong>of</strong><br />

FunctionTypeExpr(arg, fa, res) →<br />

/∗Already evaluated.∗/<br />

let<br />

ar =<br />

getAccessObsListList(<br />

idset, vl,<br />

expTypeList(arg, len vl),<br />

func, trans)<br />

in<br />

mk_AccessResult(<br />

removeDuplets(<br />

accessList(ar) <br />

getSequencingAccess(<br />

ve, type_expr(res), et,<br />

trans, func)), idSet(ar))<br />

end<br />

end<br />

else<br />

250

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

Saved successfully!

Ooh no, something went wrong!