<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Towards Rigorously Faking Bidirectional Model Transformations</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Christopher M. Poskitt</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Mike Dodds</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Richard F. Paige</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Arend Rensink</string-name>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Computer Science</institution>
          ,
          <addr-line>ETH Zu ̈rich</addr-line>
          ,
          <country country="CH">Switzerland</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Department of Computer Science, The University of York</institution>
          ,
          <country country="UK">UK</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Department of Computer Science, University of Twente</institution>
          ,
          <country country="NL">The Netherlands</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Bidirectional model transformations (bx) are mechanisms for automatically restoring consistency between multiple concurrently modified models. They are, however, challenging to implement; many model transformation languages not supporting them at all. In this paper, we propose an approach for automatically obtaining the consistency guarantees of bx without the complexities of a bx language. First, we show how to “fake” true bidirectionality using pairs of unidirectional transformations and inter-model consistency constraints in Epsilon. Then, we propose to automatically verify that these transformations are consistency preserving-thus indistinguishable from true bx-by defining translations to graph rewrite rules and nested conditions, and leveraging recent proof calculi for graph transformation verification.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Model transformations are operations for automatically translating models
conforming to one language (i.e. a metamodel) into models conforming to another, in a way
that maintains some sense of consistency between them. At their most basic, model
transformations are unidirectional: given a source model (e.g. some high-level yet
usermodifiable view of a system), they generate a target model (perhaps a lower-level view,
such as code) whose data is “consistent” with the source, in a sense that is either left
implicit, or captured by textual constraints or an inter-model consistency relation.</p>
      <p>
        Many situations arise where the source and target models may both be modified by
users in concurrent engineering activities, e.g. when integrating parts of systems that
are modelled separately but must remain consistent. Bidirectional model
transformations (bx) [
        <xref ref-type="bibr" rid="ref17 ref5">5,17</xref>
        ] are a mechanism for automatically restoring inter-model consistency
