<!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>OCL Pattern Matching</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Tony Clark</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Middlesex University</institution>
          ,
          <addr-line>London</addr-line>
          ,
          <country country="UK">UK</country>
        </aff>
      </contrib-group>
      <fpage>33</fpage>
      <lpage>42</lpage>
      <abstract>
        <p>This paper proposes an extension to OCL that addresses a concern regarding the proliferation of navigation expressions that occur when expressing predicates over objects. Declarative patterns are introduced that can be used to match against object structures so that repeated variables reduce the need for lengthy repeated navigation expressions. Patterns provide the basis for a further contribution that shows how objects can be used as functions.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>OCL is a formal language that can be used to express both system invariants and
pre and post conditions on system operations. The language is abstract in the
sense that it hides away the details of the representation of relationships and by
providing collections with associated operations such as union and includes.
Constraints on the state of objects in a system can be de ned by applying
predicates to path expressions. A path expression navigates from a given instance
using `.' to index object properties and association role ends.</p>
      <p>
        Navigation via path expressions occurs frequently in OCL expressions.
Typically, a constraint on an object o will involve a predicate p and two or more path
expressions o.a.b.c and o.i.j.k such that p(o.a.b.c,o.i.j.k) is required
to hold true. A speci cation of an invariant or a pre/post condition will require
multiple constraints to hold simultaneously. Such a proliferation of constraints
involving path expressions can lead to very verbose speci cations as noted in
[
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] (although the author proposes a very di erent solution to that proposed
here). OCL can greatly facilitate the use of models as described in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] whose
authors also note that novices require more training than usual in the use and
comprehension of OCL constraints.
      </p>
      <p>
        Programming languages such as ML [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], Racket [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] and Haskell [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] have
addressed the problem of verbose path expressions by providing patterns. A
pattern is a way of expressing multiple path expressions in a single declarative
expression and the OCL Manifesto mentions functional programming languages
as part of its motivation [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Patterns denote values in a given language; in the
case of OCL, patterns denote atomic values, collections and objects. Patterns
also contain variables that denote any value of an appropriate type. Therefore
patterns denote sets of values, such that any value in the set matches the pattern
given a collection of variable bindings. The process of taking a value from the
set and constructing the associated set of variable bindings is called pattern
matching.
      </p>
      <p>
        This paper proposes an extension to OCL that allows patterns to be used
in constraints. The extension involves two new language constructs: a
caseexpression that dispatches on a value given a collection of patterns, and an
(a) Basic Trees
(b) Trees With Properties
object-expression that is used to construct instances of classes. Together these
new constructs allow OCL context declarations to be used in new ways. In
particular, a special case is identi ed that allows UML classes to be viewed as
properties and functions. The language is similar to the MT language [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] where
the patterns are restricted to model transformations.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>Motivation</title>
      <p>Consider the model shown in gure 1(a)1. A binary tree is either a leaf containing
an integer value or a pair of trees labelled left and right.</p>
      <p>Suppose that we want to identify ordered binary trees where the leaf values
increase left to right. One way to do this is to de ne an Ordered property that
holds for a sub-set of trees. A property can be de ned as a class that associates
0 or more classes with a class whose instances have the property.</p>
      <p>Figure 1(b) shows the class Ordered associated with class Tree that de nes
the ordered property on trees. The ordered property uses two auxiliary
selectionproperties: Largest and Smallest. The essential idea is that a tree is ordered
when all of its sub-trees are ordered and a binary-pair of trees is ordered when
the largest element on the left is less or equal to the smallest element on the
right.</p>
      <p>The OCL speci cation of ordered trees is shown in gure 2. The speci cation
exhibits features that are typical of using OCL to de ne properties in this way:
navigation: The speci cation of Ordered and Largest both exhibit multiple
navigation expressions that are used to apply functions and predicates to values
in object slots. Given that the speci cation of ordered trees is relatively small
compared to real-world applications, speci cations involving such expressions
can become complex and di cult to comprehend.
inheritance: Tree is an inductively de ned data type: a tree is a leaf or the
binary combination of two trees. Such recursive de nitions can be achieved
using an abstract class Tree and concrete sub-classes Leaf and Bin. A property
de nition is then de ned in the context of the super-class using oclIsKindOf as
a way of selecting the appropriate sub-class.
1 Note that in diagrams by default: association ends have a multiplicity of 1 and are
named by the attached class (pluralised where necessary). No cycles are allowed.
context Ordered inv :
tree . oclIsKindOf ( Leaf ) or
( tree . oclIsKindOf ( Bin ) and
children -&gt; includes ( tree . left . ordered ) and
children -&gt; includes ( tree . right . ordered ) and
tree . left . largest . leaf . value &lt;= tree . right . smallest . leaf . value )
context Largest inv :
tree . oclIsKindOf ( Leaf ) implies leaf = tree and
tree . oclIsKindOf ( Bin ) implies
children -&gt; includes ( tree . left . select ) and
children -&gt; includes ( tree . right . select ) and
tree . left . select . oclIsKindOf ( Largest ) and
tree . right . select . oclIsKindOf ( Largest ) and
leaf . value = tree . left . select . leaf . value . max ( tree . right . select . leaf . value )
context Smallest inv :
-- similar to Largest
children: The structure of a property often follows the recursive structure of
the data-type it relates to. For example, a binary tree is ordered when the two
sub-trees are also ordered. Another example is that the largest element of two
binary trees is the maximum of the largest element of the two sub-trees. The
model in gure 1(a) shows that the property classes have self-associations called
children that facilitate the de nition of the sympathetic recursion between the
property and the class it relates to.
3</p>
    </sec>
    <sec id="sec-3">
      <title>Related Work</title>
      <p>Pattern matching has been used in functional programming languages for many
years. Languages such as ML, Scheme and Haskell use pattern matching in terms
of case-analysis and are the basis for the proposal put forward in this paper. A
di erence is that functional programming languages use algebraic data types
rather than classes and inheritance, however there is a straightforward
translation from classes with inheritance to tagged elements in an algebraic data type.</p>
      <p>
        Model transformation languages [
        <xref ref-type="bibr" rid="ref1 ref7">1, 7</xref>
        ] often use patterns to identify the parts
of a source model that are to be removed and replaced. For example QVT [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]
uses object patterns that are similar to the features proposed in this paper.
However, by integrating patterns at the OCL level, they can be used to achieve
a wide range of useful results including a reduction on the complexity of lengthy
navigation expressions, functions and relations. Some languages such as [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] use
an SQL-like syntax to match and transform models, however these approaches
do not support structural matching.
      </p>
      <p>Graph-based transformation systems use patterns to select parts of a graph
and use results from algebra theory to provide a declarative approach to express
sharing constraints to be maintained or achieved by transformation rules. Like
QVT patterns, these are related to the ideas presented here, but speci cally
target model transformation.</p>
      <p>
        Other applications of pattern matching in model based engineering involves
the use of OCL-based patterns to measure model quality [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], however it appears
that the authors do not use structural matching, and that the patterns are
encoded using standard OCL. Patterns are described in terms of mining models
in [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] but the encode the patterns using standard QVT.
context ( Ordered )[ tree =t] inv :
case t {
( Leaf )[ value =_] ! true ;
( Bi(nO)r[delreefdt =)[l;trreiegh=tl=]r]an!d ( Ordered )[ tree =r] and v1 &lt;= v2
where ( Leaf )[ value = v1 ]=( Largest )[ tree =l] and
      </p>
      <p>( Leaf )[ value = v2 ]=( Least )[ tree =r]
}
Our proposal is that extending OCL with patterns can make speci cations more
concise and therefore easier to comprehend and analyse. Concretely, our
proposition takes the form of two new types of OCL expression: case-expressions
involving patterns, and object expressions that are used to represent class-instances.
Having introduced these features we can use them to extend context-de nitions
to use patterns in relations and to introduce a new form of functional-de nition.</p>
      <p>Figure 3 shows the de nition of a relational property called Ordered. The
body of the constraint is de ned by case-analysis on the tree t. The use of case
analysis separates out the di erent sub-types in a structured way. Notice how
the recursive de nition of Ordered follows the recursive structure of a binary
tree. This means that the re exive Ordered::children association de ned in
gure 1(b) is implicit in the de nition.</p>
      <p>Figure 3 shows the use of a case-expression. The basic form is case v f p
! e; ... g where v and e are OCL expressions and p is a pattern. If the value
v matches a pattern p then the result of the case-expression is given by the
corresponding e.</p>
      <p>Therefore, in gure 3 the relational property Ordered is speci ed by case
analysis on the tree t. A tree is either a leaf or a binary-tree. A leaf is always
ordered. A binary tree is ordered when the sub-trees l and r are ordered.
Objectexpressions are used to specify the condition that the sub-trees are ordered:
when an object expression such as (Ordered)[tree=l] is used in a boolean
expression then the corresponding well-formedness constraint, de ned using a
context-pattern de nition, must hold.</p>
      <p>The where-condition is used as a side-condition in gure 3 to require that
the greatest element of the left sub-tree is less than or equal to the least element
of the right sub-tree. Such a condition uses patterns to call an object-expression
used as a function call as described below.
context ( Largest )[ tree =t] fun :
case t {
( Leaf )[ value =_] ! t;
( Bin )[ left =l; right =r] !
( Leaf )[ value = v1 . max ( v2 )]
where ( Leaf )[ value = ( Largest )[ tree =l ]] and</p>
      <p>( Leaf )[ value = ( Largest )[ tree =r ]]
}
(a) Extending OCLExpression
(b) Pattern Abstract Syntax
The OCL standard2 de nes the language in terms of an abstract syntax, concrete
syntax and a semantics. The abstract syntax takes the form of a model that
describes how the class OCLExpression is used to attach constraints to UML
model elements. OCL patterns are de ned as an extension to the standard. This
section de nes patterns and object expressions as sub-classes of OCLExpression
and provides a concrete syntax as a BNF grammar.</p>
      <p>Figure 5(a) shows OCLExpression from the standard extended with three
new types of expression: CaseExp; Where; ObjectExp. An object expression takes
the concrete form (C,i)[n=e; ...] where C is a reference to a class, i is an
optional object-identity, n is the name of a eld or association-end, and e is
an expression. Therefore, (Point)[x=10;y=20] is a two-dimensional point. The
optional object-identities are used to specify that the same object occurs more
than once in an expression (and correspondingly in a pattern as described
below). Clearly, there are well-formedness constraints regarding the use of
objectidentities, however we will omit such discussions here.
2 http://www.omg.org/spec/OCL/2.3.1/</p>
      <p>Figure 5(b) shows the de nition of patterns as used in case-expressions and
where-expressions. Patterns are used to denote OCL values (including objects)
and use variables to match arbitrary components of values. Note that the
repeated use of the same variable must always denote the same OCL sub-value
when a pattern is matched against a value (modulo identities).</p>
      <p>The ConstrainedPattern includes the use of a boolean valued OCLExpression
to add a guard to a pattern; this is a way of escaping from the restrictions of
patterns into arbitrary boolean expressions for example the pattern p and when
e requires that a given value v both matches the pattern p and satis es the
arbitrary boolean expression e.</p>
      <p>Patterns may denote collections and it is convenient to allow
sequencepatterns to be non-deterministic (via operations such as append and union)
so that they can be further constrained via guards as described above. Figure 6
de nes the abstract syntax of collection patterns.</p>
      <p>Figure 7 proposes a concrete syntax for the pattern language. Notice how the
syntax of collection patterns follows that of the equivalent expressions.</p>
      <p>Fig. 8. A Functional Language
context ( Eval )[ exp =e; env =p] fun :
case e {
( Var )[ name =n] ! ( Lookup ( env =p; name =n ];
( Lambda )[ arg =n; body =e] ! ( Closure )[ arg =n; env =p; body =e ];
( Alpept )[v1op:=Voa;luaerg ==e]( E!val )[ exp =o; env =p]</p>
      <p>v2 : Value = ( Eval )[ exp =e; env =p]
in case v1 {
( Clo )[ arg =n; env =p; body =e] !
let p: Env =( Bind )[ name =n; value = v2 ; env =p] in ( Eval )[ exp =e; env =p]
}
}
}
context ( Lookup )[ env =p; name =n] fun :
case e {
( Empty )[] ! undefined ;
( Bind )[ name =m; val =v; env =p] ! if n=m then v else ( Lookup )[ env =p; name =n] endif
This section brie y shows how patterns can be used to specify a standard
recursive function. Figure 8 includes a model of the simple -calculus and de nes two
properties Eval that maps an expression and an environment to a value, and
Lookup that maps an environment and a name to a value. Figure 9 uses patterns
to de ne the Eval and Lookup functions.
7</p>
    </sec>
    <sec id="sec-4">
      <title>State and Collections</title>
      <p>The previous sections have shown how patterns can be used to de ne functions
and relations over model elements. Even though the functions are used to de ne
evaluation, there is no implication that the speci cations de ne how a system
evolves over time. This is because the patterns and associated functions and
relations are stateless.
(a) A Simple Library
(b) Dynamic Execution</p>
      <p>Models are often used to describe how a system evolves over time by showing
how, complete or partial, system states are modi ed in response to handling an
operation. Typically this is expressed using some form of state machine or process
model. When an operation is performed, OCL can be used to de ne conditions
on a before state, an after state and a relationship between the two. As with
invariants, these conditions often involve complex navigation expressions.</p>
      <p>Our proposal is that a pattern based approach can be used to de ne system
execution in a succinct and declarative way making it easier to the user and
tools to appreciate and reason about state changes. To illustrate this we use a
simple model of a library shown in gure 10(a) consiting of readers, books and
borrowing records. We limit ourselves to the library operations that borrow and
return books.</p>
      <p>The dynamic execution of a system can be expressed as a lmstrip that
consists of a collection of steps. Each step contains a before and after state of
the system. Each system operation is de ned a special type of step. For simple
sequential systems, lmstrips are sequences of steps where the before state of
a step is the same as the after state of the immediately preceding step. For
lmstrips that contain concurrency, this condition is loosened appropriately.</p>
      <p>Figure 10(b) extends the library model with a lmstrip where the concrete
steps are Borrow and Return. The general-purpose constraint that de nes
sequential behaviour is shown in gure 11. The invariant uses sequence patterns
to require that the steps are linked through the before and after states. In
particular P-&gt;prepend(s1)-&gt;prepend(s2) matches any sequence with two or more
elements of the form Seqfs1,s2,...g where P is the sequence with s1 and s2
removed. Notice that the second case-arm is de ned recursively and requires
that the lmstrip (Filmstrip)[steps=P] is well-formed.
context
( Borrow )[
book = bn ;
reader = rn ;
before =
(Lib ,l )[
books = Set {b =( Book )[ name = bn ]}-&gt; union (B );
readers = R= Set {r =( Reader )[ name = rn ]}-&gt; union (_ );
borrowings = X
];
after =
(Lib ,l )[
books = B;
readers = R;
borrowings = X -&gt; including (x)</p>
      <p>where x =( Borrowing )[ book =b; reader =r ])
]
] inv : true</p>
      <p>Each concrete step de nes a library operation and, since these are de ned
as classes, they are speci ed separately. Figure 12 shows the de nition of the
step that speci es the Borrow operation. It is a useful example of the
declarative power achieved by extending OCL with patterns because the body of the
invariant form is essentially empty because all of the constraint is expressed as
structural relationships between context and inv:. Note that the identity of the
library object is declared to be l in both the before and the after which indicates
that the change occurs by side-e ect. The Return operation is speci ed in gure
13.
8</p>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>This paper has proposed extensions to OCL that aim to address the proliferation
of navigation expressions that occur when expressing relationships between
different parts of a model. Object expressions complete the range of values that can
be denoted by general OCL expressions. Object-identities can be used to express
the state changes that occur when a system performs an operation. Patterns are
used to denote UML values, they include variables and pattern matching is used
to bind variables in order that a pattern explicitly denotes a value. Patterns
are used in case-expressions and context-declarations in order to reduce the
number of navigation expressions and to introduce a new, functional, form of
declaration.</p>
      <p>
        This paper has presented the OCL extensions in terms of examples and
syntax de nitions. Further work is needed to de ne the semantics of patterns and to
integrate them with the semantics given in the standard. No analysis has been
presented of the changes to existing tools that are implied by the addition of
patterns, for example [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] examines the issues of e cient pattern matching and
[
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] examines type checking patterns.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>Andras</given-names>
            <surname>Balogh</surname>
          </string-name>
          and
          <string-name>
            <given-names>Daniel</given-names>
            <surname>Varro</surname>
          </string-name>
          .
          <article-title>Advanced model transformation language constructs in the viatra2 framework</article-title>
          .
          <source>In Proceedings of the 2006 ACM symposium on Applied computing</source>
          , pages
          <volume>1280</volume>
          {
          <fpage>1287</fpage>
          . ACM,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Lionel</surname>
            <given-names>C Briand</given-names>
          </string-name>
          ,
          <article-title>Yvan Labiche, HD Yan, and Massimiliano Di Penta. A controlled experiment on the impact of the object constraint language in uml-based maintenance</article-title>
          .
          <source>In Software Maintenance</source>
          ,
          <year>2004</year>
          . Proceedings. 20th IEEE International Conference on, pages
          <volume>380</volume>
          {
          <fpage>389</fpage>
          . IEEE,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>Steve</given-names>
            <surname>Cook</surname>
          </string-name>
          , Anneke Kleppe, Richard Mitchell, Bernhard Rumpe, Jos Warmer, and
          <string-name>
            <given-names>Alan</given-names>
            <surname>Wills</surname>
          </string-name>
          .
          <article-title>The amsterdam manifesto on ocl</article-title>
          .
          <source>In Object Modeling with the OCL</source>
          , pages
          <volume>115</volume>
          {
          <fpage>149</fpage>
          . Springer,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>Keith</given-names>
            <surname>Duddy</surname>
          </string-name>
          , Anna Gerber, Michael J Lawley, Kerry Raymond, and
          <string-name>
            <given-names>Jim</given-names>
            <surname>Steel</surname>
          </string-name>
          .
          <article-title>Declarative transformation for OO models</article-title>
          .
          <source>Transformation of Knowledge, Information, and Data: Theory and Applications</source>
          . Idea Group Publishing,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5. Twan van Enckevort.
          <article-title>Refactoring uml models: using openarchitectureware to measure uml model quality and perform pattern matching on uml models with ocl queries</article-title>
          .
          <source>In Proceedings of the 24th ACM SIGPLAN conference companion on Object oriented programming systems languages and applications</source>
          ,
          <source>OOPSLA '09</source>
          , pages
          <fpage>635</fpage>
          {
          <fpage>646</fpage>
          , New York, NY, USA,
          <year>2009</year>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>Paul</given-names>
            <surname>Hudak</surname>
          </string-name>
          and
          <string-name>
            <surname>Joseph H Fasel</surname>
          </string-name>
          .
          <article-title>A gentle introduction to haskell</article-title>
          .
          <source>ACM Sigplan Notices</source>
          ,
          <volume>27</volume>
          (
          <issue>5</issue>
          ):1{
          <fpage>52</fpage>
          ,
          <year>1992</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>Frederic</given-names>
            <surname>Jouault</surname>
          </string-name>
          , Freddy Allilaire, Jean Bezivin, and
          <string-name>
            <given-names>Ivan</given-names>
            <surname>Kurtev</surname>
          </string-name>
          .
          <article-title>Atl: A model transformation tool</article-title>
          .
          <source>Science of Computer Programming</source>
          ,
          <volume>72</volume>
          (
          <issue>1</issue>
          ):
          <volume>31</volume>
          {
          <fpage>39</fpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>Jens</given-names>
            <surname>Ku</surname>
          </string-name>
          <article-title>bler and Thomas Goldschmidt. A pattern mining approach using QVT</article-title>
          .
          <source>In Model Driven Architecture-Foundations and Applications</source>
          . Springer,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>Ivan</given-names>
            <surname>Kurtev</surname>
          </string-name>
          .
          <article-title>State of the art of QVT: A model transformation language standard</article-title>
          .
          <source>In Applications of Graph Transformations with Industrial Relevance</source>
          , pages
          <volume>377</volume>
          {
          <fpage>393</fpage>
          . Springer,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10. Fabrice Le Fessant and
          <string-name>
            <given-names>Luc</given-names>
            <surname>Maranget</surname>
          </string-name>
          .
          <article-title>Optimizing pattern matching</article-title>
          .
          <source>In ACM SIGPLAN Notices</source>
          , volume
          <volume>36</volume>
          , pages
          <fpage>26</fpage>
          {
          <fpage>37</fpage>
          . ACM,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11. Neil Mitchell and
          <string-name>
            <given-names>Colin</given-names>
            <surname>Runciman</surname>
          </string-name>
          .
          <article-title>A static checker for safe pattern matching in haskell</article-title>
          .
          <source>Trends in Functional Programming</source>
          ,
          <volume>6</volume>
          :
          <fpage>15</fpage>
          {
          <fpage>30</fpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Lawrence C Paulson</surname>
          </string-name>
          .
          <article-title>ML for the Working Programmer</article-title>
          . Cambridge University Press,
          <year>1996</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Jo</surname>
          </string-name>
          <article-title>rn Guy Su . Sugar for ocl</article-title>
          .
          <source>In Proceedings of the 6th OCL Workshop</source>
          at the UML/-MoDELS Conference, pages
          <volume>240</volume>
          {
          <fpage>251</fpage>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Sam</surname>
          </string-name>
          Tobin-Hochstadt.
          <article-title>Extensible pattern matching in an extensible language</article-title>
          .
          <source>arXiv preprint arXiv:1106.2578</source>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <given-names>Laurence</given-names>
            <surname>Tratt</surname>
          </string-name>
          .
          <article-title>The MT model transformation language</article-title>
          .
          <source>In Proceedings of the 2006 ACM symposium on Applied computing</source>
          , pages
          <volume>1296</volume>
          {
          <fpage>1303</fpage>
          . ACM,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>