<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">OCL Pattern Matching</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Tony</forename><surname>Clark</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">Middlesex University</orgName>
								<address>
									<settlement>London</settlement>
									<country key="GB">UK</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">OCL Pattern Matching</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">31FC79C1E73FB87EEB75EB55FF00DEF6</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T19:54+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><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></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><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 defined 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 specification 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 specifications as noted in <ref type="bibr" target="#b12">[13]</ref> (although the author proposes a very different solution to that proposed here). OCL can greatly facilitate the use of models as described in <ref type="bibr" target="#b1">[2]</ref> 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 <ref type="bibr" target="#b11">[12]</ref>, Racket <ref type="bibr" target="#b13">[14]</ref> and Haskell <ref type="bibr" target="#b5">[6]</ref> 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 <ref type="bibr" target="#b2">[3]</ref>. 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 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 identified that allows UML classes to be viewed as properties and functions. The language is similar to the MT language <ref type="bibr" target="#b14">[15]</ref> where the patterns are restricted to model transformations.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Motivation</head><p>Consider the model shown in figure <ref type="figure" target="#fig_0">1</ref>(a) <ref type="foot" target="#foot_0">1</ref> . 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 define an Ordered property that holds for a sub-set of trees. A property can be defined as a class that associates 0 or more classes with a class whose instances have the property.</p><p>Figure <ref type="figure" target="#fig_0">1</ref>(b) shows the class Ordered associated with class Tree that defines 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 specification of ordered trees is shown in figure <ref type="figure" target="#fig_1">2</ref>. The specification exhibits features that are typical of using OCL to define properties in this way: navigation: The specification 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 specification of ordered trees is relatively small compared to real-world applications, specifications involving such expressions can become complex and difficult to comprehend. inheritance: Tree is an inductively defined data type: a tree is a leaf or the binary combination of two trees. Such recursive definitions can be achieved using an abstract class Tree and concrete sub-classes Leaf and Bin. A property definition is then defined in the context of the super-class using oclIsKindOf as a way of selecting the appropriate sub-class.  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 figure <ref type="figure" target="#fig_0">1</ref>(a) shows that the property classes have self-associations called children that facilitate the definition of the sympathetic recursion between the property and the class it relates to.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Related Work</head><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 difference 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. Model transformation languages <ref type="bibr" target="#b0">[1,</ref><ref type="bibr" target="#b6">7]</ref> often use patterns to identify the parts of a source model that are to be removed and replaced. For example QVT <ref type="bibr" target="#b8">[9]</ref> 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 <ref type="bibr" target="#b3">[4]</ref> 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 specifically 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 <ref type="bibr" target="#b4">[5]</ref>, 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 <ref type="bibr" target="#b7">[8]</ref> but the encode the patterns using standard QVT. Our proposal is that extending OCL with patterns can make specifications 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.</p><p>Having introduced these features we can use them to extend context-definitions to use patterns in relations and to introduce a new form of functional-definition.</p><p>Figure <ref type="figure" target="#fig_2">3</ref> shows the definition of a relational property called Ordered. The body of the constraint is defined by case-analysis on the tree t. The use of case analysis separates out the different sub-types in a structured way. Notice how the recursive definition of Ordered follows the recursive structure of a binary tree. This means that the reflexive Ordered::children association defined in figure <ref type="figure" target="#fig_0">1(b</ref>) is implicit in the definition.</p><p>Figure <ref type="figure" target="#fig_2">3</ref> shows the use of a case-expression. The basic form is case v { p → e; ... } 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 figure <ref type="figure" target="#fig_2">3</ref> the relational property Ordered is specified 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, defined using a context-pattern definition, must hold.</p><p>The where-condition is used as a side-condition in figure <ref type="figure" target="#fig_2">3</ref> 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. Figure <ref type="figure" target="#fig_3">4</ref> shows the definition of the functional property Largest. Such a definition is introduced using the standard context keyword, followed by an object pattern and fun: that indicates the class that is to be viewed as a function. The slots of the object-pattern define the fields and association ends that are designated as arguments to the function. The single field/association-end that is omitted defines the value that is to be viewed as the result of calling the function.</p><p>Again, notice how the children association is no longer required because of the recursion in the definition. The function definition is tied to the class Largest and therefore oclIsKindOf is no longer required, unlike the definition of Largest in figure <ref type="figure" target="#fig_1">2</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Extending the Standard</head><p>The OCL standard<ref type="foot" target="#foot_1">2</ref> defines 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 defined as an extension to the standard. This section defines patterns and object expressions as sub-classes of OCLExpression and provides a concrete syntax as a BNF grammar.</p><p>Figure <ref type="figure" target="#fig_4">5(a)</ref> 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 field 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. 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 satisfies the arbitrary boolean expression e. 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 <ref type="figure" target="#fig_5">6</ref> defines the abstract syntax of collection patterns.   </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">A Language Evaluator</head><p>This section briefly shows how patterns can be used to specify a standard recursive function. Figure <ref type="figure">8</ref> includes a model of the simple λ-calculus and defines 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 <ref type="figure">9</ref> uses patterns to define the Eval and Lookup functions.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7">State and Collections</head><p>The previous sections have shown how patterns can be used to define functions and relations over model elements. Even though the functions are used to define evaluation, there is no implication that the specifications define how a system evolves over time. This is because the patterns and associated functions and relations are stateless.  Models are often used to describe how a system evolves over time by showing how, complete or partial, system states are modified 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 define 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 define 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 figure <ref type="figure" target="#fig_0">10</ref>(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 filmstrip that consists of a collection of steps. Each step contains a before and after state of the system. Each system operation is defined a special type of step. For simple sequential systems, filmstrips are sequences of steps where the before state of a step is the same as the after state of the immediately preceding step. For filmstrips that contain concurrency, this condition is loosened appropriately.</p><p>Figure <ref type="figure" target="#fig_0">10(b</ref>) extends the library model with a filmstrip where the concrete steps are Borrow and Return. The general-purpose constraint that defines sequential behaviour is shown in figure <ref type="figure" target="#fig_0">11</ref>. 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 Seq{s1,s2,...} where P is the sequence with s1 and s2 removed. Notice that the second case-arm is defined recursively and requires that the filmstrip (Filmstrip)[steps=P] is well-formed. Each concrete step defines a library operation and, since these are defined as classes, they are specified separately. Figure <ref type="figure" target="#fig_1">12</ref> shows the definition of the step that specifies 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-effect. The Return operation is specified in figure <ref type="figure" target="#fig_11">13</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8">Conclusion</head><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 definitions. Further work is needed to define 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 <ref type="bibr" target="#b9">[10]</ref> examines the issues of efficient pattern matching and <ref type="bibr" target="#b10">[11]</ref> examines type checking patterns.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Fig. 1 .</head><label>1</label><figDesc>Fig. 1. Binary Trees</figDesc><graphic coords="2,134.77,115.84,138.33,115.75" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Fig. 2 .</head><label>2</label><figDesc>Fig. 2. Ordered Binary Treeschildren: 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 figure1(a) shows that the property classes have self-associations called children that facilitate the definition of the sympathetic recursion between the property and the class it relates to.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Fig. 3 .</head><label>3</label><figDesc>Fig. 3. A Relational Property</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Fig. 4 .</head><label>4</label><figDesc>Fig. 4. A Functional Property</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Figure 5 (</head><label>5</label><figDesc>Figure 5(b) shows the definition 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).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 satisfies the arbitrary boolean expression e.</figDesc><graphic coords="6,221.22,247.08,172.92,115.17" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Fig. 6 .</head><label>6</label><figDesc>Fig. 6. Sequence Patterns</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Fig. 7 .</head><label>7</label><figDesc>Fig. 7. Concrete Syntax</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head>Figure 7</head><label>7</label><figDesc>Figure7proposes a concrete syntax for the pattern language. Notice how the syntax of collection patterns follows that of the equivalent expressions.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_8"><head>Fig. 8 .Fig. 9 .</head><label>89</label><figDesc>Fig. 8. A Functional Language</figDesc><graphic coords="7,203.93,115.84,207.50,173.82" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_10"><head>Fig. 10 .Fig. 11 .</head><label>1011</label><figDesc>Fig. 10. A Model with State Changes and Collections</figDesc><graphic coords="8,134.77,137.03,121.04,100.20" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_11"><head>Fig. 13 .</head><label>13</label><figDesc>Fig. 13. Return</figDesc></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">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.</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_1">http://www.omg.org/spec/OCL/2.3.1/</note>
		</body>
		<back>
			<div type="annex">
<div xmlns="http://www.tei-c.org/ns/1.0" />			</div>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Advanced model transformation language constructs in the viatra2 framework</title>
		<author>
			<persName><forename type="first">András</forename><surname>Balogh</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Dániel</forename><surname>Varró</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2006 ACM symposium on Applied computing</title>
				<meeting>the 2006 ACM symposium on Applied computing</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="1280" to="1287" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">A controlled experiment on the impact of the object constraint language in uml-based maintenance</title>
		<author>
			<persName><forename type="first">Yvan</forename><surname>Lionel C Briand</surname></persName>
		</author>
		<author>
			<persName><surname>Labiche</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Massimiliano</forename><surname>Hd Yan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Penta</forename><surname>Di</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings. 20th IEEE International Conference on</title>
				<meeting>20th IEEE International Conference on</meeting>
		<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2004">2004. 2004</date>
			<biblScope unit="page" from="380" to="389" />
		</imprint>
	</monogr>
	<note>Software Maintenance</note>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">The amsterdam manifesto on ocl</title>
		<author>
			<persName><forename type="first">Steve</forename><surname>Cook</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Anneke</forename><surname>Kleppe</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Richard</forename><surname>Mitchell</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Bernhard</forename><surname>Rumpe</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jos</forename><surname>Warmer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Alan</forename><surname>Wills</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Object Modeling with the OCL</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2002">2002</date>
			<biblScope unit="page" from="115" to="149" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Declarative transformation for OO models</title>
		<author>
			<persName><forename type="first">Keith</forename><surname>Duddy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Anna</forename><surname>Gerber</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Michael</forename><forename type="middle">J</forename><surname>Lawley</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Kerry</forename><surname>Raymond</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jim</forename><surname>Steel</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Transformation of Knowledge, Information, and Data: Theory and Applications</title>
				<imprint>
			<publisher>Idea Group Publishing</publisher>
			<date type="published" when="2004">2004</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Refactoring uml models: using openarchitectureware to measure uml model quality and perform pattern matching on uml models with ocl queries</title>
		<author>
			<persName><surname>Twan Van Enckevort</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 24th ACM SIGPLAN conference companion on Object oriented programming systems languages and applications, OOPSLA &apos;09</title>
				<meeting>the 24th ACM SIGPLAN conference companion on Object oriented programming systems languages and applications, OOPSLA &apos;09<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2009">2009</date>
			<biblScope unit="page" from="635" to="646" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">A gentle introduction to haskell</title>
		<author>
			<persName><forename type="first">Paul</forename><surname>Hudak</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Joseph</forename><forename type="middle">H</forename><surname>Fasel</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM Sigplan Notices</title>
		<imprint>
			<biblScope unit="volume">27</biblScope>
			<biblScope unit="issue">5</biblScope>
			<biblScope unit="page" from="1" to="52" />
			<date type="published" when="1992">1992</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Atl: A model transformation tool</title>
		<author>
			<persName><forename type="first">Frédéric</forename><surname>Jouault</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Freddy</forename><surname>Allilaire</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jean</forename><surname>Bézivin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ivan</forename><surname>Kurtev</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Science of Computer Programming</title>
		<imprint>
			<biblScope unit="volume">72</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="31" to="39" />
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">A pattern mining approach using QVT</title>
		<author>
			<persName><forename type="first">Jens</forename><surname>Kübler</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Thomas</forename><surname>Goldschmidt</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Model Driven Architecture-Foundations and Applications</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2009">2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">State of the art of QVT: A model transformation language standard</title>
		<author>
			<persName><forename type="first">Ivan</forename><surname>Kurtev</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Applications of Graph Transformations with Industrial Relevance</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2008">2008</date>
			<biblScope unit="page" from="377" to="393" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Optimizing pattern matching</title>
		<author>
			<persName><forename type="first">Fabrice</forename><surname>Le</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Fessant</forename></persName>
		</author>
		<author>
			<persName><forename type="first">Luc</forename><surname>Maranget</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ACM SIGPLAN Notices</title>
		<imprint>
			<biblScope unit="volume">36</biblScope>
			<biblScope unit="page" from="26" to="37" />
			<date type="published" when="2001">2001</date>
			<publisher>ACM</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">A static checker for safe pattern matching in haskell</title>
		<author>
			<persName><forename type="first">Neil</forename><surname>Mitchell</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Colin</forename><surname>Runciman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Trends in Functional Programming</title>
		<imprint>
			<biblScope unit="volume">6</biblScope>
			<biblScope unit="page" from="15" to="30" />
			<date type="published" when="2005">2005</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<monogr>
		<title level="m" type="main">ML for the Working Programmer</title>
		<author>
			<persName><surname>Lawrence C Paulson</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1996">1996</date>
			<publisher>Cambridge University Press</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Sugar for ocl</title>
		<author>
			<persName><forename type="first">Jörn</forename><surname>Guy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Süß</forename></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 6th OCL Workshop at the UML/-MoDELS Conference</title>
				<meeting>the 6th OCL Workshop at the UML/-MoDELS Conference</meeting>
		<imprint>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="240" to="251" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<monogr>
		<title level="m" type="main">Extensible pattern matching in an extensible language</title>
		<author>
			<persName><forename type="first">Sam</forename><surname>Tobin-Hochstadt</surname></persName>
		</author>
		<idno type="arXiv">arXiv:1106.2578</idno>
		<imprint>
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
	<note type="report_type">arXiv preprint</note>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">The MT model transformation language</title>
		<author>
			<persName><forename type="first">Laurence</forename><surname>Tratt</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2006 ACM symposium on Applied computing</title>
				<meeting>the 2006 ACM symposium on Applied computing</meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="page" from="1296" to="1303" />
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