in such a scenario; in particular, bx simultaneously describe transformations in both
directions—from source to target and target to source—with their compatibility
guaranteed by construction [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>
        While this advantage is certainly an attractive one, bx are challenging to implement
on account of the inherent complexity that they must encode. Model transformation
languages supporting them often do so with conditions: some require that bx are bijective
(e.g. BOTL [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]), essentially restricting their use to models presenting identical data in
different ways, whereas others require users to work with specific formalisms such as
triple graph grammars (e.g. MOFLON [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]). The QVT-R language—part of the OMG’s
Queries, Views, and Transformations standard—allows bx to be expressed, but suffers
an ambiguous semantics [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] and limited tool support (the most successful ones often
departing from the original semantics [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]). Moreover, many modern transformation
languages do not provide any support for bx (e.g. ATL [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]), meaning that users must
express them as two separate unidirectional transformations. While this seems a practical
workaround, it comes with the major risk that the compatibility of the transformations
might not be maintained over time.
      </p>
      <p>
        A trade-off between the benefits (but complexity) of bx and the practicality (but
possible incoherence) of unidirectional transformations can be achieved in Epsilon, a
platform of interoperable model management languages. Epsilon has languages
supporting the specification of unidirectional transformations in either a rule-based (ETL),
update-in-place (EWL), or operational (EOL) [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] style. Furthermore, it provides an
inter-model consistency language (EVL [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]) that can be used to express and evaluate
constraints between models conforming to different metamodels. With these languages
together, bx can be “faked” in a practical way, by: (1) defining pairs of unidirectional
transformations for separately updating the source and target models; and (2) defining
“consistency” via inter-model constraints in EVL, the violation of which will trigger
appropriate transformations to restore consistency.
      </p>
      <p>Although this process gives us a means of checking consistency and automatically
triggering a transformation to restore it, we lack the important guarantee that bx give
us: the compatibility of the transformations. It might be the case that after the execution
of one transformation, the other does not actually restore consistency, leading to further
EVL violations. How do we check for, and maintain, compatibility?</p>
      <p>
        We aim to address this shortcoming and obtain the guarantees of bx without the need
for bx languages. Instead, we will use rigorous proof techniques to verify that faked bx
are consistency preserving, and thus indistinguishable to users from true bx. To this end,
we propose to apply techniques from graph transformation verification. Given a faked
bx in Epsilon, we will model the unidirectional transformations as graph transformation
rules, and EVL constraints as nested graph conditions [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. Then, by leveraging graph
transformation proof calculi [
        <xref ref-type="bibr" rid="ref14 ref15 ref8">8,14,15</xref>
        ] in a weakest precondition style, we aim to
automatically prove compatibility of the unidirectional transformations with respect to the
EVL constraints. Furthermore, we aim to exploit the model checker GROOVE [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] to
automatically search for counterexamples when consistency preservation does not hold.
      </p>
      <p>
        The overarching goal of our work is to achieve the ideal that Stevens [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]
contemplated in her survey of bx: that “if a framework existed in which it were possible
to write the directions of a transformation separately and then check, easily, that they
were coherent, we might be able to have the best of both worlds.”
2
      </p>
      <p>Example bx in Epsilon: Class Diagrams to Databases
To illustrate the ideas of our proposal, we recall a common model transformation
problem that concerns the consistency of class diagram and relational database models
(CD2RDBM). Class diagram models conform to a simple language describing
familgg
gg
iar object-oriented concepts (e.g. classes, attributes, relationships), whereas relational
database models conform to a language describing how databases are constructed (e.g.
tables, columns, primary keys). Here, consistency is defined in terms of a
correspondence between the data in the models, e.g. every table n corresponds to a class n, and
every column m corresponds to an attribute m. Figure 1 contains two simple models
that are consistent in this sense (we omit the metamodels for lack of space).
tbmaeboaldeUbeslls)eecwrtosohncoislrfisestttaehmtneeacnimyne.twoaAdinceblilasnxsgsswheinsootuu(eollrdd-r fneaatmu:reCe=la"sussers" feature npakemy:eTa=b"ulesers" column
be well suited for this: upon the :Attribute :Attribute :Column :Column
cbrleea),tiaontaobflea (nreewsp.clcalsasss()resshpo.utlad- npakemye==T"riude" nampeke=y"=usFearnlsaeme" name = "id" name = "username"
be created with the same name Fig. 1. Two consistent CD and RDB models
to restore consistency. We can
fake this simple bx in Epsilon with a pair of unidirectional transformations (one for
updating the class diagram model, one for updating the relational database) and a set of
EVL constraints. For the former, we can use the Epsilon Wizard Language (EWL) to
define a pair of update-in-place transformations, AddClass and AddTable (for simplicity,
here we assume the new class/table name newName to be pre-determined and unique,
but Epsilon does support the capturing and sharing of such data between wizards).
wizard AddClass f
do f
var c : new Class ;
c . name = newName ;
self . Class . all . first ( ) . contents . add (
c ) ;
wizard AddTable f
do f
var table : new Table ;
table . name = newName ;
self . Table . all . first ( ) . contents . add (
table ) ;
Using the Epsilon Validation Language (EVL), we express the relevant notion of
intermodel consistency: that for every class n, there exists a table named n (and vice versa).
If one of the constraints is violated, Epsilon can automatically trigger the relevant
transformation to attempt to restore consistency. For example, after executing the
transformation AddClass, the constraint TableExists will be violated, indicating that the
transformation AddTable should be executed to restore consistency.
context OO ! Class f
constraint TableExists f
check : DB ! Table . all . select ( t j t . name
= self . name ) . size ( ) &gt; 0
context DB ! Table f
constraint ClassExists f
check : OO ! Class . all . select ( c j c . name</p>
      <p>= self . name ) . size ( ) &gt; 0
gg
gg
This example of a bx, “faked” in Epsilon, is a deliberately simple one chosen to illustrate
the concepts. Note even that the CD2RDBM problem can lead to more interesting (i.e.
less symmetric) bx, e.g. manipulating inheritance in the class model.
3</p>
      <p>Checking Compatibility of the Transformations
The critical difference between the “faked” bx in the previous section and a true bx is
the absence of guarantees about the compatibility of the transformations: upon the
violation of TableExists, for example, does the execution of AddTable actually restore
consistency? For this simple example, a manual inspection will quickly confirm that the
transformations are indeed compatible in this sense. But what about more intricate bx?
And what about bx that evolve and change over time? For the Epsilon-based approach
to be a convincing alternative to a bx language, it is imperative that the compatibility (or
not) of the transformations can be checked, and—crucially—that this can be done in a
simple and automatic way. To this end, we propose to leverage and adapt some recent
developments in the verification of graph transformations.</p>
      <p>
        Graph transformation is a computation abstraction: the state of a computation is
represented as a graph, and the computational steps as applications of rules (i.e. akin to
string rewriting in Chomsky grammars, but lifted to graphs). Modelling a problem using
graph transformation brings an immediate benefit in visualisation, but also an important
one in terms of semantics: the abstraction has a well-developed algebraic theory that
can be used for formal reasoning. This has been exploited to facilitate the verification
of graph transformation systems, i.e. calculi for systematically proving specifications
about graph properties before and after any execution of some given rules.
Furthermore, such calculi have been generalised to graph programs [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], which augment the
abstraction with expressions over labels and familiar control constructs (e.g. sequential
composition, branching) for restricting the application of rules.
      </p>
      <p>
        Habel et al. [
        <xref ref-type="bibr" rid="ref7 ref8">7,8</xref>
        ] developed weakest precondition calculi for proving specifications
of the form fpreg P fpostg, which express that if a graph satisfies the precondition
pre, then any graph resulting from the execution of graph program P will satisfy the
postcondition post; these pre- and postconditions expressed using nested conditions,
a graphical formalism for first-order (FO) structural properties over graphs. They
defined constructions that, given a nested condition post and program P , would return a
weakest liberal precondition Wlp(P; post), representing the weakest property that must
hold for successful executions of P to establish post. The specification would then be
(dis)proven by checking the validity of pre ) Wlp(P; post) in an automatic FO
theorem prover. Poskitt and Plump developed proof calculi in a similar spirit, separately
addressing two extensions: programs and properties involving attribute manipulation
[
        <xref ref-type="bibr" rid="ref14 ref15">14,15</xref>
        ], and reasoning about non-local structural properties [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ].
      </p>
      <p>We aim to exploit this work to check the compatibility of transformations in the
Epsilon approach to bx. In particular, we are developing automatic translations of EWL
transformations to graph programs (denoted PS ; PT for the source and target updates
respectively), and translations from EVL constraints to nested conditions (denoted evl).
Then, the task of checking compatibility of the transformations, as shown in Figure 2,
reduces to proving the specifications fevlg PS ; PT fevlg and fevlg PT ; PS fevlg
(here we assume the input graphs to be disjoint unions of the two models). Intuitively:
if the models are consistent to start with, and executing the transformations in either
order maintains consistency, then the transformations are compatible.</p>
      <p>
        The technical challenges of the process fall into two main parts: computing the
abstractions, and checking validity. Defining translations for the former requires care:
we need to determine how much of the EWL language can be handled, we need to
ensure that the graph-based semantics we abstract them to is “correct”, and we need to
adapt the proof technology to our specific needs. The work in [
        <xref ref-type="bibr" rid="ref14 ref15 ref16">14,15,16</xref>
        ], for example,
does not presently support type graphs (causing more effort to encode conformance to
"faked" BX
in Epsilon
model transformations
to graph programs
EVL constraints to
nested conditions
      </p>
      <p>PS
PT
evl</p>
      <p>WLP
construction</p>
      <p>evl )
Wlp(PS; PT , evl) FO validity</p>
      <p>evl )
