<?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">Adding Random Operations to OCL</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Antonio</forename><surname>Vallecillo</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">Universidad de Málaga</orgName>
								<address>
									<country key="ES">Spain</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Martin</forename><surname>Gogolla</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">University of Bremen</orgName>
								<address>
									<country key="DE">Germany</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Adding Random Operations to OCL</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">C6017E75E20FC15576882AE51B8EABDA</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T01:15+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 presents an extension of OCL to allow modellers to deal with random numbers and probability distributions in their OCL specifications. We show its implementation in the tool USE and discuss some advantages of this new feature for the validation and verification of models. c o n t e x t Real : : normalDistr ( s : Real ) : Real c o n t e x t Real : : pdf01 ( ) : Real c o n t e x t Real : : pdf ( m : Real , s : Real ) : Real c o n t e x t Real : : cdf01 ( ) : Real c o n t e x t Real : : cdf ( m : Real , s : Real ) : Real c o n t e x t Real : : expDistr ( ) : Real</p><p>They are all defined as extensions to type Real. With this, if x is a real number, then • x.normalDistr(s) returns a value of a Normal (Gaussian) distribution N (x, s) (for example 0.normalDistr(1) returns the value of a N (0, 1) distribution), • x.pdf01() returns a value of the distribution function P DF (x) of a Gaussian Distribution N (0, 1), i.e., with mean=0 and σ = 1, • x.pdf(m,s) returns a value of the distribution function P DF (x) of a N (m, s),</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>I. INTRODUCTION</head><p>There are many situations in which there is a degree of uncertainty about some aspects, features or properties of the system to be modelled. For example, if we are modelling a community of human beings, what is the percentage of female persons that we want to include in our models? How many of them are expected to be left-handed? This may be important in order to generate the models that will be used during the testing, validation and verification processes so that they are as much accurate and representative as possible. Similarly, assuming that we are modelling a manufacturing system with UML and OCL <ref type="bibr" target="#b9">[10]</ref>, how to handle the requirements that orders are received following an exponential distribution, or that 0.5 % of the parts are produced with some kind of defect?</p><p>In most modelling and simulation environments, the use of random numbers and probability distributions are used to combine definite knowledge (female, male; left-handed, righthanded) with an uncertain view on the result or the population for a test case. Expectations and assumptions that remain uncertain or imprecise at high-level, are made precise and can be realized by stating the corresponding percentages, or the probability distributions that some properties or parameters follow. In this way, confidence on the validation and verification processes can be increased by experimenting with different percentages (that have different likelihoods) and by inspecting the results obtained. Likewise, random numbers are used to generate test models with varying sizes and characteristics, in order to increase the coverage of the test cases.</p><p>In this paper, we present an extension to OCL that allows modellers to handle random numbers in their specifications, as well as probability distributions. We show its implementation in the tool USE <ref type="bibr" target="#b3">[4]</ref>, <ref type="bibr" target="#b4">[5]</ref> (UML-based Specification Environment), and discuss some examples for the validation and verification of models.</p><p>Non-determinism and random-like behavior is already present in OCL, for example, through the operation any(). Most proof-theoretic OCL approaches, such as <ref type="bibr" target="#b0">[1]</ref> or <ref type="bibr" target="#b2">[3]</ref> do not speak about the evaluation of equations involving any(), for example, Set{7,8}-&gt;any(true) = Set{7,8}-&gt;any(true). In principle, an OCL evaluator could give different results for the two calls of any(), although USE <ref type="bibr" target="#b3">[4]</ref> (and every other OCL evaluator that we are aware of) gives the same result for both calls. But there are also other OCL operations that introduce non-deterministic, random-like effects, for example, when one converts a collection without order into an order-aware collection, e.g., in Bag{7,8,7}-&gt;asSequence(). However, randomness also involves returning different (valid) values in separate executions of the operations.</p><p>The paper is organized in 7 sections. After this introduction, Sect. 2 provides an overview of what OCL currently offers and what should be required. Then, Sect. 3 and Sect. 4 describe the OCL extensions to deal with random numbers and probability distributions, respectively. Section 5 illustrates the proposal with a couple of examples, and Sect. 6 gives details about how the new OCL operations have been implemented. Finally, Sect. 7 concludes and outlines some lines of future work.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>II. RANDOMNESS IN OCL</head><p>Non-determinism and random-like behavior is already present in OCL mainly through collections operations asSequence() and any() <ref type="bibr" target="#b7">[8]</ref>. More precisely, OCL defines any() as follows: Returns any element in the source collection for which body evaluates to true. Returns invalid if any body evaluates to invalid for any element, otherwise if there are one or more elements for which body is true, an indeterminate choice of one of them is returned, otherwise the result is invalid.</p><p>Then, the OCL standard <ref type="bibr">[8, 11.9</ref>.1] formally specifies it as follows:</p><formula xml:id="formula_0">source−&gt;any ( iterator | body ) = source−&gt;select ( iterator | body )−&gt;asSequence ( )−&gt;first ( )</formula><p>As we can see, it bases its indeterminism in the behaviour of operation asSequence(), which is defined for general type Collection and returns a Sequence that contains all the elements from self, in an order dependent on the particular concrete collection type. Its specification is as follows:</p><formula xml:id="formula_1">p o s t : result−&gt;forAll ( elem | self−&gt;includes ( elem ) ) p o s t : self −&gt;forAll ( elem | result−&gt;includes ( elem ) )</formula><p>For example, for a given Set it returns a Sequence that contains all the set elements, in undefined order.</p><formula xml:id="formula_2">p o s t : result−&gt;forAll ( elem | self−&gt;includes ( elem ) ) p o s t : self−&gt;forAll ( elem | result−&gt;count ( elem ) = 1 )</formula><p>As mentioned above, despite in theory this allows any OCL evaluator to return a different value for the same Set every time it is executed, in practice this does not happen and the same element is always returned.</p><p>The problem is that when it comes to other collections, the OCL specification of any() seems to be wrong, since it only works for Set and Bag collections because for the other two there is no indeterminism at all. More precisely, for Bag it may work, since operation asSequence() returns a Sequence that contains all the elements from self, in undefined order.</p><formula xml:id="formula_3">p o s t : result−&gt;forAll ( elem | self−&gt;count ( elem ) = result−&gt;count ( elem ) ) p o s t : self −&gt;forAll ( elem | self−&gt;count ( elem ) = result−&gt;count ( elem ) )</formula><p>However, the behaviour of asSequence() is completely deterministic for collections OrderedSet and Sequence. For the former, the operation returns a Sequence that contains all the elements from self, in the same order.</p><formula xml:id="formula_4">p o s t : Sequence { 1 . . self . size ( )}−&gt; forAll ( i | result−&gt;at ( i ) = self−&gt;at ( i ) )</formula><p>Similarly for Sequence collections, where asSequence() returns the Sequence identical to the object itself. This operation exists for convenience reasons.</p><formula xml:id="formula_5">p o s t : result = self</formula><p>This means that any() applied to a Sequence or an OrderSet will always return its first element, and not an indeterminate choice of one of them as its specification requires.</p><p>This is why we propose the following specification for operation any(), which does not have this problem: </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>rand()."</head><p>Note that every invocation of rand() operation may return a different number, and that randomness requires an additional requirement to the postcondition (indeterminism) expressed above. This is why operation any() is not enough to implement random numbers. Randomness also requires that the sequence of results obtained by consecutive calls to operation rand() contains no recognizable patterns or regularities-i.e., that the sequence is statistically random <ref type="bibr" target="#b6">[7]</ref>.</p><p>However, specifying this property in OCL deserves its own line of research <ref type="bibr" target="#b1">[2]</ref> and it is postponed for future work.</p><p>In addition, we need seeds. Operation srand() permits knowing and changing the seed for the random number generator. It is defined over Integers: c o n t e x t I n t e g e r : : srand ( ) : I n t e g e r Then, given an integer n, if n &gt; 0 then n.srand() starts a new random sequence with n as the new seed (the seed is an integer), and returns the value of the previous seed. To accommodate to the current possibilities of USE, we decided to restrict to integer values below 10 7 . Thus, this operation takes the given value modulo 10 7 . If n &lt;= 0, this operation generates a seed automatically using the current time and other system values.</p><p>To illustrate how these operations work, the following listing shows their results when executed in USE: </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>IV. PROBABILITY DISTRIBUTIONS IN OCL</head><p>Using the random number generator operation, it is easy to build the most commonly used distribution probability functions:  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>V. TWO SIMPLE EXAMPLES</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. A Production System</head><p>To illustrate our proposal let us suppose first a simple production system whose metamodel is depicted in Fig. <ref type="figure" target="#fig_1">1</ref>. Producers produce items that are placed in trays (bounded buffers), from where consumers collect them when informed that elements are ready (by operation elementReady()), polish them, and finally place them in the storage trays. We want to simulate the system with some uncertainty about the time producers take generating items and the probability of producers and consumers to introduce defects when handling the items.</p><p>For example, suppose that we want producers to produce items according an exponential distribution with mean 5.0, and that the probability of machines to introduce defects is 0.05. Using our OCL extension and its implementation in USE the description of operations Producer::produce() and Consumer::elementReady() is as follows: One possible result of executing the system after the production of 3 items is shown in Fig. <ref type="figure" target="#fig_4">2</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>B. A Social Network</head><p>Random numbers can also be used to determine other parameters of the system, or even the number of objects that we would like to have in our test models.</p><p>In Fig. <ref type="figure" target="#fig_5">3</ref> a simple model of a social network is shown. For validation purposes, two object diagrams (shown in Fig. <ref type="figure" target="#fig_6">4</ref>) have been generated by operation generate() using the proposed random features. The generated object diagrams differ with respect to attribute values and the structure that is defined by the Friendship links.</p><p>The definition of operation generate() is given below. The example demonstrates that, with the newly introduced OCL features, the generation of test cases showing different characteristics is supported.</p><p>generate ( numObj : Int , numLink : Int ) begin declare i : Int , p , q : Profile , ps : Seq ( Profile ) ; ps : = Sequence {}; for i in Sequence { 1 . . numObj} do p : = new Profile ; ps : = ps−&gt;including ( p ) ; p . firstN : = names−&gt;at ( 1 + names−&gt;size ( ) . rand ( ) . floor ( ) ) ; end ; for i in Sequence { 1 . . numLink} do p : = ps−&gt;at ( 1 + ps−&gt;size ( ) . rand ( ) . floor ( ) ) ; q : = ps−&gt;at ( 1 + ps−&gt;size ( ) . rand ( ) . floor ( ) ) ; i f p . inviter−&gt;excludes ( q ) and p . invitee−&gt;excludes ( q ) t h e n insert ( p , q ) into Friendship end ; end ; end  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>VI. IMPLEMENTATION IN USE</head><p>Let us describe now how we have implemented this extension in USE. First, USE provides an extension mechanism that permits adding operations to basic types. Folder oclextensions in the USE directory permits adding new files with the signature of the new operations, and their implementation in Ruby <ref type="bibr" target="#b8">[9]</ref>.</p><p>For example, to add operation sqrt to OCL type Real we use the following piece of code in one of the files (e.g. Real.xml) in the oclextensions folder:</p><formula xml:id="formula_6">&lt;operation source=" Real " name="sqrt" returnType=" Real"&gt; &lt;body&gt;&lt;![CDATA [ Math . sqrt ( $self ) ]]&gt; &lt;/body&gt; &lt;/operation&gt;</formula><p>Making use of this mechanism, and the Random library available in Ruby, the implementation of rand() and srand() operations is simple: If self is positive then srand() starts a new random sequence with self as new seed (the seed is integer), and it returns the current seed. Given that Ruby's initial seed is a huge integer number that cannot be handled by USE, this operation takes the modulo with 10 7 . If self is equal or less than 0 then the operation uses the default Ruby srand() operation that generates a seed automatically using the time and other system values.</p><p>Finally, we have also implemented the probability distributions mentioned in Sect. 3 and show some of them in the following listing. prev = q t * = z2 / i q += t i f q &lt;= prev return ( e ? 0 . 5 + q : 0 . 5 − q ) end end e ? 1 . 0 : 0 . 0 end cdf01 ( ( $self−$m ) / $s ) ]]&gt; &lt;/body&gt; &lt;/operation&gt;</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>VII. CONCLUSIONS</head><p>In this paper we have introduced a simple extension of OCL to deal with random numbers and probability distributions in OCL specifications. It uses the USE extension mechanisms to implement the new operations, employing the underlying Ruby implementation and some of its supported functions. All files and operations described here can be downloaded from https://www.dropbox.com/s/ 2j9tgejbj507id0/oclextensions.zip?dl=0. To our knowledge, the only similar proposal is <ref type="bibr" target="#b5">[6]</ref>, a modelling framework for the predictive analysis of architectural properties.</p><p>Counting on these new operations offers interesting benefits to model developers and testers. For example, they are now able to capture some assumptions of the real world that correspond to stochastic events, or for which there is little information. We are also able to generate random sets of models, and models with random values in their elements' attributes, thus permitting richer input test suites for achieving model-based testing.</p><p>Our current plans for extensions of this work include the experimentation with larger case studies, in order to analyze the applicability and expressiveness of our approach, and the addition of further probability distributions that could be required in other situations.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head></head><label></label><figDesc>p o s t : self−&gt;includes ( result ) III. SPECIFYING RANDOM NUMBERS IN OCL Random numbers are generated by extending OCL type Real with an operation called rand(). If x.oclIsOfType(Real) then x.rand() returns a random Real number between 0 and x. c o n t e x t Real : : rand ( ) : Real p o s t indeterminism : i f self &gt; 0 . 0 t h e n ( 0 . 0 &lt;= result ) and ( result &lt; self ) e l s e i f self &lt; 0 . 0 t h e n ( result &lt;= 0 . 0 ) and ( self &lt; result ) e l s e / * self = 0 . 0 * / result = self e n d i f e n d i f For example 1.rand() returns a random number in the interval [0..1). If you need a number in the interval [a..b) you can use the expression "a + (b-a).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>use&gt; ? 1 .</head><label>1</label><figDesc>Real use&gt; ? 2 . rand ( ) −&gt; 1 . 8 3 7 1 3 9 7 3 6 4 7 9 4 9 1 2 : Real use&gt; ? 2 . rand ( ) −&gt; 0 . 6 6 4 6 4 0 1 4 7 2 3 0 2 7 1 2 : Real use&gt; ? 2 . rand ( ) −&gt; 1 . 5 4 1 7 6 4 9 5 1 0 7 8 0 3 3 4 : Real use&gt; ? 2 . rand ( ) −&gt; 0 . 9 9 0 2 1 2 3 3 3 6 3 9 1 6 7 : Real use&gt; ? 2 . rand ( ) Real use&gt; ? 1 . srand ( ) −&gt; 32783 : I n t e g e r use&gt; ? 1 . srand ( ) −&gt; 1 : I n t e g e r use&gt; ? 0 . srand ( ) −&gt; 1 : I n t e g e r use&gt; ? 0 . srand ( ) −&gt; 2297549 : I n t e g e r use&gt; ? 0 . srand ( ) −&gt; 3220924 : I n t e g e r use&gt; ? 0 . srand ( ) −&gt; 3666729 : I n t e g e r</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Fig. 1 .</head><label>1</label><figDesc>Fig. 1. Class diagram for the production system.</figDesc><graphic coords="3,48.96,50.54,251.06,96.31" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>•</head><label></label><figDesc>x.cdf01() returns a value of the cumulative distribution function CDF (x) of a Gaussian Distribution N (0, 1), • x.cdf(m,s) returns a value of the cumulative distribution function CDF (x) of a N (m, s), and • x.expDistr() returns a value of an exponential distribution with mean x, i.e., Exp(1/x), or 0.0 if x=0.0.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Fig. 2 .</head><label>2</label><figDesc>Fig. 2. Object diagram after producing three items.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Fig. 3 .</head><label>3</label><figDesc>Fig. 3. Class diagram for the Social Network.</figDesc><graphic coords="4,86.62,50.54,175.74,121.46" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Fig. 4 .</head><label>4</label><figDesc>Fig. 4. Object diagrams with random links.</figDesc><graphic coords="4,48.96,206.36,251.06,248.13" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head></head><label></label><figDesc>&lt;operation source=" Real " name="rand" returnType=" Real"&gt; &lt;body&gt;&lt;![CDATA [ $self * Random . rand ]]&gt; &lt;/body&gt; &lt;/operation&gt; &lt;operation source=" I n t e g e r " name="srand" returnType=" I n t e g e r "&gt; &lt;body&gt;&lt;![CDATA [ i f $self &gt; 0 return Random . srand ( $self ) % 1000000 e l s e return Random . srand ( ) % 10000000 end ]]&gt; &lt;/body&gt; &lt;/operation&gt;</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_8"><head></head><label></label><figDesc>&lt;operation source=" Real " name="expDistr" returnType=" Real"&gt; &lt;body&gt;&lt;![CDATA [ i f $self ! = 0 return $self * ( 6 . 9 0 7 7 5 5 3 − Math . log ( Random . rand ( 1 &lt;operation source=" Real " name="normalDistr" returnType=" →Real"&gt; &lt;parameter&gt; &lt;par name="s" type=" Real " /&gt; &lt;/parameter&gt; &lt;body&gt;&lt;![CDATA [ return $self + ( $s * Math . sqrt( −2.0 * Math . log ( Random . rand ) ) * Math . cos ( 6 . 2 8 3 1 8 5 3 0 7 * Random . rand ) ) ]]&gt; &lt;/body&gt; &lt;/operation&gt; &lt;operation source=" Real " name="pdf" returnType=" Real"&gt; &lt;parameter&gt; &lt;par name="m" type=" Real " /&gt; &lt;par name="s" type=" Real " /&gt; &lt;/parameter&gt; &lt;body&gt;&lt;![CDATA [ ( 1 . 0 / ( Math . sqrt ( 2 * Math : : PI ) ) ) * Math : : exp ( − ( ( ( ( $self−$m ) / $s ) * * 2) / 2 . 0 ) ) / $s ]]&gt; &lt;/body&gt; &lt;/operation&gt; &lt;operation source=" Real " name="cdf" returnType=" Real"&gt; &lt;parameter&gt; &lt;par name="m" type=" Real " /&gt; &lt;par name="s" type=" Real " /&gt; &lt;/parameter&gt; &lt;body&gt;&lt;![CDATA [ # Distribution . Normal . cdf ( ( $self−$m ) / $s ) def cdf01 ( z ) 0 . 0 i f z &lt; −12 1 . 0 i f z &gt; 12 0 . 5 i f z == 0 . 0 i f z &gt; 0 . 0 e = true e l s e e = false z = −z end z = z . to_f z2 = z * z t = q = z * Math . exp( −0.5 * z2 ) / ( Math . sqrt ( 2 * Math : : →PI ) ) 3 . step ( 1 9 9 , 2 ) do | i |</figDesc></figure>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Acknowledgments. This work was supported by Research Project TIN2014-52034-R.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Non-deterministic Constructs in OCL: What Does any() Mean</title>
		<author>
			<persName><forename type="first">T</forename><surname>Baar</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. 12th Int. SDL Forum, LNCS</title>
				<meeting>12th Int. SDL Forum, LNCS</meeting>
		<imprint>
			<date type="published" when="2005">2005</date>
			<biblScope unit="volume">3530</biblScope>
			<biblScope unit="page" from="32" to="46" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Workshop in ocl and textual modelling. report on recent trends and panel discussions</title>
		<author>
			<persName><forename type="first">Robert</forename><surname>Bill</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Achim</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jordi</forename><surname>Brucker</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Martin</forename><surname>Cabot</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Antonio</forename><surname>Gogolla</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Edward</forename><forename type="middle">D</forename><surname>Vallecillo</surname></persName>
		</author>
		<author>
			<persName><surname>Willink</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. of STAF 2017 Satellite Events</title>
				<meeting>of STAF 2017 Satellite Events</meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2017">2017</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<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">Proc. FASE&apos;08</title>
				<meeting>FASE&apos;08</meeting>
		<imprint>
			<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="b3">
	<analytic>
		<title level="a" type="main">USE: A UML-based specification environment for validating UML and OCL</title>
		<author>
			<persName><forename type="first">M</forename><surname>Gogolla</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Büttner</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Richters</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Science of Computer Programming</title>
		<imprint>
			<biblScope unit="volume">69</biblScope>
			<biblScope unit="page" from="27" to="34" />
			<date type="published" when="2007">2007</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Model Validation and Verification Options in a Contemporary UML and OCL Analysis Tool</title>
		<author>
			<persName><forename type="first">M</forename><surname>Gogolla</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Hilken</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. Modellierung&apos;2016</title>
				<meeting>Modellierung&apos;2016</meeting>
		<imprint>
			<date type="published" when="2016">2016</date>
			<biblScope unit="volume">254</biblScope>
			<biblScope unit="page" from="203" to="218" />
		</imprint>
	</monogr>
	<note>GI</note>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<author>
			<persName><forename type="first">Pontus</forename><surname>Johnson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Johan</forename><surname>Ullberg</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Markus</forename><surname>Buschle</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ulrik</forename><surname>Franke</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Khurram</forename><surname>Shahzad</surname></persName>
		</author>
		<title level="m">P2AMF: Predictive, Probabilistic Architecture Modeling Framework</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2013">2013</date>
			<biblScope unit="page" from="104" to="117" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Randomness and random sampling numbers</title>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">G</forename><surname>Kendall</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><forename type="middle">Babington</forename><surname>Smith</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Journal of the Royal Statistical Society</title>
		<imprint>
			<biblScope unit="volume">101</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="147" to="166" />
			<date type="published" when="1938">1938</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<monogr>
		<title level="m" type="main">Object Constraint Language (OCL), version 2.4. Object Management Group</title>
		<author>
			<persName><surname>Omg</surname></persName>
		</author>
		<idno>OMG formal/2014-02-03</idno>
		<imprint>
			<date type="published" when="2014-12">December 2014</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<monogr>
		<author>
			<persName><forename type="first">D</forename><surname>Thomas</surname></persName>
		</author>
		<title level="m">Programming Ruby 1.9 &amp; 2.0. Pragmatic Bookshelf</title>
				<imprint>
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
	<note>4 edition</note>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<title level="m" type="main">The Object Constraint Language: Getting Your Models Ready for MDA</title>
		<author>
			<persName><forename type="first">J</forename><surname>Warmer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Kleppe</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2004">2004</date>
			<publisher>Addison-Wesley</publisher>
		</imprint>
	</monogr>
	<note>2nd Edition</note>
</biblStruct>

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