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 BracketedTypeExpr(bte) → getTOIReturnsListTN(bte, trans) end, getTOIReturnsListProductTN : TypeExpr ∗ × TRANS → Access ∗ getTOIReturnsListProductTN(tel, trans) ≡ if tel = 〈〉 then 〈〉 else getTOIReturnsListTN(hd tel, trans) getTOIReturnsListProductTN(tl tel, trans) end, /∗**** Generators and observers end ****∗/ /∗**** Access ****∗/ makeReadAccessDesc : Access ∗ × TRANS → OptionalReadAccessDesc makeReadAccessDesc(al, trans) ≡ if al = 〈〉 then NoReadAccessMode else ReadAccessDesc(toVariableList(al, trans)) end, makeWriteAccessDesc : Access ∗ × TRANS → OptionalWriteAccessDesc makeWriteAccessDesc(rs, trans) ≡ if rs = 〈〉 then NoWriteAccessMode else WriteAccessDesc(toVariableList(rs, trans)) end, toVariableList : Access ∗ × TRANS → Access ∗ toVariableList(al, trans) ≡ if al = 〈〉 then al else case hd al of AccessValueOrVariableName(vn) → if isinId(id(vn), domainTRANS(trans)) then 〈AccessValueOrVariableName( mk_ValueOrVariableName( getMapValueTRANS(trans, id(vn))))〉 toVariableList(tl al, trans) else toVariableList(tl al, trans) 422

D.2. FORMAL SPECIFICATION OF THE TRANSFORMER IN RSL1 end end, end removeDuplets : Access ∗ → Access ∗ removeDuplets(al) ≡ if lengthAccess(al) = lengthAccess(elementsAccess(al)) then al else if isinAccess(hd al, elementsAccess(tl al)) then removeDuplets(tl al) else 〈hd al〉 removeDuplets(tl al) end end, getAccess : TypeExpr × TRANS → Access ∗ getAccess(te, trans) ≡ case te of TypeLiteral(literal) → 〈〉, TypeName(id) → if isinId(id, domainTRANS(trans)) then /∗Type of interest.∗/ 〈AccessValueOrVariableName( mk_ValueOrVariableName(id))〉 else /∗Not type of interest.∗/ 〈〉 end, TypeExprProduct(tep) → getAccessList(tep, trans), TypeExprSet(tes) → 〈〉, TypeExprList(tel) → 〈〉, TypeExprMap(tem) → 〈〉, FunctionTypeExpr(arg, fa, res) → 〈〉, BracketedTypeExpr(bte) → getAccess(bte, trans) end, getAccessList : TypeExpr ∗ × TRANS → Access ∗ getAccessList(tel, trans) ≡ if tel = 〈〉 then 〈〉 else getAccess(hd tel, trans) 423

D.2. FORMAL SPECIFICATION OF THE TRANSFORMER IN RSL1<br />

end<br />

end,<br />

end<br />

removeDuplets : Access ∗ → Access ∗<br />

removeDuplets(al) ≡<br />

if<br />

lengthAccess(al) =<br />

lengthAccess(elementsAccess(al))<br />

then al<br />

else<br />

if isinAccess(hd al, elementsAccess(tl al))<br />

then removeDuplets(tl al)<br />

else 〈hd al〉 removeDuplets(tl al)<br />

end<br />

end,<br />

getAccess : TypeExpr × TRANS → Access ∗<br />

getAccess(te, trans) ≡<br />

case te <strong>of</strong><br />

TypeLiteral(literal) → 〈〉,<br />

TypeName(id) →<br />

if isinId(id, domainTRANS(trans))<br />

then<br />

/∗Type <strong>of</strong> interest.∗/<br />

〈AccessValueOrVariableName(<br />

mk_ValueOrVariableName(id))〉<br />

else<br />

/∗Not type <strong>of</strong> interest.∗/<br />

〈〉<br />

end,<br />

TypeExprProduct(tep) → getAccessList(tep, trans),<br />

TypeExprSet(tes) → 〈〉,<br />

TypeExprList(tel) → 〈〉,<br />

TypeExprMap(tem) → 〈〉,<br />

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

BracketedTypeExpr(bte) → getAccess(bte, trans)<br />

end,<br />

getAccessList : TypeExpr ∗ × TRANS → Access ∗<br />

getAccessList(tel, trans) ≡<br />

if tel = 〈〉 then 〈〉<br />

else<br />

getAccess(hd tel, trans) <br />

423

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

Saved successfully!

Ooh no, something went wrong!