Wlp(PT ; PS, evl)</p>
      <p>
        FO validity
no / loop ??
no / loop ??
yes
yes
compatible
metamodels). Similar concerns must be addressed for the translations of EVL to nested
conditions (we can take inspiration from recent work on such translations for core OCL
[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]). For the challenge of checking validity, we aim to leverage existing FO theorem
provers (e.g. Vampire) as much as possible, adapting existing translations of nested
conditions to FO logic [
        <xref ref-type="bibr" rid="ref14 ref7">7,14</xref>
        ]. Given the undecidability of FO validity, we also aim to
explore the use of the GROOVE model checker [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] in finding counterexamples when
the theorem provers respond with “no”, or do not appear to terminate.
      </p>
      <p>Our example bx for the CD2RDBM problem is easily translated into graph programs
and nested conditions, as given in Figure 3. The programs PS ; PT are the individual
rules creating respectively a class or table node labelled newName (here, ; denotes the
empty graph, indicating that the rules can be applied without first matching any
structure, i.e. unconditionally). The nested condition evl, given on the right, expresses that
for every class (resp. table) node, there is a table (resp. class) node with the same name
(we do not define here a formal interpretation, but note that x; y are variables, and that
the numbers indicate when nodes are the same down the nesting of the formula). Were
the weakest liberal preconditions to be constructed, we would find:</p>
      <p>Wlp(PS ; PT ; evl)</p>
      <p>Wlp(PT ; PS ; evl)
