<?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">Towards Automating the Analysis of Integrity Constraints in Multi-level Models</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Esther</forename><surname>Guerra</surname></persName>
							<email>esther.guerra@uam.es</email>
							<affiliation key="aff0">
								<orgName type="institution">Universidad Autónoma de Madrid (Spain)</orgName>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Juan</forename><surname>De Lara</surname></persName>
							<email>juan.delara@uam.es</email>
							<affiliation key="aff0">
								<orgName type="institution">Universidad Autónoma de Madrid (Spain)</orgName>
							</affiliation>
						</author>
						<title level="a" type="main">Towards Automating the Analysis of Integrity Constraints in Multi-level Models</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">709313B9C72E792AC4E7D5090FA5DCFB</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-23T19: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>Multi-level modelling is a technology that promotes an incremental refinement of meta-models in successive meta-levels. This enables a flexible way of modelling, which results in simpler and more intensional models in some scenarios. In this context, integrity constraints can be placed at any meta-level, and need to indicate at which meta-level below they should hold. This requires a very careful design of constraints, as constraints defined at different meta-levels may interact in unexpected ways. Unfortunately, current techniques for the analysis of the satisfiability of constraints only work in two meta-levels. In this paper, we give the first steps towards the automation of mechanisms to check the satisfiability of integrity constraints in a multi-level setting, leveraging on "off-the-shelf" model finders.</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>Multi-level modelling <ref type="bibr" target="#b2">[3]</ref> is a promising technology that enables a flexible way of modelling by allowing the use of an arbitrary number of meta-levels, instead of just two. This results in simpler models <ref type="bibr" target="#b3">[4]</ref>, typically in scenarios where the type-object pattern or some variant of it arises.</p><p>While multi-level modelling has benefits, it also poses some challenges that need to be addressed in order to foster a wider adoption of this technology <ref type="bibr" target="#b9">[10]</ref>. One of these challenges is the definition and analysis of constraints in multi-level models. In a two-level setting, constraints are placed in the meta-models and evaluated in the models one meta-level below. This enables the use of "off-theshelf" model finders <ref type="bibr" target="#b0">[1,</ref><ref type="bibr" target="#b5">6,</ref><ref type="bibr" target="#b11">12,</ref><ref type="bibr" target="#b12">13,</ref><ref type="bibr" target="#b15">16]</ref> to reason about correctness properties, like satisfiability (is there a valid model that satisfies all constraints?). However, constraints in multi-level models can be placed at any meta-level and be evaluated any number of meta-levels below, which may cause unanticipated effects. This makes the design and reasoning on the validity of constraints more intricate.</p><p>In this paper, we present the first steps towards a systematic method for the analysis of a basic quality property in multi-level modelling: the satisfiability of integrity constraints. We base our approach on the use of "off-the-shelf" model finders, which are able to perform a bounded search of models conforming to a given meta-model and satisfying a set of OCL constraints. Since the stateof-the-art model finders only work in a two-level setting, we need to "flatten" the multiple levels in a multi-level model to be able to use the finders for our purposes. This process has two orthogonal dimensions, which account for the number of meta-levels provided to, and searched by, the finder. Thus, we discuss alternative flattening algorithms for different analysis scenarios. As a proof of concept, we illustrate our method through the analysis of MetaDepth multilevel models <ref type="bibr" target="#b8">[9]</ref> using the USE Validator <ref type="bibr" target="#b12">[13]</ref> for model finding. Paper organization. Section 2 introduces multi-level modelling as designed in the MetaDepth tool. Section 3 presents properties and scenarios in the analysis of multi-level models. Section 4 discusses strategies for flattening multilevel models for their analysis with standard model finders. Section 5 describes the use of a model finder to analyse MetaDepth models. Last, Section 6 reviews related research and Section 7 draws some conclusions and future works.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Multi-level modelling</head><p>We will illustrate our proposal using a running example in the area of domainspecific process modelling, while the introduced multi-level concepts are those provided by the MetaDepth tool <ref type="bibr" target="#b8">[9]</ref>. The example is shown in Fig. <ref type="figure">1</ref> using MetaDepth syntax (left) and a graphical representation (right). For the textual syntax, we only show the two upper meta-levels of the solution.</p><p>The main elements in a multi-level solution are models, clabjects, fields, references and constraints. All of them have a potency, indicated with the @ symbol. The potency is a positive number (or zero) that specifies in how many meta-levels an element can be instantiated. It is automatically decremented at each deeper meta-level, and when it reaches zero, the element cannot be instantiated in the meta-levels below. If an element does not define a potency, it receives the potency from its enclosing container, and ultimately from the model. Hence, the potency of a model is similar to the notion of level in other multi-level approaches <ref type="bibr" target="#b2">[3]</ref>.</p><p>As an example, the upper model in Fig. <ref type="figure">1</ref> contains a clabject Task with potency 2, thus allowing the creation of types of tasks in the next meta-level (e.g., Coding), and their subsequent instantiation into concrete tasks in the bottom meta-level (e.g., c1). Task defines two fields: name has potency 1 and therefore it receives values in the intermediate level, while startDay has potency 2 and is used to set the start day of specific tasks in the lowest meta-level.</p><p>In MetaDepth, references with potency 2 (like next) need to be instantiated at potency 1 (e.g., nextPhase), to be able to instantiate these latter instances at level 0. The cardinality of a reference constrains the number of instances at the meta-level right below. Thus, the cardinality of next controls the instantiations at level 1, and the cardinality of nextPhase the ones at level 0.</p><p>Constraints can be declared at any meta-level. In this case, the potency states how many meta-levels below the constraint will be evaluated. Constraint C1, which ensures uniqueness of task names, has potency 1, and therefore it will be evaluated one meta-level below. Constraint C2 has potency 2, and hence it states that two meta-levels below, the start day of a task must be less than the start day of any task related to it by next references. C2 needs to refer to the instances of the instances of the reference next, two levels below, but the (direct)   type of the instances two levels below is unknown beforehand because it depends on the elements created at level 1. In the example, it means that C2 cannot make use of nextPhase to constrain the models at level 0. Instead, to allow the access to indirect instances of a given reference, MetaDepth offers two operations:</p><p>references returns the name of the references that instantiate a given one. For example, self.references('next') evaluated at clabject c1 yields Set{'nextPhase'}, as the type of c1 defines the reference nextPhase as an instance of next. value returns the content of a reference with the given name. For example, self.value('nextPhase') evaluated in clabject c1 yields Set{c2,t2}.</p><p>In the intermediate meta-level, constraints C3, C4, C5 and C6 have potency 1, and thus they need to be satisfied by models at the subsequent meta-level. The purpose of C3 is to enforce positive starting days, where note that the feature startDay is defined one meta-level above. C4 ensures that Coding tasks are not final, while C5 requires final Testing tasks to have no subsequent tasks. Finally, C6 is an attempt to enable some degree of parallelization of tasks, where the modeller wanted to express that any coding task should have a testing task starting the same day.</p><p>The lower meta-level in the figure is an attempt (with no success) to instantiate the model with potency 1. The modeller started adding the coding tasks c1 and c2 at days 1 and 5. Then, to satisfy the constraint C6, he added two testing tasks starting at days 1 and 5 as well. Coding tasks must be followed by some other task to avoid they are left untested (controlled by the cardinality 1..* of nextPhase), and the start day of consecutive tasks must be increasing (controlled by constraint C2). Thus, the modeller connected the tasks as shown in the figure to satisfy these constraints. However, then, he realised that the coding task c2 needed to be followed by some other task. Connecting c2 with t2 is not a valid solution because this would violate constraint C2. Therefore, how can he connect the testing tasks to the coding tasks to satisfy all constraints? The next section explains how model finders can help in this situation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Analysis of multi-level models: properties and scenarios</head><p>A meta-model should satisfy some basic properties, like the possibility of creating a non-empty instance that does not violate the integrity constraints. Several works <ref type="bibr" target="#b6">[7]</ref> rely on model finding techniques to check correctness properties of meta-models in a standard two meta-level setting, like:</p><p>-Strong satisfiability: There is a meta-model instance that contains at least one instance of every class and association. -Weak satisfiability: There exists a non-empty instance of the meta-model.</p><p>-Liveliness of a class c: There exists some instance of the meta-model that contains at least one instance of c.</p><p>Model finding techniques can also be helpful in a multi-level setting. If we consider level 0 in Fig. <ref type="figure">1</ref>, a model finder can help model developers by providing a suitable model completion, or indicating that no such completion exists. At level 1, it can help to check the consistency of the integrity constraints at levels 1 and 2 through the analysis of the abovementioned correctness properties. At level 2, it can provide example instantiations for levels 1 and 0, to ensure that potencies of the different elements at the top-most level work as expected.</p><p>However, model finders work in a two-level setting (i.e., they receive a metamodel and produce an instance). To enable their use with several meta-levels, we need flattening operations that merge several meta-levels into one, which can then be the input to the finder. The flattening operations must take into account how many meta-levels are going to be used in the analysis (depth of model), as well as the number of meta-levels in the generated snapshot (height of snapshot).</p><p>Fig. <ref type="figure">2</ref> shows the different scenarios we need to solve for the analysis of multilevel models. Fig. <ref type="figure">2(a</ref>) is the most usual case, where only the definition of the topmost model is available, and we want to check whether this can be instantiated at each possible meta-level below (2 in the case of having an upper model with potency 2). Thus, in the figure, the depth of the model to be used in the analysis is 1, while the height of the searched snapshot is 2. As standard model finders</p><formula xml:id="formula_0">@2 depth of model:1 (a) (b) (c) (d) @1 @0 height of snapshot:2 @2 depth of model:2 @1 @0 height of snapshot:1 @2 depth of model:1 @1 @0 height of snapshot:1 @2 depth of model:1 @0 height of snapshot:1 gap: 1 @1</formula><p>Fig. <ref type="figure">2</ref>. Different scenarios in the analysis of a multi-level model.</p><p>only provide snapshots of models residing in one meta-level, we will need to emulate the generation of several meta-levels within one. In Fig. <ref type="figure">2</ref>(b), the models of several successive meta-levels are given, and the purpose is checking whether there is an instance at the next meta-level (with potency 0) satisfying all integrity constraints in the provided models. This situation arises when there is the need to check the correctness of the constraints introduced at a meta-level (e.g., @1) with respect to those in the meta-levels above (e.g., @2). This scenario would have helped in the analysis of the constraints at levels 2 and 1 in Fig. <ref type="figure">1</ref>. In Fig. <ref type="figure">2(b)</ref>, the depth of the model to be used in the analysis is 2. Thus, we will need to flatten these two models into a single one, which can be fed into a model finder for standard snapshot generation.</p><p>Fig. <ref type="figure">2(c</ref>) corresponds to the scenario that standard model finders are able to deal with, where a model is given, and its satisfiability is checked by generating an instance of it. However, the meta-model to be fed into the solver still needs to be adjusted, removing constraints with potency bigger than 1.</p><p>Finally, in Fig. <ref type="figure">2</ref>(d), only the top-most model is available, and the designer is interested just in the analysis of the lowest meta-level. This can be seen as a particular case of scenario (a), where after the snapshot generation, the intermediate levels are removed. This scenario is of particular interest to verify the existence of instances at the bottom level with certain characteristics, like a given number of objects of a certain type, or to assess whether the designed potencies for attributes work as expected.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Flattening multi-level models for analysis</head><p>In this section, we use the running example to show how to flatten the depth of models to be used in the search, and how to deal with the height of the searched snapshot. Scenarios where both the height and depth are bigger than one are also possible, being resolved by combining the flattenings we present next.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1">Depth of analysed model</head><p>To analyse a model that is not at the top-most meta-level (like in Fig. <ref type="figure">2(b)</ref>, where the goal is analysing level 1), we need to merge it with all its type models at higher levels. This permits considering all constraints and attributes defined at such higher levels. For simplicity, we assume the merging of just two metalevels. Fig. <ref type="figure" target="#fig_2">3</ref>(a) shows this flattening applied to the running example: levels 1 and 2 are merged, as the purpose is creating a regular instance at level 0.</p><p>First, the flattening handles the top level. All its clabjects (Task in the example) are set to abstract to disable their instantiation. All references are deleted (next), as only the references defined at level 1 (nextPhase) can be instantiated at level 0. All attributes are kept, as if their potency is bigger or equal than the depth (2) plus the height (1), they still can receive a default value. Constraints with potency different from 2 (C1) are deleted as they do not constrain the level we want to instantiate (level 0). As the figure shows, the notion of potency does not appear in the flattened model. This can be interpreted as all elements having potency 1.</p><p>Then, the model at potency 1 is handled. For clabjects, the instantiation relation is changed by inheritance. In this way, SoftwareEngineeringTask is set to inherit from Task instead of being an instance of it. This is not required for Coding and Testing, as they already inherit from SoftwareEngineeringTask. This flattening strategy allows clabjects in level 1 to naturally define all attributes that were assigned potency 2 at level 2 (startDay), and receive a value at level 0. For attributes that receive a value at level 1, we need to emulate their value using constraints. Thus, in the example, we substitute the slot name from Coding and Testing, by constraints C7 and C8. The attributes, references, and constraints defined by the clabjects at level 1 are kept. Finally, we generate two operations references and value to emulate the homonym MetaDepth built-in operations by collecting the knowledge about reference instantiation statically. That is, they encode that nextPhase in Coding and Testing are instances of next. As a result of this flattening, we can use a model finder to check whether there is a valid instance at level 0.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2">Height of snapshot generation</head><p>In this scenario, we need to emulate the search of a set of models spawning several meta-levels. For simplicity, we assume the scenario in Fig. <ref type="figure">2</ref>(a), aimed at generating two models in consecutive levels from a meta-model with potency 2.</p><p>A possible strategy is to split each clabject C with potency 2 into two classes CType and CInstance holding the attributes, references and constraints with potency 1 and 2, respectively, and related by a reference type. However, this solution gets cumbersome if C is related or inherits from other clabjects, and requires rewriting the constraints in terms of the newly introduced types and relations.</p><p>Another possibility is to proceed in two steps: first a model of potency 1 is generated, which is promoted into a meta-model that can be instantiated into a model of potency 0. However, this solution may require rewriting the constraints with potency 2 in terms of the types generated at potency 1. Moreover, it does not consider all constraints at a time, which may result in different attempts before two valid models at potencies 1 and 0 are obtained.</p><p>Instead, we propose the flattening in Fig. <ref type="figure" target="#fig_2">3(b)</ref>, which adds a parent abstract class Clabject that makes explicit typical clabject features, like ontological typing and potency. All constraints are kept, but they need to be changed slightly to take into account their potency. Thus, C1 is added the premise self.potency=1 implies... so that it gets only applicable to tasks with potency 1, and similar for constraint C2 for tasks at potency 0. To emulate the potency of attributes, they are set to optional (cardinality [0..1]), and we add constraints ensuring that the attributes are undefined in the meta-levels where they cannot be instantiated. For example, name has originally potency 1, and hence it can only receive a value in tasks of potency 1 (constraint C12). Constraint C13 ensures that references (like next) do not cross meta-levels and are correctly instantiated at every meta-level. The latter means that, if two tasks at potency 0 are related by a next reference, then their types must be related via a next reference as well. While this does not fully captures the instantiation semantics as there is no explicit "instance-of" relation between references with different potencies, it suffices our purposes. Finally, constraints C9 to C11 ensure correct potency values for types and instances.</p><p>As an example, the figure to the right shows a snapshot with height 2, generated by USE from the definition in Fig. <ref type="figure" target="#fig_2">3(b</ref>).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Automating the analysis of constraints</head><p>Next, we illustrate our method by checking the satisfiability of MetaDepth multi-level models with the USE Validator <ref type="bibr" target="#b12">[13]</ref> for model finding. The checking includes the following steps: (1) flattening of multi-level model according to the selected scenario; (2) translation of flattened model into the input format of USE;</p><p>(3) generation of snapshot with the USE Validator tool; and (4) translation of the results back to MetaDepth. We will demonstrate these steps for the running example, considering the scenario in Fig. <ref type="figure">2</ref>(b), i.e., we start from models at potency 2 and 1, and check their instantiability at potency 0. Fig. <ref type="figure" target="#fig_2">3</ref>(a) shows the merging of levels 1 and 2 for the running example, while part of its translation into the input format of USE is listed below. The USE Validator does not currently support solving with arbitrary strings, but they must adhere to the format 'string&lt;number&gt;'. Thus, we translate strings to this format, where 'next' is substituted by 'string0' (lines 12 and 27), 'nextPhase' by 'string1' (lines 28 and 31), and so on. If we try to find a valid instance of this definition, we discover that the only model satisfying all constraints is the empty model. Thus, the model at level 1 is neither weak nor strong satisfiable. Revising the constraints at level 1, we realise that C6 does not express what the designer had in mind (that for any coding task, there should be a testing task starting the same day), but it expresses the converse (i.e., for each testing class, a coding class exists). One solution is moving constraint C6 from class Testing to Coding, modified to iterate on all instances of Testing (i.e., Testing.allInstances()...). If we perform this change, the resulting model becomes satisfiable, and the USE Validator generates the snapshots in Fig. <ref type="figure" target="#fig_5">4</ref>.   satisfiability is checked by finding a model that contains an instance of every class and reference. By assigning a lower bound 1 to all types, the USE Validator finds the model to the right of Fig. <ref type="figure" target="#fig_5">4</ref>.</p><p>If the scenario to solve is completing a partial model, like the one at the bottom level of Fig. <ref type="figure">1</ref>, we need to provide a seed model for the search. This can be emulated by an additional constraint demanding the existence of the starting model structure. Fig. <ref type="figure" target="#fig_0">5</ref> shows the OCL constraint representing our example model at level 0 (left), as well as the complete valid model found by USE (right).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">Related work</head><p>Some multi-level approaches have an underlying semantics based on constraints, like Nivel <ref type="bibr" target="#b1">[2]</ref>, which is based on WCRL. This allows some decidable, automated reasoning procedures on Nivel models, but they lack support for integrity constraints beyond multiplicities.</p><p>There are several tools to validate the satisfiability of integrity constraints in a two-level setting. We have illustrated our method with the USE Validator <ref type="bibr" target="#b12">[13]</ref>, which translates a UML model and its OCL constraints into relational logic, and uses a SAT solver to check its satisfiability. UML2Alloy <ref type="bibr" target="#b0">[1]</ref> follows a similar approach. Instead, UMLtoCSP <ref type="bibr" target="#b5">[6]</ref> and EMFtoCSP <ref type="bibr" target="#b11">[12]</ref> transform the model into a constraint satisfaction problem (CSP) to check its satisfiability, and ocl2smt <ref type="bibr" target="#b15">[16]</ref> translates it into a set of operations on bit-vectors which can be solved by SMT solvers. The approach of Queralt <ref type="bibr" target="#b13">[14]</ref> uses resolution and Clavel <ref type="bibr" target="#b7">[8]</ref> maps a subset of OCL into first-order logic and employs SMT solvers to check unsatisfiability. HOL-OCL <ref type="bibr" target="#b4">[5]</ref> is a theorem proving environment for OCL. In contrast to the enumerated tools, it does not rely on bounded model finding, but it is able of proving complex properties of UML/OCL specifications. All these works consider two meta-levels, and could be used to solve the multi-level scenarios in Section 3, once they have been translated into a two-level setting. Other works use constraint solving for model completion <ref type="bibr" target="#b14">[15]</ref>, also in a two-level setting.</p><p>Altogether, the use of model finders to verify properties in models is not novel. However, to the best of our knowledge, ours is the first work targeting the analysis of integrity constraints in multi-level models.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7">Conclusions and future work</head><p>In this paper, we have proposed a method to check the satisfiability of constraints in multi-level models using "off-the-shelf" model finders. To this aim, the method proposes flattenings that depend on the number of levels fed to the finder and the height of the generated snapshot. The method has been illustrated using MetaDepth and the USE Validator.</p><p>Currently, we are working towards a tighter integration of the USE validator with MetaDepth, providing commands to e.g., complete a given model. We also plan to analyse other properties, like independence of constraints <ref type="bibr" target="#b10">[11]</ref>.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>5 next:</head><label>5</label><figDesc>Task[ * ];</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>6 7C1@ 1 :C1@ 1 :?Fig. 1 .</head><label>6111</label><figDesc>Fig. 1. Running example in MetaDepth syntax (left) and diagram (right).</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. Flattenings for different depths and heights.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head></head><label></label><figDesc>String) : Set(String) = Set{} 9 value (r:String) : Set(Task) = Set{} constraints inv C2: self.references('string0')−&gt;forAll(r | self.value(r)−&gt;forAll(n | self.startDay &lt; n.startDay)) end abstract class SoftwareEngineeringTask &lt; Task attributes final : Boolean constraints inv C3: self.startDay &gt; 0 end 23 24 class Coding &lt; SoftwareEngineeringTask 25 operations 26 references(r:String) : Set(String) .. * ] role nextPhase 44 end</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head></head><label></label><figDesc>Weak satisfiability is checked by finding a valid non-empty model. The USE Validator allows configuring the minimum and maximum number of objects and references of each type in the generated model. If we set a lower bound 1 for class Testing, we obtain the instance model shown in the left of Fig. 4. Strong</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Fig. 4 .</head><label>4</label><figDesc>Fig. 4. Showing weak (left) and strong (right) satisfiability of the running example.</figDesc><graphic coords="8,322.19,543.59,147.90,99.41" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Fig. 5 .</head><label>5</label><figDesc>Fig. 5. Encoding of incomplete model at level 0 (left). Complete valid instance (right).</figDesc><graphic coords="9,276.52,120.36,204.72,98.53" type="bitmap" /></figure>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Acknowledgements. This work has been funded by the Spanish Ministry of Economy and Competitivity with project "Go Lite" (TIN2011-24139).</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">UML2Alloy: a challenging model transformation</title>
		<author>
			<persName><forename type="first">K</forename><surname>Anastasakis</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Bordbar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Georg</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Ray</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">MoDELS</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="volume">4735</biblScope>
			<biblScope unit="page" from="436" to="450" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Nivel: a metamodelling language with a formal semantics</title>
		<author>
			<persName><forename type="first">T</forename><surname>Asikainen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Männistö</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Software and Systems Modeling</title>
		<imprint>
			<biblScope unit="volume">8</biblScope>
			<biblScope unit="issue">4</biblScope>
			<biblScope unit="page" from="521" to="549" />
			<date type="published" when="2009">2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">The essence of multilevel metamodeling</title>
		<author>
			<persName><forename type="first">C</forename><surname>Atkinson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Kühne</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">UML</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2001">2001</date>
			<biblScope unit="volume">2185</biblScope>
			<biblScope unit="page" from="19" to="33" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Reducing accidental complexity in domain models</title>
		<author>
			<persName><forename type="first">C</forename><surname>Atkinson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Kühne</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Software and Systems Modeling</title>
		<imprint>
			<biblScope unit="volume">7</biblScope>
			<biblScope unit="issue">3</biblScope>
			<biblScope unit="page" from="345" to="359" />
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">HOL-OCL: a formal proof environment for UML/OCL</title>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">D</forename><surname>Brucker</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Wolff</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">FASE</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2008">2008</date>
			<biblScope unit="volume">4961</biblScope>
			<biblScope unit="page" from="97" to="100" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">UMLtoCSP: a tool for the formal verification of UML/OCL models using constraint programming</title>
		<author>
			<persName><forename type="first">J</forename><surname>Cabot</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Clarisó</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Riera</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ASE</title>
		<imprint>
			<biblScope unit="page" from="547" to="548" />
			<date type="published" when="2007">2007</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">On the verification of UML/OCL class diagrams using constraint programming</title>
		<author>
			<persName><forename type="first">J</forename><surname>Cabot</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Clarisó</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Riera</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Journal of Systems and Software</title>
		<imprint>
			<biblScope unit="volume">93</biblScope>
			<biblScope unit="page" from="1" to="23" />
			<date type="published" when="2014">2014</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Checking unsatisfiability for OCL constraints</title>
		<author>
			<persName><forename type="first">M</forename><surname>Clavel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Egea</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">A G</forename><surname>De Dios</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Electronic Communications of the EASST</title>
		<imprint>
			<biblScope unit="volume">24</biblScope>
			<biblScope unit="page" from="1" to="13" />
			<date type="published" when="2009">2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Deep meta-modelling with MetaDepth</title>
		<author>
			<persName><forename type="first">J</forename><surname>Lara</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Guerra</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">TOOLS</title>
		<imprint>
			<biblScope unit="volume">6141</biblScope>
			<biblScope unit="page" from="1" to="20" />
			<date type="published" when="2010">2010</date>
			<publisher>Springer</publisher>
		</imprint>
	</monogr>
	<note>LNCS</note>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Extending deep metamodelling for practical model-driven engineering</title>
		<author>
			<persName><forename type="first">J</forename><surname>Lara</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Guerra</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Cobos</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Moreno-Llorena</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Comput. J</title>
		<imprint>
			<biblScope unit="volume">57</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="36" to="58" />
			<date type="published" when="2014">2014</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">Proving and visualizing OCL invariant independence by automatically generated test cases</title>
		<author>
			<persName><forename type="first">M</forename><surname>Gogolla</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Hamann</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Kuhlmann</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">TAP</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="volume">6143</biblScope>
			<biblScope unit="page" from="38" to="54" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<monogr>
		<title level="m" type="main">EMFtoCSP: a tool for the lightweight verification of EMF models</title>
		<author>
			<persName><forename type="first">C</forename><forename type="middle">A</forename><surname>González</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Büttner</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Clarisó</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Cabot</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2012">2012</date>
			<publisher>FormSERA</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Extensive validation of OCL models by integrating SAT solving into USE</title>
		<author>
			<persName><forename type="first">M</forename><surname>Kuhlmann</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Hamann</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Gogolla</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">TOOLS</title>
		<imprint>
			<biblScope unit="volume">49</biblScope>
			<biblScope unit="page" from="290" to="306" />
			<date type="published" when="2011">2011</date>
			<publisher>Springer</publisher>
		</imprint>
	</monogr>
	<note>LNCS</note>
</biblStruct>

<biblStruct xml:id="b13">
	<analytic>
		<title level="a" type="main">Verification and validation of UML conceptual schemas with OCL constraints</title>
		<author>
			<persName><forename type="first">A</forename><surname>Queralt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Teniente</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">TOSEM</title>
		<imprint>
			<biblScope unit="volume">21</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page">13</biblScope>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<analytic>
		<title level="a" type="main">Towards domain-specific model editors with automatic model completion</title>
		<author>
			<persName><forename type="first">S</forename><surname>Sen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Baudry</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Vangheluwe</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Simulation</title>
		<imprint>
			<biblScope unit="volume">86</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="109" to="126" />
			<date type="published" when="2010">2010</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Verifying UML/OCL models using boolean satisfiability</title>
		<author>
			<persName><forename type="first">M</forename><surname>Soeken</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Wille</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Kuhlmann</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Gogolla</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Drechsler</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">DATE</title>
				<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="page" from="1341" to="1344" />
		</imprint>
	</monogr>
</biblStruct>

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