evl:
Since evl ) evl is clearly valid, both fevlg PS ; PT fevlg and fevlg PT ; PS fevlg
must hold, and—assuming correctness of the abstractions—the original EWL
transformations are therefore compatible with respect to the EVL constraints.
;
;
)
)</p>
      <p>:Class
name = newName</p>
      <p>:Table
name = newName</p>
      <p>:Class :Class
8 ( name = x , 9 ( name = x</p>
      <p>1
:Table
^ 8 ( name = y 2</p>
      <p>
        1
:Table
, 9 ( name = y
:Table
name = x
:Class
name = y
After further exploring the CD2RDBM example, we will identify a selection of bx case
studies—from the community repository [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] and beyond—that exhibit a broader range
of characteristics and challenges to address. We will implement these bx using EWL
transformations and EVL constraints, then manually translate them into graph
transformations and nested conditions. These will serve as a proof of concept, but also as
guidance, helping us to determine how far we should adapt the proof calculi to support
our goals (e.g. introducing type graphs for capturing the metamodels). After
implementing the weakest precondition calculations and translations to FO logic, we will
design and implement automatic translations from Epsilon bx to their corresponding
graph-based abstractions, initially focusing on a core (but expressive) subset of the
languages. Finally, we will explore the use of GROOVE in finding counterexamples when
verification fails, by exploring executions of the graph transformation rules.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Amelunxen</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          , Ko¨ nigs,
          <string-name>
            <surname>A.</surname>
          </string-name>
          , R o¨tschke, T.,
          <article-title>Schu¨ rr, A.: MOFLON: A standard-compliant metamodeling framework with graph transformations</article-title>
          .
          <source>In: ECMDA-FA 2006. LNCS</source>
          , vol.
          <volume>4066</volume>
          , pp.
          <fpage>361</fpage>
          -
          <lpage>375</lpage>
          . Springer (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Arendt</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Habel</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Radke</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Taentzer</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          :
          <article-title>From core OCL invariants to nested graph constraints</article-title>
          .
          <source>In: ICGT 2014. LNCS</source>
          , vol.
          <volume>8571</volume>
          , pp.
          <fpage>97</fpage>
          -
          <lpage>112</lpage>
          . Springer (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Braun</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Marschall</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          :
          <article-title>Transforming object oriented models with BOTL</article-title>
          .
          <source>In: GT-VMT 2002. ENTCS</source>
          , vol.
          <volume>72</volume>
          , pp.
          <fpage>103</fpage>
          -
          <lpage>117</lpage>
          . Elsevier (
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Cheney</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>McKinna</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Stevens</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gibbons</surname>
          </string-name>
          , J.:
          <article-title>Towards a repository of Bx examples</article-title>
          .
          <source>In: EDBT/ICDT Workshops</source>
          . vol.
          <volume>1133</volume>
          , pp.
          <fpage>87</fpage>
          -
          <lpage>91</lpage>
          . CEUR-WS.org (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Czarnecki</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Foster</surname>
            ,
            <given-names>J.N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hu</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          , La¨mmel, R., Schu¨ rr,
          <string-name>
            <given-names>A.</given-names>
            ,
            <surname>Terwilliger</surname>
          </string-name>
          ,
          <string-name>
            <surname>J.F.</surname>
          </string-name>
          :
          <article-title>Bidirectional transformations: A cross-discipline perspective</article-title>
          .
          <source>In: ICMT 2009. LNCS</source>
          , vol.
          <volume>5563</volume>
          , pp.
          <fpage>260</fpage>
          -
          <lpage>283</lpage>
          . Springer (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Ghamarian</surname>
            ,
            <given-names>A.H.</given-names>
          </string-name>
          , de Mol,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Rensink</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            ,
            <surname>Zambon</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            ,
            <surname>Zimakova</surname>
          </string-name>
          ,
          <string-name>
            <surname>M.</surname>
          </string-name>
          :
          <article-title>Modelling and analysis using GROOVE</article-title>
          .
          <source>Software Tools for Technology Transfer</source>
          <volume>14</volume>
          (
          <issue>1</issue>
          ),
          <fpage>15</fpage>
          -
          <lpage>40</lpage>
          (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Habel</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pennemann</surname>
            ,
            <given-names>K.H.</given-names>
          </string-name>
          :
          <article-title>Correctness of high-level transformation systems relative to nested conditions</article-title>
          .
          <source>Mathematical Structures in Computer Science</source>
          <volume>19</volume>
          (
          <issue>2</issue>
          ),
          <fpage>245</fpage>
          -
          <lpage>296</lpage>
          (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Habel</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pennemann</surname>
            ,
            <given-names>K.H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rensink</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Weakest preconditions for high-level programs</article-title>
          .
          <source>In: ICGT 2006. LNCS</source>
          , vol.
          <volume>4178</volume>
          , pp.
          <fpage>445</fpage>
          -
          <lpage>460</lpage>
          . Springer (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Jouault</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Allilaire</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          , Be´zivin, J.,
          <string-name>
            <surname>Kurtev</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          :
          <article-title>ATL: A model transformation tool</article-title>
          .
          <source>Science of Computer Programming</source>
          <volume>72</volume>
          (
          <issue>1-2</issue>
          ),
          <fpage>31</fpage>
          -
          <lpage>39</lpage>
          (
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Kolovos</surname>
            ,
            <given-names>D.S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Paige</surname>
            ,
            <given-names>R.F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Polack</surname>
            ,
            <given-names>F.A.C.</given-names>
          </string-name>
          :
          <article-title>On the evolution of OCL for capturing structural constraints in modelling languages</article-title>
          .
          <source>In: Rigorous Methods for Software Construction and Analysis. LNCS</source>
          , vol.
          <volume>5115</volume>
          , pp.
          <fpage>204</fpage>
          -
          <lpage>218</lpage>
          . Springer (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Macedo</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cunha</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Implementing QVT-R bidirectional model transformations using Alloy</article-title>
          .
          <source>In: FASE 2013. LNCS</source>
          , vol.
          <volume>7793</volume>
          , pp.
          <fpage>297</fpage>
          -
          <lpage>311</lpage>
          . Springer (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Paige</surname>
            ,
            <given-names>R.F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kolovos</surname>
            ,
            <given-names>D.S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rose</surname>
            ,
            <given-names>L.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Drivalos</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Polack</surname>
            ,
            <given-names>F.A.C.</given-names>
          </string-name>
          :
          <article-title>The design of a conceptual framework and technical infrastructure for model management language engineering</article-title>
          .
          <source>In: ICECCS 2009</source>
          . pp.
          <fpage>162</fpage>
          -
          <lpage>171</lpage>
          . IEEE Computer Society (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Plump</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          :
          <article-title>The design of GP 2</article-title>
          . In:
          <article-title>WRS 2011</article-title>
          .
          <article-title>EPTCS</article-title>
          , vol.
          <volume>82</volume>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>16</lpage>
          (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Poskitt</surname>
            ,
            <given-names>C.M.:</given-names>
          </string-name>
          <article-title>Verification of Graph Programs</article-title>
          .
          <source>Ph.D. thesis</source>
          , The University of York (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Poskitt</surname>
            ,
            <given-names>C.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Plump</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          :
          <article-title>Hoare-style verification of graph programs</article-title>
          .
          <source>Fundamenta Informaticae</source>
          <volume>118</volume>
          (
          <issue>1-2</issue>
          ),
          <fpage>135</fpage>
          -
          <lpage>175</lpage>
          (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Poskitt</surname>
            ,
            <given-names>C.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Plump</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          :
          <article-title>Verifying monadic second-order properties of graph programs</article-title>
          .
          <source>In: ICGT 2014. LNCS</source>
          , vol.
          <volume>8571</volume>
          , pp.
          <fpage>33</fpage>
          -
          <lpage>48</lpage>
          . Springer (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Stevens</surname>
            ,
            <given-names>P.:</given-names>
          </string-name>
          <article-title>A landscape of bidirectional model transformations</article-title>
          .
          <source>In: GTTSE 2007. LNCS</source>
          , vol.
          <volume>5235</volume>
          , pp.
          <fpage>408</fpage>
          -
          <lpage>424</lpage>
          . Springer (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Stevens</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Bidirectional model transformations in QVT: semantic issues and open questions</article-title>
          .
          <source>Software and System Modeling</source>
          <volume>9</volume>
          (
          <issue>1</issue>
          ),
          <fpage>7</fpage>
          -
          <lpage>20</lpage>
          (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>