﻿<?xml-stylesheet type="text/xsl" href="../../templates/doc.xsl"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<html 
	xmlns="http://www.w3.org/1999/xhtml" 
	xmlns:doc="http://www.lepus.org.uk/doc" 
	xmlns:classz="http://www.lepus.org.uk/classz" 
	xmlns:fopl="http://www.lepus.org.uk/fopl" 
	xml:lang="EN-GB" 
	xmlns:v="urn:schemas-microsoft-com:vml" 
	xmlns:o="urn:schemas-microsoft-com:office:office">

<head>
	<title>LePUS3 and Class-Z Reference manual</title>
	<link rel="stylesheet" type="text/css" href="http://www.lepus.org.uk/templates/doc.css" />
	<meta http-equiv="Content-Style-Type" content="text/css" />
	<meta name="Author" content="Amnon H Eden" />
</head>

<body>

<doc:glossary />



<p class="pagetitle">LePUS3 and Class-Z Reference Manual</p>

<p class="subtitle">Technical Report CSM-474, ISSN 1744-8050</p>

<p><a href="refman.pdf" style="border:0px">
	<img alt="Print this document" src="../../site/print.gif" /></a></p>

<p class="author"> 
	<a href="http://www.eden-study.org/">Amnon H Eden</a>, 
	Epameinondas Gasparis, 
	<a href="http://www.nicholsonweb.co.uk/">Jonathan Nicholson</a><br /> 
	Department of Computer Science, University of Essex, United Kingdom </p>
<p class="author"> 
	31 December 2007 
	(Minor revisions: 
		8 July 2008, 
		2 Oct. 2009<!-- Codechart term -->) 
</p>



<h3>Abstract</h3>

<div class="abstract">

	<p>This document formally defines the elements in the syntax and the 
		semantics of LePUS3 and the Class-Z specification languages. It was designed 
		to satisfy the rigid requirements of mathematical logic, and it is therefore 
		unsuitable for learning LePUS3 and Class-Z. To learn LePUS3 and Class-Z please 
		see the <a href="../lepus3-tutorial.pdf">Tutorial</a>. To learn about the 
		background and motivation see the
		<a href="../../about.xml">About </a>page. A
		<a href="http://www.lepus.org.uk/ref/legend/legend.xml">legend</a> offering a key to the language's 
		symbols is also available.
	</p>
</div>  <!-- end abstract -->

<doc:toc />

<div class="abstract">

<p>Related links:</p>

	<ul>
		<li><a href="../../about.xml"><strong>About</strong> LePUS3 and Class-Z</a></li>
		<li><a href="../lepus3-tutorial.pdf"><strong>Tutorial</strong>: Object-Oriented Modelling with LePUS3 and Class-Z</a> [<a href="../lepus3-tutorial.pdf">.pdf</a>][<a href="../lepus3-tutorial.ppt">.ppt</a>]</li>
		<li><a href="http://www.lepus.org.uk/ref/legend/legend.xml"><strong>Legend</strong>: Key to LePUS3 and Class-Z Symbols</a> [<a href="http://www.lepus.org.uk/ref/legend/legend.pdf">.pdf</a>]</li>
		<li><strong>Verification </strong>of LePUS3/Class-Z Specifications: Sample models and Abstract Semantics for Java 1.4 [<a href="http://www.lepus.org.uk/ref/verif/verif.pdf">.pdf</a>] [Nicholson et al. 2007]
			<ul>
				<li><a href="http://www.lepus.org.uk/ref/verif/1java_as.xml">Part I: Abstract Semantics for Java 1.4 Programs</a></li>
				<li><a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml">Part II: Sample Models</a></li>
			</ul>
		</li>
	</ul>

</div> 

<h1>Introduction</h1>

<p>LePUS3 and Class-Z are object-oriented Design Description Languages, 
	meaning that they are formal specification and modelling languages for 
	object-oriented design which were tailored to allow 
	<a target="_blank" href="http://ttp.essex.ac.uk">tool support in software 
	modelling, specification, verification, and visualization</a>. 
</p>

<p>LePUS3 and Class-Z are the product of the collaborative 
	effort of the authors, based on revisions to the 
	LanguagE for Patterns Uniform Specification&mdash;LePUS [Eden 2001].	Class-Z and LePUS3 are equivalent: Every specification in LePUS3 is equivalent to one 
	encoded in Class-Z and vice versa, the difference
	being that LePUS3 is a visual language (a specification in LePUS3 is called a 
	<a href="#Codechart">Codechart</a>) while Class-Z is a symbolic language which borrows 
	the <a href="#Schema">schema</a> notation from the Z specification language [<a href="http://www.lepus.org.uk/ref/#Bibliography">Spivey 
	1992</a>].
</p>

<p>For more information about LePUS3 and Class-Z please visit: <a href="http://www.lepus.org.uk/about.xml">www.lepus.org.uk/about.xml</a>.</p>
	
<h2>The metalanguage</h2>

<p> LePUS3 and Class-Z are defined using classical predicate calculus. 
	It is also easy to show that the both LePUS3 and Class-Z are proper subsets 
	of first-order predicate calculus (see <a href="#subsetsfopl">proposition 1</a>). We 
	use the standard language of mathematical logic in defining the semantics of 
	LePUS3 and Class-Z, 
	including model theory, predicate calculus, and elementary set theory. Among others, we use the following symbols which carry their usual meanings: 
</p>
  	
<table class="symbols">
	<tr>
		<th>Symbol</th>
		<th>Meaning</th>
	</tr>
	<tr>
		<td>iff</td>
		<td>if and only if</td>
	</tr>
	<tr>
		<td>
			<fopl:definedas />
		</td>
		<td>Is defined as</td>
	</tr>
	<tr>
		<td>
			<fopl:isin />
		</td>
		<td>Set membership</td>
	</tr>
	<tr>
		<td>
			<fopl:union />
		</td>
		<td>Set union</td>
	</tr>
</table>

<p> The <a href="#Axioms">Axioms of Class-Based Programs</a> 
	have also been transcribed to formulas in FOPL, using the quantifiers 
	<fopl:row>
		<fopl:forall /> 
	</fopl:row>
	(Forall),
	<fopl:row>
		<fopl:exists /> 
	</fopl:row>
	(Exists), and the connectives
	<fopl:row>
		<fopl:and />
	</fopl:row>
	(And),
	<fopl:row>
		<fopl:or />
	</fopl:row>
	(Or),
	<fopl:row>
		<fopl:implies />
	</fopl:row>
	(implies) with their usual meanings.</p>
<p> In addition, we define the following notations to be used in our metalanguage: </p>

<div class="definition"> 
	Given a set 
	<fopl:row>
		<classz:variable value="T" />
	</fopl:row>
	, the <a class="termdef" name="powerset">power set</a>&nbsp;
	<fopl:row>
		<fopl:powerset />
		<classz:variable value="T" /> 
	</fopl:row>
	is the set of all subsets of 
	<fopl:row>
		<classz:variable value="T" /> . 
	</fopl:row>
</div>

<div class="sample_text"> 
	For example, the power set of the set 
	<fopl:row>
		<fopl:set>
			<fopl:entity value="a" />
			<fopl:entity value="b" />
		</fopl:set> 
	</fopl:row>
	is a set of four elements as follows: 
	<fopl:row>
		<fopl:powerset />
		<fopl:set>
			<fopl:entity value="a" />
			<fopl:entity value="b" />
		</fopl:set>
		<fopl:equals />
		<fopl:set>
			<fopl:set />
			<fopl:set>
				<fopl:entity value="a" />
			</fopl:set>
			<fopl:set>
				<fopl:entity value="b" />
			</fopl:set>
			<fopl:set>
				<fopl:entity value="a" />
				<fopl:entity value="b" />
			</fopl:set>
		</fopl:set>
	</fopl:row>
</div>

<div class="definition">
	Given a <a href="#Binary_relation">binary relation</a> 
	<fopl:row>
		<fopl:relation value="Relation" />, 
	</fopl:row>
	the <a class="termdef" name="transitive_closure">transitive closure</a> of 
	<fopl:row>
		<fopl:relation value="Relation" />
	</fopl:row>
	, written 
	<fopl:row>
		<fopl:relation value="Relation" transitive="yes" />
	</fopl:row>
	, consists of those pairs 
	<fopl:row>
		<fopl:tuple>
		  	<fopl:entity value="x" />
		  	<fopl:entity value="y" />
		</fopl:tuple> 
	</fopl:row>
	such that either one of the following holds:
	<ol>
		<li>
			<fopl:row>
				<fopl:tuple>
					<fopl:entity value="x" />
					<fopl:entity value="y" />
				</fopl:tuple>
				<fopl:isin />
				<fopl:relation value="Relation" />
			</fopl:row>
			, or 
		</li>
		<li> 
			there exists an entity <fopl:entity value="z" /> such that 
			<fopl:row>
				<fopl:tuple>
					<fopl:entity value="x" />
					<fopl:entity value="z" />
				</fopl:tuple>
				<fopl:isin />
				<fopl:relation value="Relation" /> 
			</fopl:row>
			and 
			<fopl:row>
				<fopl:tuple>
					<fopl:entity value="z" />
					<fopl:entity value="y" />
				</fopl:tuple>
				<fopl:isin />
				<fopl:relation value="Relation" transitive="yes" />
			</fopl:row>
		</li>
	</ol>
</div>

<div class="sample_text"> 
	<p>For example, since class <code>Vector</code> does NOT inherit directly from 
		(extends or implements) class <code>Object</code>, it would be false to require that</p>
	<center>
		<fopl:formula>
			<fopl:tuple>
				<fopl:entity value="vector" />
				<fopl:entity value="object" />
			</fopl:tuple>
			<fopl:isin />
			<fopl:relation value="Inherit" />
		</fopl:formula>
	</center>
	<p>However, <code>Vector</code> does inherit INDIRECTLY from 
		<code>Object</code> directly, so we require that</p>
	<center>
		<fopl:formula>
			<fopl:tuple>
				<fopl:entity value="vector" />
				<fopl:entity value="object" />
			</fopl:tuple>
			<fopl:isin />
			<fopl:relation value="Inherit" transitive="yes" />
		</fopl:formula>
	</center>
</div>

<p> If you are unfamiliar with mathematical logic or with these symbols we recommend you 
	consult any introductory book on elementary logic and set theory such as 
	[Huth &amp; Ryan 2000].</p>
	


<h1>Semantics</h1>

<p> The semantics of LePUS3 and Class-Z consist of an abstract representation of programs in 
	class-based object-oriented programming languages such as Java, C++, and 
	Smalltalk. The picture our semantics provides, a <a href="#Design_model">design model</a>, is called the 
	<a name="abstractsemantics" class="termdef">abstract semantics</a>
	of the program. This simplified representation consists of atomic primitives 
('<a href="#Entity_of_dimension_0">entities of dimension 0</a>') and sets 
thereof (<a href="#Entity_of_dimension_1">entities of dimension 1</a>), as well 
as <a href="#Relations">relations</a> between the primitive entities.</p>



<h2>Entities</h2>

<p>Entities represent elements of the abstract semantics of a program: 
	classes, methods, method signatures, and sets of these entities.</p>
	
<p>Each entity has a <a name="dimension" class="termdef">dimension</a>. 
	We shall be primarily concerned with entities of dimension 0 or 1. 
	An <a name="Entity_of_dimension_0" class="termdef">entity of dimension 0</a>
	is an atomic primitive (representing either a class, a method, 
	or a method signature in the program), 
	and an <a name="Entity_of_dimension_1" class="termdef">entity of dimension 1</a>
	is a non-empty, finite set of entities of dimension 0.
	More generally, a non-empty, finite set of entities of dimension 
	<fopl:row>
		<classz:variable value="d" /> 
	</fopl:row>
	is an entity of dimension 
	<fopl:row>
	  	<classz:variable value="d" />
	  	<fopl:plus />
	  	<fopl:variable value="1" />. 
	</fopl:row>
	An entity of dimension 
	<fopl:row>
		<classz:variable value="d" />
		<fopl:greaterthan />
		<fopl:variable value="0" /> 
	</fopl:row>
	is called a 
	<a name="highdimentity" class="termdef">higher-dimensional entity</a>. </p>

<p>Entity names are written in underlined fixed-size typeface, where lower case names 
(e.g.,
	<fopl:row>
		<fopl:entity value="object" />
	</fopl:row>
	,
	<fopl:row>
		<fopl:entity value="collection" />
	</fopl:row>
	) are reserved for entities of dimension 0, 
	and capitalized names (e.g.,
	<fopl:row>
		<fopl:entity value="Objects" />
	</fopl:row>
	,
	<fopl:row>
		<fopl:entity value="Collections" />
	</fopl:row>
	) are reserved for entities of dimension 1.
</p>

<div class="definition">
	A <a name="Class_of_dimension_0" class="termdef">class of dimension 0</a> 
	is an atomic primitive in the <a href="#Unary_relation">unary relation</a>
	<fopl:row>
		<fopl:relation value="Class" />
	</fopl:row>
	. A <a name="class_of_dimension_1" class="termdef">class of dimension 1</a> 
	is a non-empty, finite set of classes of dimension 0.
</div>

<p> In the abstract semantics of Java, classes of dimension 0 represent classes, 
	interfaces, and primitive types (e.g. <code>int</code>, <code>char</code>, etc.) 
	in the program. </p>

<div class="sample_text">
	<p> For example, 
		<fopl:row>
			<fopl:entity value="object" /> 
		</fopl:row>
		is a class of dimension 0 which represents the class <code>java.lang.Object</code> 
		in the abstract semantics of Java programs. </p>

	<p> For example, 
		<fopl:row>
			<fopl:entity value="int" /> 
		</fopl:row>
		is a class of dimension 0 which represents the primitive type <code>int</code> 
		in the abstract semantics of Java and C++ programs. </p>
	
	<p> For example, 
		<fopl:row>
			<fopl:entity value="collection" /> 
		</fopl:row>
		is a class of dimension 0 which represents the interface <code>java.util.Collection</code> 
		in the abstract semantics of Java 1.4. </p>
		
	<p> For example, the set 
		<fopl:row>
			<fopl:set>
				<fopl:entity value="object" />
				<fopl:entity value="int" />
				<fopl:entity value="collection" />
			</fopl:set> 
		</fopl:row>
		is a class of dimension 1 in the abstract semantics of a Java 1.4 program.</p>
	
	<p> Also, the <a href="#Unary_relation">unary relation</a>
		<fopl:row>
			<fopl:relation value="Class" /> 
		</fopl:row>
		is itself also a class of dimension 1.</p>
	<p> See more classes of dimension 0 in
	<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example1">Example 1</a> 
		in [Nicholson et al. 2007, Part I]</p>
</div>

 <div class="definition"> 
 	A <a href="#class_of_dimension_1">class of dimension 1</a>&nbsp;
 	<fopl:entity value="Hrc" /> 
 	is also a <a name="hierarchy_of_dimension_1" class="termdef">hierarchy of dimension 1</a> 
 	iff it satisfies the following conditions:
	<ol>
		<li>
			<fopl:row>
				<fopl:entity value="Hrc" /> 
			</fopl:row>
			contains at least two <a href="#Class_of_dimension_0">classes of dimension 0</a>
		</li>
		<li>There exists 
			<fopl:row>
				<fopl:entity value="root" /> 
			</fopl:row>
			a <a href="#Class_of_dimension_0">class of dimension 0</a> 
			in 
			<fopl:row>
				<fopl:entity value="Hrc" /> 
			</fopl:row>
			such that for any other class 
			<fopl:row>
				<fopl:entity value="cls" /> 
			</fopl:row>
			in 
			<fopl:row>
				<fopl:entity value="Hrc" />
			</fopl:row>
			: 
			<fopl:row>
				<fopl:tuple>
					<fopl:entity value="cls" />
					<fopl:entity value="root" />
				</fopl:tuple>
				<fopl:isin />
				<fopl:relation value="Inherit" transitive="yes" />
			</fopl:row>
		</li>
	</ol>
</div>

<p> A &#39;hierarchy&#39; is therefore a set of classes which includes one 
	&#39;root&#39; class such that all other classes inherit (possibly indirectly) 
	from it. </p>

<div class="sample_text"> 
	<p>For example, any set of two or more classes in Java which includes 
		<code>java.lang.Object</code> is a hierarchy.</p>
	<p> See more hierarchies in <a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example2">Example 2</a> in 
		[Nicholson et al. 2007, Part II].</p>
</div>

<div class="definition">
	A 
	<a name="Signature_of_dimension_0" class="termdef">signature of dimension 0</a> 
	is an atomic primitive in the 
	<a href="#Unary_relation">unary relation</a> 
	<fopl:row>
		<fopl:relation value="Signature" />
	</fopl:row>
	.  A <a name="Signature_of_dimension_1" class="termdef">signature of dimension 1</a> 
	is a non-empty, finite set of signatures of dimension 0.
</div>

<p>Signatures are abstractions of method name and argument types. </p>

<div class="sample_text">
	<p>
		For example, the abstract semantics of the <code>java.util</code> 
		package shall contain one signature of dimension 0: &quot;<code>size()</code>&quot; 
		which represents the signature of both methods <code>ArrayList.size()</code> and <code>
		LinkedList.size()</code>.</p>
	<p>
		For example, the abstract semantics of the <code>java.util</code> 
		package shall contain one signature of dimension 0: &quot;<code>add(Object)</code>&quot; 
		which represents the 
		signature of both methods <code>ArrayList.add(Object)</code> and <code>
		LinkedList.add(Object)</code>.</p>
	<p>
		For example, if 
		<fopl:row>
			<fopl:entity value="size" /> 
		</fopl:row>
		and 
		<fopl:row>
			<fopl:entity value="add" /> 
		</fopl:row>
		are signatures of dimension 0 then 
		<fopl:row>
			<fopl:set> 
				<fopl:entity value="size" /> 
				<fopl:entity value="add" /> 
			</fopl:set>
		</fopl:row>
		is a signature of dimension 1.
	</p>

	<p> See more signatures in Java in <a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example2">Example 2</a> 
	and <a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example3">Example 3</a> 
		in [Nicholson et al. 2007, Part I].</p>
</div>

<p>Unlike methods, 
	signature entities have a dedicated symbols in LePUS3 and Class-Z (e.g.,
	<a href="#Term_symbols">0-dimensional and 1-dimensional signature constants</a>) 
	whereas method entities have no dedicate symbols for representing them.  Instead,
	we use <a href="#constant_terms">superimpositions</a>, the advantage is that of being 
	able to represent a large set of methods indirectly using a single signature.
</p>

<div class="definition">
	A 
	<a name="Method_of_dimension_0" class="termdef">method of dimension 0</a> 
	is an atomic primitive in the 
	<a href="#Unary_relation">unary relation</a> 
	<fopl:row>
		<fopl:relation value="Method" />
	</fopl:row>
	.  A 
	<a name="Method_of_dimension_1" class="termdef">method of dimension 1</a>
	is a non-empty, finite set of methods of dimension 0.
</div>

<p>Method entities abstract the procedural units of execution in class-based 
	programming languages: 'methods' in Java and Smalltalk, 
	functions and function members in C++.  However Method entities have no
	dedicated symbol in LePUS3 and Class-Z. Instead, method entities are
	represented using the <a href="#Superimpositions">superimposition</a> of signature and class
	symbols, the advantage is that of being 
	able to represent a large set of methods indirectly using a single signature.
</p>

<div class="sample_text">
	<p> See methods of dimension 0 in Java in <a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example2">Example 2</a> 
	and <a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example3">Example 3</a> in [Nicholson et al. 2007, Part I].</p>
</div>



<h2>Relations</h2>

<p>Relations are simply sets of tuples of entities. We 
	distinguish between <a href="#Unary_relation">unary relations</a> and
	<a href="#Binary_relation">binary relations</a> as follows:</p>


<div class="definition">
	A <a name="Unary_relation" class="termdef">unary relation</a> 
	is a set of <a href="#Entity_of_dimension_0">entities of dimension 0</a>.
</div>

<div class="sample_text">
	<p>For example, the unary relation 
		<fopl:row>
			<fopl:relation value="Class" /> 
		</fopl:row>
		contains all the <a href="#Class_of_dimension_0">classes of dimension 0</a> 
		in the abstract semantics of a Java 1.4 program, 
		each of which represents a class, interface, or primitive type. 
		Most commonly, the relation
		<fopl:row>
			<fopl:relation value="Class" /> 
		</fopl:row>
		will contain at least the entities
		<fopl:row>
			<fopl:entity value="object" /> 
		</fopl:row>
		and
		<fopl:row>
			<fopl:entity value="int" /> 
		</fopl:row>
		in the abstract semantics of any Java program.
	</p>

	<p> See the unary relation
		<fopl:relation value="Class" /> 
		in the abstract semantics of a Java program in 
		<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example1">Example 1</a> and
		<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example2">Example 2</a> in 
		[Nicholson et al. 2007, Part I].</p>

	<p>For example, the unary relation 
		<fopl:row>
			<fopl:relation value="Method" /> 
		</fopl:row>
		contains all the <a href="#Method_of_dimension_0">methods of dimension 0</a> 
		in the abstract semantics of a Java or a C++ program, 
		each of which represents a method (in C++: a <em>function</em> or a <em>
	function member</em>).</p>
	
	<p> See the unary relation
		<fopl:relation value="Method" /> 
		in the abstract semantics of a Java program in 
		<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example2">Example 2</a> and 
		<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example3">Example 3</a> in [Nicholson et al. 2007, 
		Part I].</p>

	<p> For example, the unary relation 
		<fopl:row>
			<fopl:relation value="Abstract" /> 
		</fopl:row>
		contains all those <a href="#Class_of_dimension_0">classes of dimension 0</a> 
		and <a href="#Method_of_dimension_0">methods of dimension 0</a> 
		which represent the abstract methods, abstract classes, and the interfaces 
		in the abstract semantics of a Java program. </p>

	<p> See the unary relation
		<fopl:relation value="Abstract" /> 
		in the abstract semantics of a Java program in 
		<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example4">Example 4</a> in [Nicholson et al. 2007, 
	Part I].</p>

</div>

<div class="definition">
	A <a name="Binary_relation" class="termdef">binary relation</a> 
	is a set of pairs of <a href="#Entity_of_dimension_0">entities of dimension 0</a>.
</div>

<div class="sample_text">
	<p> For example, the binary relation 
		<fopl:row>
			<fopl:relation value="Inherit" /> 
		</fopl:row>
		represents the <code>extends</code>, <code>implements</code>, and the subtype 
		relations between Java classes and/or interfaces. For instance, 
		<fopl:row>
			<fopl:relation value="Inherit" /> 
			<fopl:equals /> 
			<fopl:set>
				<fopl:tuple>
					<fopl:entity value="collection" />
					<fopl:entity value="object" />
				</fopl:tuple>
				<fopl:tuple>
					<fopl:entity value="list" />
					<fopl:entity value="collection" />
				</fopl:tuple>
			</fopl:set>
		</fopl:row>
		since the Java interface 
		<code>Collection</code> 
		is a subtype of class 
		<code>Object</code>
		and the interface
		<code>List</code>
		implements the interface
		<code>Collection</code>.</p>

	<p> See the binary relation
		<fopl:relation value="Inherit" /> 
		in the abstract semantics of a Java program in 
		<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example5">Example 5</a> in 
		[Nicholson et al. 2007, Part I].</p>

	<p> For example, the binary relation 
		<fopl:row>
			<fopl:relation value="Member" /> 
		</fopl:row>
		represents the relation between a class containing a field and the class of the 
		contained field in a Java program (in C++: between a class containing a data member 
		and the class/type of the contained member.) </p>

	<p> See the binary relation
		<fopl:relation value="Member" /> 
		in the abstract semantics of a Java program in 
		<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml#example7">Example 7</a> 
		in [Nicholson et al. 2007, Part I].</p>

</div>



<h2>Superimpositions</h2>


<p> In LePUS3 and Class-Z, <a href="#Method_of_dimension_0">methods</a> have no dedicated symbol. Instead,&nbsp; of the form
	superimposition terms of the form
	<fopl:row>
		<fopl:superimposition>
			<fopl:entity value="sig" />
			<fopl:entity value="cls" />
		</fopl:superimposition> 
	</fopl:row>
	represent methods by indicating 
	their signature (
	<fopl:row>
		<fopl:entity value="sig" />
	</fopl:row>
	) and and the class in which they are defined (
	<fopl:row>
		<fopl:entity value="cls" />
	</fopl:row>
	). (C++ global functions are represented as methods that are not members of any 
class, and multiple-dispatch methods in languages such as CLOS can be members of 
more than one class.)</p>

<div class="definition">
	A <a name="0dimsuperimposition" class="termdef">0-dimensional superimposition</a> 
	is an expression of the form
	<fopl:row>
		<fopl:superimposition>
			<fopl:entity value="sig" />
			<fopl:entity value="cls" />
		</fopl:superimposition> 
	</fopl:row>
	, where
	<fopl:row>
		<fopl:entity value="sig" /> 
	</fopl:row>
	is a <a href="#Signature_of_dimension_0">signature of dimension 0</a> and 
	<fopl:row>
		<fopl:entity value="cls" /> 
	</fopl:row>
	is a <a href="#Class_of_dimension_0"> class of dimension 0</a>. The binary operator  
	<fopl:row>
		<fopl:superimposition /> 
	</fopl:row>
	is a partial functional relation, defined as follows:
	<ul>
		<li>
			If there exists 
			<fopl:row>
				<fopl:entity value="mth" /> 
			</fopl:row>
			a <a href="#Method_of_dimension_0">method of dimension 0</a> such that 
			<fopl:row>
				<fopl:tuple>
					<fopl:entity value="sig" />
					<fopl:entity value="mth" />
				</fopl:tuple>
				<fopl:isin />
				<fopl:relation value="SingatureOf" />
			</fopl:row>
			and 
			<fopl:row>
				<fopl:tuple>
					<fopl:entity value="mth" />
					<fopl:entity value="cls" />
				</fopl:tuple>
				<fopl:isin />
				<fopl:relation value="Member" />
			</fopl:row>
			then 
			<fopl:par>
				<fopl:superimposition>
					<fopl:entity value="sig" />
					<fopl:entity value="cls" />
				</fopl:superimposition> 
				<fopl:definedas />
		   		<fopl:entity value="mth" />
			</fopl:par>
		</li>
	
		<li> Otherwise, if there exists exactly one 
			<fopl:row>
				<fopl:entity value="supercls" />
			</fopl:row>
			&nbsp;<a href="#Class_of_dimension_0">class of dimension 0</a> such that 
			<fopl:row>
				<fopl:tuple>
					<fopl:entity value="cls" />
					<fopl:entity value="supercls" />
				</fopl:tuple>
				<fopl:isin />
				<fopl:relation value="Inherit" />
			</fopl:row>
			for which 
			<fopl:row>
				<fopl:superimposition>
					<fopl:entity value="sig" />
					<fopl:entity value="supercls" />
				</fopl:superimposition> 
			</fopl:row>
			is defined and
			<fopl:row>
				<fopl:superimposition>
					<fopl:entity value="sig" />
					<fopl:entity value="supercls" />
				</fopl:superimposition> 
				<fopl:isin />
				<fopl:relation value="Inheritable" />
			</fopl:row>
			then
			<fopl:par>
				<fopl:superimposition>
					<fopl:entity value="sig" />
					<fopl:entity value="cls" />
				</fopl:superimposition> 
				<fopl:definedas />
				<fopl:superimposition>
					<fopl:entity value="sig" />
					<fopl:entity value="supercls" />
				</fopl:superimposition> 
			</fopl:par></li>

		<li>Otherwise the term 
			<fopl:row>
				<fopl:superimposition>
					<fopl:entity value="sig" />
					<fopl:entity value="cls" />
				</fopl:superimposition> 
			</fopl:row>
			is undefined.
		</li>
	</ul>

	<!-- Higher-dimension superimpositions: -->

	Given 
	<fopl:row>
		<fopl:entity value="Signatures" />
		<fopl:equals />
		<fopl:set>
			<fopl:entity value="s" subscript="1" />
			<fopl:ldots />
			<fopl:entity value="s" subscript="n" />
		</fopl:set>
	</fopl:row>
	a <a href="#Signature_of_dimension_1"> signature of dimension 1</a> and 
	<fopl:row>
		<fopl:entity value="Classes" />
		<fopl:equals />
		<fopl:set>
			<fopl:entity value="c" subscript="1" />
			<fopl:ldots />
			<fopl:entity value="c" subscript="k" />
		</fopl:set> 
	</fopl:row>
	a <a href="#class_of_dimension_1"> class of dimension 1</a>, 
	we also define the following 
	<a name="1dimsuperimposition" class="termdef">1-dimensional superimposition</a> 
	expressions:
	<fopl:par>
		<fopl:superimposition>
			<fopl:entity value="sig" />
			<fopl:entity value="Classes" />
		</fopl:superimposition>
		<fopl:definedas />
		<fopl:set>
			<fopl:superimposition>
				<fopl:entity value="sig" />
				<fopl:entity value="c" subscript="1" />
			</fopl:superimposition>
			<fopl:ldots />
			<fopl:superimposition>
				<fopl:entity value="sig" />
				<fopl:entity value="c" subscript="k" />
			</fopl:superimposition>
		</fopl:set>
	</fopl:par>
	<fopl:par>
		<fopl:superimposition>
			<fopl:entity value="Signatures" />
			<fopl:entity value="cls" />
		</fopl:superimposition>
		<fopl:definedas />
		<fopl:set>
			<fopl:superimposition>
				<fopl:entity value="s" subscript="1" />
				<fopl:entity value="cls" />
			</fopl:superimposition>
			<fopl:ldots />
			<fopl:superimposition>
				<fopl:entity value="s" subscript="n" />
				<fopl:entity value="cls" />
			</fopl:superimposition>
		</fopl:set>
	</fopl:par>

	<p>The <a href="#Method_of_dimension_1">method of dimension 1</a>&nbsp;
		<fopl:row>
			<fopl:superimposition>
				<fopl:entity value="sig" />
				<fopl:entity value="Classes" />
			</fopl:superimposition> 
		</fopl:row>
		is called a <a name="clan" class="termdef">clan</a>.</p>
	<p>The <a href="#Method_of_dimension_1">method of dimension 1</a>&nbsp; 
		<fopl:row>
			<fopl:superimposition>
				<fopl:entity value="Signatures" />
				<fopl:entity value="cls" />
			</fopl:superimposition> 
		</fopl:row>
		is called a <a name="tribe" class="termdef">tribe</a>.</p>
</div>
 
<p> In other words, the superimposition 
	<fopl:row>
		<fopl:superimposition>
			<fopl:entity value="sig" />
			<fopl:entity value="cls" />
		</fopl:superimposition> 
	</fopl:row>
	selects the unique method with signature 
	<fopl:row>
		<fopl:entity value="sig" /> 
	</fopl:row>
	that is either defined explicitly in class 
	<fopl:row>
		<fopl:entity value="cls" /> 
	</fopl:row>
	or inherited from exactly one other class. </p>
	
<div class="sample_text"> 
	<p>For example, if 
		<fopl:row>
			<fopl:entity value="size" /> 
		</fopl:row>
		represents the signature of the method <code>ArrayList.size()</code> and
		<fopl:row>
			<fopl:entity value="arrayList" /> 
		</fopl:row>
		represents class <code>ArrayList</code> then the superimposition
		<fopl:row>
			<fopl:superimposition>
				<fopl:entity value="size" /> 
				<fopl:entity value="arrayList" /> 
			</fopl:superimposition>
		</fopl:row>
		represents the method <code>ArrayList.size()</code>.
	</p>
	<p>
		For example, if 
		<fopl:row>
			<fopl:entity value="iterator" /> 
		</fopl:row>
		represents the signature of the method <code>AbstractSequentialList.iterator()</code> and
		<fopl:row>
			<fopl:entity value="linkedList" /> 
		</fopl:row>
		represents class <code>LinkedList</code> then the superimposition
		<fopl:row>
			<fopl:superimposition>
				<fopl:entity value="iterator" /> 
				<fopl:entity value="LinkedList" /> 
			</fopl:superimposition>
		</fopl:row>
		represents method <code>AbstractSequentialList.iterator()</code> 
		which class <code>LinkedList</code> inherits from class
		<code>AbstractSequentialList</code>.
	</p>
	<p>
		For more superimpositions see
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example4">Example 4</a> in [Nicholson et al. 2007, Part 
		II].</p>

</div> <!-- Example -->
	



<h2>Structures</h2>

<p>Our notion of semantics is based on finite structures in model theory. 
	A <a name="finitestructures" class="termdef">finite structure</a> 
	<fopl:row>
		<fopl:structure value="F" />
	</fopl:row>
	is simply a pair
	<fopl:row>
		<fopl:tuple>
			<fopl:type value="U" />
			<fopl:type value="R" />
		</fopl:tuple> 
	</fopl:row>
	such that
	<fopl:row>
		<fopl:type value="U" />
	</fopl:row>
	(also called the universe of
	<fopl:row>
		<fopl:structure value="F" />
	</fopl:row>
	) is a finite set of primitive entities (in our metalanguage: 
	<a href="#Entity_of_dimension_0">entities of dimension 0</a>) and
	<fopl:row>
		<fopl:type value="R" />
	</fopl:row>
	is a set of 
	<a href="#Relations">relations</a>.
	We extend the traditional notion of a finite structure with the 
	notion of a <a href="#Design_model">design model</a> as follows:
	</p>



<div class="definition">
	A <a name="Design_model" class="termdef">design model</a> is a triple 
	<fopl:row>
		<fopl:structure value="M" />
		<fopl:definedas />
		<fopl:tuple>
			<fopl:type value="U" subscript="*" />
			<fopl:type value="R" />
			<fopl:interpretation value="I" />
		</fopl:tuple> 
	</fopl:row>
	such that:
	<ul>
		<li>
			<fopl:row>
				<fopl:type value="U" subscript="*" />
			</fopl:row>
			, called the <a name="universe" class="termdef">universe</a> of 
			<fopl:row>
				<fopl:structure value="M" /> 
			</fopl:row>
			, is a finite set of <a href="#Entities">entities</a> 
			such that 
			<fopl:row>
				<fopl:type value="U" subscript="*" />
				<fopl:definedas />
				<fopl:type value="U" subscript="0" />
				<fopl:union />
				<fopl:type value="U" subscript="1" /> 
			</fopl:row>
			where 
			<fopl:row>
				<fopl:type value="U" subscript="0" /> 
			</fopl:row>
			is a finite set of <a href="#Entity_of_dimension_0">entities of dimension 0</a> and 
			<fopl:row>
				<fopl:type value="U" subscript="1" /> 
			</fopl:row>
			is a finite set of <a href="#Entity_of_dimension_1">entities of dimension 1</a>.
		</li>
		<li>
			<fopl:row>
				<fopl:type value="R" /> 
			</fopl:row>
			is a set of relations, including: 
			<ul>
				<li> The <a href="#Unary_relation">unary relations</a>
					<fopl:row>
						<fopl:relation value="Class" />
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Method" /> 
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Signature" /> 
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Abstract" /> 
					</fopl:row>
					, and
					<fopl:row>
						<fopl:relation value="Inheritable" /> 
					</fopl:row>
				</li>
				<li> The <a href="#Binary_relation">binary relations</a>
					<fopl:row>
						<fopl:relation value="Inherit" /> 
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Member" /> 
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Produce" /> 
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Call" /> 
					</fopl:row>
					,
					<fopl:row>
						<fopl:relation value="Create" /> 
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Forward" /> 
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Return" /> 
					</fopl:row>
					, 
					<fopl:row>
						<fopl:relation value="Aggregate" /> 
					</fopl:row>
					, and
					<fopl:row>
						<fopl:relation value="SignatureOf" />
					</fopl:row>
				</li>
		 	</ul>
		</li>
		<li>
			<fopl:row>
				<fopl:interpretation value="I" /> 
			</fopl:row>
			is an <a name="interpretation" class="termdef">interpretation</a> function 
			which maps some <a href="#constant_terms">constant terms</a> to entities in 
			<fopl:row>
				<fopl:type value="U" subscript="*" /> 
			</fopl:row>
			depending on the type of the term:
			<table class="symbols">
			<tr>
				<th> 
					<fopl:row>
					  	<classz:variable value="t" /> 
					</fopl:row>
				  	is a constant term of type 
				</th>
				<th> If defined,
					<fopl:row>
					  	<fopl:interpretation>
							<classz:variable value="t" />
						</fopl:interpretation> 
					</fopl:row>
					is a 
				</th>
			</tr>
			<tr>
				<td>
					<classz:type value="CLASS" />
				</td>
				<td>
					<a href="#Class_of_dimension_0">class of dimension 0</a>
				</td>
			</tr>
			<tr>
				<td>
					<classz:type value="CLASS" exponent="1" />
				</td>
				<td>
					<a href="#class_of_dimension_1">class of dimension 1</a>
				</td>
			</tr>
			<tr>
				<td>
					<classz:type value="SIGNATURE" />
				</td>
				<td>
					<a href="#Signature_of_dimension_0">signature of dimension 0</a>
				</td>
			</tr>
			<tr>
				<td>
					<classz:type value="SIGNATURE" exponent="1" />
				</td>
				<td>
					<a href="#class_of_dimension_1">signature of dimension 1</a>
				</td>
			</tr>
			<tr>
				<td>
					<classz:type value="METHOD" />
				</td>
				<td>
					<a href="#Method_of_dimension_0">method of dimension 0</a>
				</td>
			</tr>
			<tr>
				<td>
					<classz:type value="METHOD" exponent="1" />
				</td>
				<td>
					<a href="#Method_of_dimension_1">method of dimension 1</a>
				</td>
			</tr>
			<tr>
				<td>
					<classz:type value="HIERARCHY" />
				</td>
				<td>
					<a href="#hierarchy_of_dimension_1">hierarchy of dimension 1</a>
				</td>
			</tr>
			</table> 

			<p>
				For superimposition terms, we define:
				<fopl:par>
					<fopl:interpretation value="I">
						<fopl:superimposition>
							<fopl:variable value="&tau;" subscript="1" />
							<fopl:variable value="&tau;" subscript="2" />
						</fopl:superimposition>
					</fopl:interpretation>
					<fopl:definedas />
					<fopl:superimposition>
						<fopl:interpretation value="I">
								<fopl:variable value="&tau;" subscript="1" />
						</fopl:interpretation>
						<fopl:interpretation value="I">
								<fopl:variable value="&tau;" subscript="1" />
						</fopl:interpretation>
					</fopl:superimposition>
				</fopl:par>
			</p>
			<p>
				If defined then 
				<fopl:row>
					<fopl:interpretation>
						<classz:constant value="&tau;" />
					</fopl:interpretation> 
				</fopl:row>
				is called the interpretation of 
				<classz:constant value="&tau;" /> 
				. 
			</p>
		</li>
		<li>
			<fopl:row>
				<fopl:structure value="M" />
			</fopl:row>
			satisfies the <a href="#Axioms">Axioms of Class-Based Programs</a>. 
		</li>
	</ul>
</div>


<p> Design models supply us with a greatly simplified picture of the program: They abstract 
	the intricate details of the implementation, which are normally buried deep in the 
	source code, and represent them using of primitive entities 
	('<a href="#Entity_of_dimension_0">entities of dimension 0</a>') and 
	<a href="#Relations">relations</a> amongst them. In addition, design models supply 
	us with sets of entities ('<a href="#Entity_of_dimension_1">entities of dimension 1</a>'), 
	which cluster together related classes and related methods. </p>
<p> Our definition of <a href="#Design_model">design models</a> 
	extends naturally to include entities of any finite dimension.</p>

<div class="sample_text">
	<p> See sample design models for Java programs see documents &quot;<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml">Abstract 
		Semantics for Java 1.4 Programs</a>&quot; [Nicholson et al. 2007, Part I] and &quot;<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example4">Sample 
		Models</a>&quot; [Nicholson et al. 2007, 
		Part II].</p>
</div>



<div class="definition"> 
	The following are the 
	<a name="Axioms" class="termdef">Axioms of Class-Based Programs</a>: 

	<p><a name="axiom1sigclass" class="termdef">Axiom 1</a>: 
		No two methods with same signature (method name and argument type) 
		are members of same class: </p>

	<fopl:par>
		<fopl:forall />
		<fopl:entity value="sig" />
		<fopl:isin />
		<fopl:relation value="Signature" />
		&nbsp;
		<fopl:entity value="cls" />
		<fopl:isin />
		<fopl:relation value="Class" /> 
		&nbsp;
		<fopl:entity value="mth" subscript="1" />
		, 
		<fopl:entity value="mth" subscript="2" />
		<fopl:isin />
		<fopl:relation value="Method" />
		<fopl:suchthat />
		<br />
		<fopl:tuple>
			<fopl:entity value="mth" subscript="1" />
			<fopl:entity value="cls" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Member" />
		<fopl:and />
		<fopl:tuple>
			<fopl:entity value="sig" />
			<fopl:entity value="mth" subscript="1" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="SignatureOf" />
		<fopl:and />
		<br />
		<fopl:tuple>
			<fopl:entity value="mth" subscript="2" />
			<fopl:entity value="cls" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Member" />
		<fopl:and />
		<fopl:tuple>
			<fopl:entity value="sig" />
			<fopl:entity value="mth" subscript="2" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="SignatureOf" />
		<fopl:implies />
		<br />
		<fopl:entity value="mth" subscript="1" />
		<fopl:equals />
		<fopl:entity value="mth" subscript="2" />
	</fopl:par>

	<p><a name="axiomacyclic" class="termdef">Axiom 2</a>: 
		There are no cycles in the inheritance graph: </p>

	<fopl:par>
		<fopl:forall />
		<fopl:entity value="cls" subscript="1" /> 
		, 
		<fopl:entity value="cls" subscript="2" />
		<fopl:isin />
		<fopl:relation value="Class" />
		<fopl:suchthat />
		<br />
		<fopl:tuple>
			<fopl:entity value="cls" subscript="1" /> 
			<fopl:entity value="cls" subscript="2" />
		</fopl:tuple>
		<fopl:isnotin />
		<fopl:relation value="Inherit" transitive="yes" />
		<fopl:or />
		<fopl:tuple>
			<fopl:entity value="cls" subscript="2" />
			<fopl:entity value="cls" subscript="1" />
		</fopl:tuple>
		<fopl:isnotin />
		<fopl:relation value="Inherit" transitive="yes" />
	</fopl:par>

	<p><a name="axiom1sigmethod" class="termdef">Axiom 3</a>: 
		Every method has exactly one signature: </p>

	<fopl:par>
		<fopl:forall />
		<fopl:entity value="mth" />
		<fopl:isin />
		<fopl:relation value="Method" />
		&nbsp;
		<fopl:existsonlyone />
		<fopl:entity value="sig" />
		<fopl:isin />
		<fopl:relation value="Signature" />
		<fopl:suchthat />
		<br />
		<fopl:tuple>
			<fopl:entity value="sig" />
			<fopl:entity value="mth" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="SignatureOf" />
	</fopl:par>
	
	<p><a name="axiom1sigmethod" class="termdef">Axiom 4</a>: 
		Some dependencies exist between relations as follows:</p>

	<fopl:par>
		<fopl:forall />
		<fopl:entity value="mth" /> 
		<fopl:isin />
		<fopl:relation value="Method" />
		&nbsp; 
		<fopl:entity value="cls" />
		<fopl:isin />
		<fopl:relation value="Class" />
		<fopl:suchthat />
		<br />
		<fopl:tuple>
			<fopl:entity value="mth" />
			<fopl:entity value="cls" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Produce" />
		<fopl:implies />
		<fopl:tuple>
			<fopl:entity value="mth" />
			<fopl:entity value="cls" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Create" />
		<fopl:and />
		<fopl:tuple>
			<fopl:entity value="mth" />
			<fopl:entity value="cls" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Return" />
	</fopl:par>
	
	<fopl:par>
		<fopl:forall />
		<fopl:entity value="mth" subscript="1" /> 
		, 
		<fopl:entity value="mth" subscript="2" />
		<fopl:isin />
		<fopl:relation value="Method" />
		<fopl:suchthat />
		<br />
		<fopl:tuple>
			<fopl:entity value="mth" subscript="1" />
			<fopl:entity value="mth" subscript="2" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Forward" />
		<fopl:implies />
		<fopl:tuple>
			<fopl:entity value="mth" subscript="1" />
			<fopl:entity value="mth" subscript="2" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Call" />
	</fopl:par>
	
	<fopl:par>
		<fopl:forall />
		<fopl:entity value="cls" subscript="1" /> 
		, 
		<fopl:entity value="cls" subscript="2" />
		<fopl:isin />
		<fopl:relation value="Class" />
		<fopl:suchthat />
		<br />
		<fopl:tuple>
			<fopl:entity value="cls" subscript="1" />
			<fopl:entity value="cls" subscript="2" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Aggregate" />
		<fopl:implies />
		<fopl:tuple>
			<fopl:entity value="cls" subscript="1" />
			<fopl:entity value="cls" subscript="2" />
		</fopl:tuple>
		<fopl:isin />
		<fopl:relation value="Member" />
	</fopl:par>
</div>

<p> The Axioms of Class-Based Programs require that the design model&mdash;the 
	abstract representation of a program&mdash;does not violate some inherent 
	principles of object-oriented programming. </p>




<h1>LePUS3 and Class-Z</h1>

<p> This section is concerned with the actual specification languages. 
	Specifications are spelled out using <a href="#Terms">terms</a>, 
	which stand for <a href="#Entities">entities</a>, 
	and <a href="#Formulas">formulas</a>, 
	which impose constraints on entities. 
</p>


<h2>Terms</h2>

<p> Terms stand for <a href="#Entities">entities</a>. 
	Each term is either a constant or a variable term:
	<a name="constant_terms" class="termdef">Constant terms</a> 
	represent specific entities where, as a general rule, the 
	constant class/signature/hierarchy 
	<classz:constant value="x" /> 
	is assigned to the class/signature/hierarchy entity 
	<fopl:row>
		<fopl:entity value="x" /> 
	</fopl:row>
	, and 
	<a name="variable_terms" class="termdef">variable terms</a> 
	range over entities. Each term has a 
	<a name="type" class="termdef">type</a> 
	and 
	<a class="termdef" name="term_dimension">(term) dimension</a> 
	as specified in the following is a list of 
	symbols for the terms in LePUS3 and Class-Z: 
</p>

<table class="symbols">
<tr>
	<th>Type</th>
	<th>Symbol in LePUS3</th>
	<th>Symbol in Class-Z</th>
	<th>Symbol name</th>
</tr>
<tr>
	<td rowspan="2">
		<classz:type value="CLASS" />
	</td>
	<td>
		<img alt="0_dim class const" src="lepus3/0clsconst.png" /></td>
	<td>
		<classz:constant value="cls" /> 
	</td>
	<td>0-dimensional class constant </td>
</tr>
<tr>
	<td>
		<img alt="0-dimensional class variable" src="lepus3/0clsvar.png" /></td>
	<td>
		<classz:variable value="cls" /> 
	</td>
	<td>0-dimensional class variable </td>
</tr>
<tr>
	<td rowspan="2">
		<classz:type value="CLASS" exponent="1" />
	</td>
	<td>
		<img alt="1-dimensional class constant" src="lepus3/1clsconst.png" /></td>
	<td>
		<classz:constant value="Classes" /> 
	</td>
	<td>1-dimensional class constant </td>
</tr>
<tr>
	<td>
		<img alt="1-dimensional class variable" src="lepus3/1clsvar.png" /></td>
	<td>
		<classz:variable value="Classes" /> 
	</td>
	<td>1-dimensional class variable </td>
</tr>
<tr>
	<td rowspan="2">
		<classz:type value="SIGNATURE" />
	</td>
	<td>
		<img alt="0-dimensional signature constant" src="lepus3/0sigconst.png" /></td>
	<td>
		<classz:constant value="sig" /> 
	</td>
	<td>0-dimensional signature constant </td>
</tr>
<tr>
	<td>
		<img alt="0-dimensional signature variable" src="lepus3/0sigvar.png" /></td>
	<td>
		<classz:variable value="sig" /> 
	</td>
	<td>0-dimensional signature variable </td>
</tr>
<tr>
	<td rowspan="2">
		<classz:type value="SIGNATURE" exponent="1" />
	</td>
	<td>
		<img alt="1-dimensional signature constant" src="lepus3/1sigconst.png" /></td>
	<td>
		<classz:constant value="Signatures" /> 
	</td>
	<td>1-dimensional signature constant </td>
</tr>
<tr>
	<td>
		<img alt="1-dimensional signature variable" src="lepus3/1sigvar.png" /></td>
	<td>
		<classz:variable value="Signatures" /> 
	</td>
	<td>1-dimensional signature variable </td>
</tr>
<tr>
	<td rowspan="2">
		<classz:type value="HIERARCHY" />
	</td>
	<td>
		<img alt="1-dimensional hierarchy constant" src="lepus3/1hieconst.png" /></td>
	<td>
		<classz:constant value="Hrc" /> 
	</td>
	<td>1-dimensional hierarchy constant </td>
</tr>
<tr>
	<td>
		<img alt="1-dimensional hierarchy variable" src="lepus3/1hievar.png" /></td>
	<td>
		<classz:variable value="Hrc" /> 
	</td>
	<td>1-dimensional hierarchy variable </td>
</tr>
<tr>
	<td rowspan="2">
		<classz:type value="METHOD" />
	</td>
	<td><img alt="0-dimensional method constant term" src="lepus3/0mthconst.png" /></td>
	<td>
		<classz:superimposition>
			<classz:constant value="sig" />
			<classz:constant value="cls" />
		</classz:superimposition>
	</td>
	<td>0-dimensional method constant term </td>
</tr>
<tr>
	<td><img alt="0-dimensional method variable terms" src="lepus3/0mthvar.png" /></td>
	<td>
		<classz:superimposition>
			<classz:variable value="sig" />
			<classz:variable value="cls" />
		</classz:superimposition>
	</td>
	<td>0-dimensional method variable terms </td>
</tr>
<tr>
	<td rowspan="6">
		<classz:type value="METHOD" exponent="1" />
	</td>
	<td><img alt="" src="lepus3/Signaturesxcls_const.png" /></td>
	<td>
		<classz:superimposition>
			<classz:constant value="Signatures" />
			<classz:constant value="cls" />
		</classz:superimposition>
	</td>
	<td rowspan="3">
		1-dimensional superimposition (method) constant terms 
	</td>
</tr>
<tr>
	<td><img alt="" src="lepus3/sigxClasses_const.png" /></td>
	<td>
		<classz:superimposition>
			<classz:constant value="sig" />
			<classz:constant value="Classes" />
		</classz:superimposition>
	</td>
</tr>
<tr>
	<td><img alt="Clan of dimension 1" src="lepus3/sigxHrc_const.png" /></td>
	<td>
		<classz:superimposition>
			<classz:constant value="sig" />
			<classz:constant value="Hrc" />
		</classz:superimposition>
	</td>
</tr>
<tr>
	<td><img alt="" src="lepus3/Signaturesxcls_var.png" /></td>
	<td>
		<classz:superimposition>
			<classz:variable value="Signatures" />
			<classz:variable value="cls" />
		</classz:superimposition>
	</td>
	<td rowspan="3">
	1-dimensional superimposition (method) variable terms</td>
</tr>
<tr>
	<td><img alt="" src="lepus3/sigxClasses_var.png" /></td>
	<td>
		<classz:superimposition>
			<classz:variable value="sig" />
			<classz:variable value="Classes" />
		</classz:superimposition>
	</td>
	</tr>
<tr>
	<td><img alt="" src="lepus3/sigsxHrc_var.png" /></td>
	<td>
		<classz:superimposition>
			<classz:constant value="sig" />
			<classz:variable value="Hrc" />
		</classz:superimposition>
	</td>
	</tr>
</table>

<p> The type 
	<classz:type value="HIERARCHY" /> 
	is a subtype of 
	<classz:type value="CLASS" exponent="1" /> 
	; in other words, every term of type 
	<classz:type value="HIERARCHY" /> 
	is also a term of type 
	<classz:type value="CLASS" exponent="1" /> 
	. Note that superimpositions can also mix variables with constants, in which 
	case they yield a method variable of the respective dimension and type.</p>


<div class="sample_text">
	<p> For sample terms and their semantics see the examples in 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#Terms">§1: Terms</a> 
		in [Nicholson et al. 2007, Part II].</p>
</div>



<h2>Relation and predicate symbols</h2>

<p> For each <a href="#Relations">relation</a>
	<fopl:relation value="Relation" /> 
	we assign the relation symbol 
	<classz:relationsymbol value="Relation" /> 
	. The symbol 
	<classz:relationsymbol value="Relation" transitive="yes" /> 
	is assigned to the <a href="#transitive_closure">transitive closure</a> of binary relation
	<fopl:row>
		<fopl:relation value="Relation" /> 
	</fopl:row>
	. The following relation and predicate symbols are admitted: </p>

<table class="symbols">
<tr>
	<th>Symbol in LePUS3</th>
	<th>Symbol in Class-Z</th>
	<th>symbol name</th>
</tr>
<tr>
	<td><img alt="" src="lepus3/unrel.png" /></td>
	<td>
		<classz:relationsymbol value="UnaryRelation" />
	</td>
	<td>Unary relation symbols</td>
</tr>
<tr>
	<td><img alt="" src="lepus3/birel.png" /></td>
	<td>
		<classz:relationsymbol value="BinaryRelation" />
   </td>
	<td>Binary relation symbols</td>
</tr>
<tr>
	<td><img alt="" src="lepus3/tranbirel.png" /></td>
	<td>
		<classz:relationsymbol value="BinaryRelation" transitive="yes" />
	</td>
	<td>Transitive binary relation symbol</td>
</tr>
<tr>
	<td><img alt="" src="lepus3/allpred.png" /></td>	
	<td>
		<classz:predicatesymbol value="ALL" />
	</td>
	<td>ALL predicate symbol</td>
</tr>
<tr>
	<td><img alt="" src="lepus3/totalpred.png" /></td>
	<td>
		<classz:predicatesymbol value="TOTAL" />
	</td>
	<td>TOTAL predicate symbol</td>
</tr>
<tr>
	<td><img alt="" src="lepus3/isopred.png" /></td>
	<td>
		<classz:predicatesymbol value="ISOMORPHIC" />
	</td>
	<td>ISOMORPHIC predicate symbol</td>
</tr>
</table>



<h2>Formulas</h2>

<p> Well-formed formulas, or in short formulas, employ 
	<a href="#Relation%20and%20predicate%20symbols">predicate symbols</a>, 
	<a href="#Relation%20and%20predicate%20symbols">relation symbols</a>, and 
	<a href="#Terms">terms</a> to specify constraints on the <a href="#Entities">entities</a> 
	and <a href="#Relations">relations</a> represented by these symbols.</p>

<div class="definition">
	<p> Let 
  		<classz:relationsymbol value="UnaryRelation" /> 
  		be a unary relation symbol, 
  		<classz:relationsymbol value="BinaryRelation" /> 
  		a binary (possibly transitive) relation symbol, 
  		<classz:variable value="t" subscript="1" /> 
  		and 
  		<classz:variable value="t" subscript="2" /> 
  		terms of dimension 0. Then the following are 
  		<a name="ground_formulas" class="termdef">ground formulas</a>: </p>

	<table class="symbols">
	<tr>
		<th>
			Ground formulas in Class-Z
		</th>
		<th>
			Ground formulas in LePUS3  
		</th>
	</tr>
	<tr>
		<td>
			<classz:formula>
				<classz:relationsymbol value="UnaryRelation" />
				<classz:variable value="t" subscript="1" />
			</classz:formula>
		</td>
		<td> A <a href="#Term_symbols">unary relation symbol</a> 
			placed over the term 
			<classz:variable value="t" subscript="1" />
		</td>
	</tr>
	<tr>
		<td>
			<classz:formula>
				<classz:relationsymbol value="BinaryRelation" />
				<classz:variable value="t" subscript="1" />
				<classz:variable value="t" subscript="2" />
			</classz:formula>
		</td>
		<td> A <a href="#Term_symbols">binary relation symbol</a> 
			connecting the term 
			<classz:variable value="t" subscript="1" /> 
			to the term 
			<classz:variable value="t" subscript="1" />
		</td>
	</tr>
	</table>

	<p> Let 
  		<classz:variable value="&tau;" subscript="1" /> 
  		and 
  		<classz:variable value="&tau;" subscript="2" /> 
  		be terms, 
  		<classz:variable value="T" subscript="1" /> 
  		and 
  		<classz:variable value="T" subscript="2" /> 
  		terms of dimension 1. 
		Then the following are called 
		<a name="pradicate_formulas" class="termdef">predicate formulas</a>: </p>

	<table class="symbols">
	<tr>
		<th>
			Predicate formulas in Class-Z
		</th>
		<th>
			Predicate formulas in LePUS3
		</th>
	</tr>
	<tr>
		<td>
			<classz:formula>
				<classz:predicatesymbol value="ALL" />
				<classz:relationsymbol value="UnaryRelation" />
				<classz:variable value="T" subscript="1" />
			</classz:formula>
		</td>
		<td> An <a href="#Term_symbols">ALL predicate symbol</a> marked with 
			<classz:relationsymbol value="UnaryRelation" /> 
			placed over 
			<classz:variable value="T" subscript="1" />
		</td>
	</tr>
	<tr>
		<td>
			<classz:formula>
				<classz:predicatesymbol value="TOTAL" />
				<classz:relationsymbol value="BinaryRelation" />
				<classz:variable value="&tau;" subscript="1" />
				<classz:variable value="&tau;" subscript="2" />
			</classz:formula>
		</td>
		<td> A <a href="#Relation_and_predicate_symbols">TOTAL predicate symbol</a> marked with 
		  	<classz:relationsymbol value="BinaryRelation" /> 
			connecting 
			<classz:variable value="&tau;" subscript="1" /> 
			to 
			<classz:variable value="&tau;" subscript="2" />
		</td>
	</tr>
	<tr>
		<td>
			<classz:formula>
				<classz:predicatesymbol value="ISOMORPHIC" />
				<classz:relationsymbol value="BinaryRelation" />
				<classz:variable value="T" subscript="1" />
				<classz:variable value="T" subscript="2" />
			</classz:formula>
		</td>
		<td> An <a href="#Relation_and_predicate_symbols">ISOMORPHIC predicate symbol</a> marked with 
		  	<classz:relationsymbol value="BinaryRelation" /> 
		  	connecting 
		  	<classz:variable value="T" subscript="1" /> 
		  	to 
		  	<classz:variable value="T" subscript="2" />
		</td>
	</tr>
	</table>
</div>
<!-- Definition -->


<p> Note that in LePUS3 we do not distinguish between the ground formula 
	<classz:formula>
		<classz:relationsymbol value="BinaryRelation" />
		<classz:variable value="t" subscript="1" />
		<classz:variable value="t" subscript="2" />
	</classz:formula> 
	and the predicate formula 
	<classz:formula>
		<classz:predicatesymbol value="TOTAL" />
		<classz:relationsymbol value="BinaryRelation" />
		<classz:variable value="t" subscript="1" />
		<classz:variable value="t" subscript="2" />
	</classz:formula>
	. Since both formulas are 
	<a href="#total_satis">satisfied under the same conditions</a>, 
	there is no ambiguity here. </p>


<div class="sample_text">
	<p> For sample Class-Z formulas and their semantics see the examples in 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#Ground_formulas">§2: Ground Formulas</a> and
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#Predicate_formulas">§3: Predicate Formulas</a> 
		in [Nicholson et al. 2007, Part II].</p>
</div>


<h2>Specifications</h2>

<p> A specification is either a 
	<a href="#Codechart">Codechart</a>, a statement in LePUS3, or a 
	<a href="#Schema">Schema</a>, a statement in Class-Z. </p>

<div class="definition">
	A 
	<a name="Codechart" class="termdef">Codechart</a> consists of a set of terms and well-formed 
	<a href="#Formulas">formulas in LePUS3</a>.
</div>  <!-- Definition -->


<div class="sample_text">
	<p> You can find many sample Codecharts in 
	<a href="http://www.lepus.org.uk/spec">lepus.org.uk/spec/</a> 
	and in <a href="http://www.lepus.org.uk/ref/legend/legend.xml">
	lepus.org.uk/ref/legend</a>.</p>
</div>


<div class="definition">
	A <a name="Schema" class="termdef">Class-Z Schema</a> 
	is an expression of the following form:
	<classz:schema title="SchemaName">
		<classz:declarations>
			<classz:declare>
				<classz:variable value="declaration" />
				<classz:type value="TYPE" />
			</classz:declare>
			<classz:declare>
				<classz:variable value="declaration" />
				<classz:type value="TYPE" />
			</classz:declare>
			<fopl:ldots /></classz:declarations>
		<classz:formulas>
			<classz:relationsymbol value="formula" />
			<classz:relationsymbol value="formula" />
			<fopl:ldots />
		</classz:formulas>
	</classz:schema>
	where each
	<ul>
		<li>
			<classz:variable value="declaration" />
			is a comma-separated list of <a href="#Terms">constants and variables</a></li>
		<li>
			<classz:type value="TYPE" />
			is a <a href="#Terms">type symbol</a>
		</li>
		<li>
			<classz:relationsymbol value="formula" />
			is a well-formed <a href="#Formulas">formula in Class-Z</a>
		</li>
	</ul>

</div>  <!-- Definition -->

<div class="sample_text">
	<p> You can find many sample schemas in 
	<a href="http://www.lepus.org.uk/spec/">lepus.org.uk/spec</a> 
	and in <a href="http://www.lepus.org.uk/ref/legend/legend.xml">lepus.org.uk/ref/legend</a>.</p>
</div>

<p>We also distinguish between two kinds of specifications: those that contain variables
	and those that do not.</p>

<div class="definition"> 
	A specification which contains no variables is called a 
	<a name="closed_spec" class="termdef">closed specification</a>, 
	otherwise it is called an 
	<a name="open_spec" class="termdef">open specification</a>. 
</div>	<!-- Definition -->

<div class="sample_text">
	<p>For example, a program is only modelled using closed specifications 
	consisting of 1- and 0-dimensional class, hierarchy, and signature
	<a href="#constant_terms">constants</a>.</p>
	<p>For example, the specifications of any design pattern,
	in particular the specifications of all the 'Gang of Four' design patterns
	are open. (See for example the "<a href="http://www.lepus.org.uk/ref/companion/index.xml">'Gang of Four' Companion</a>"	[Eden et al. 2007].)
	</p>
</div>



<h1>Truth conditions</h1>

<p>Truth conditions describe the circumstances in which a
	<a href="#Specifications">specification</a> 
	<fopl:variable value="&Psi;" />
	is satisfied by a design model 
	<fopl:row>
		<fopl:structure value="M" />
	</fopl:row>
	(also ' 
	<fopl:row>
		<fopl:structure value="M" />
	</fopl:row>
	models 
	<fopl:row>
		<fopl:variable value="&Psi;" />
	</fopl:row>
	'). We follow the standard Tarski truth condition style, which if satisfied we write
</p>
	
<fopl:par>
	<fopl:structure value="M" />
	<fopl:satisfies />
	<fopl:variable value="&Psi;" />
</fopl:par>

<p>The satisfaction of a specification is first defined for 
	specifications that do not contain variables (<a href="#closed_spec">closed specifications</a>.) 
	The satisfaction of specifications with variables (<a href="#open_spec">open specifications</a>) 
	is defined based on that.</p>

<p>The following notational conventions are used in the definitions below:
	<classz:relationsymbol value="UnaryRelation" /> 
	is a unary relation symbol; 
	<classz:relationsymbol value="BinaryRelation" /> 
	is a binary relation (possibly <a href="#transitive_closure">transitive</a>) symbol; 
	<classz:variable value="t" /> 
	,
	<classz:variable value="t" subscript="1" /> 
	and 
	<classz:variable value="t" subscript="2" /> 
	are 0-dimensional <a href="#Terms">constant terms</a>;
	<classz:variable value="T" />
	,
	<classz:variable value="T" subscript="1" /> 
	and 
	<classz:variable value="T" subscript="2" /> 
	are 1-dimensional constant <a href="#Terms">terms</a>. 
	
	</p>

<h2>Satisfying closed specifications</h2>

<p> An <a href="#closed_spec">closed specification</a> 
	<fopl:row>
		<fopl:variable value="&Psi;" /> 
	</fopl:row>
	is satisfied by a design model 
	<fopl:row>
		<fopl:structure value="M" /> 
	</fopl:row>
	, written 
	<fopl:row>
		<fopl:structure value="M" />
		<fopl:satisfies />
		<fopl:variable value="&Psi;" />
	</fopl:row>
	, iff all the terms in 
	<fopl:row>
		<fopl:variable value="&Psi;" /> 
	</fopl:row>
	have an <a href="#interpretation">interpretation</a> in 
	<fopl:row>
		<fopl:structure value="M" /> 
	</fopl:row>
	and all the formulas in 
	<fopl:row>
		<fopl:variable value="&Psi;" /> 
	</fopl:row>
	are satisfied by 
	<fopl:row>
		<fopl:structure value="M" /> 
	</fopl:row>
	. The specific conditions depend on the formulas as laid as follows. 
Detailed verification examples and counter-examples are given the document: &quot;<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml">Sample 
Models</a>&quot; [<a href="#References">Nicholson et al. 2007</a>].</p>



<div class="definition">
	A
	<a name="satisfaction_ground" class="termdef">ground formula</a> 
	is satisfied by
	<a href="#Design_model">design model</a>
	<fopl:row>
		<fopl:structure value="M" />
		<fopl:equals />
		<fopl:tuple>
			<fopl:type value="U" subscript="*" />
			<fopl:type value="R" />
			<fopl:interpretation value="I" />
		</fopl:tuple> 
	</fopl:row>
	under the following conditions:
	<ul>
		<li>
			<fopl:row>
				<fopl:structure value="M" />
				<fopl:satisfies />
				<classz:formula>
					<classz:relationsymbol value="UnaryRelation" />
					<fopl:variable value="t" />
				</classz:formula>
			</fopl:row>
			iff 
			<fopl:row>
				<fopl:interpretation>
					<fopl:variable value="t" />
				</fopl:interpretation>
				<fopl:isin />
				<fopl:relation value="UnaryRelation" />
			</fopl:row>
		</li>
		<li>
			<fopl:row>
				<fopl:structure value="M" />
				<fopl:satisfies />
				<classz:formula>
					<classz:relationsymbol value="BinaryRelation" />
					<fopl:variable value="t" subscript="1" />
					<fopl:variable value="t" subscript="2" />
				</classz:formula>
			</fopl:row>
			if one of the following conditions hold:
			<ul>
				<li>
					<fopl:row>
						<fopl:tuple>
							<fopl:interpretation>
								<fopl:variable value="t" subscript="1" />
							</fopl:interpretation>
							<fopl:interpretation>
								<fopl:variable value="t" subscript="2" />
							</fopl:interpretation>
						</fopl:tuple>
						<fopl:isin />
						<fopl:relation value="BinaryRelation" />
					</fopl:row>
					, or
				</li>
				<li><a name="Subtyping" class="termdef">Subtyping</a>:
					There exists some <a href="#Class_of_dimension_0">class of dimension 0</a>&nbsp;
					<fopl:row>
						<fopl:entity value="subcls" />
					</fopl:row>
					in 
					<fopl:row>
						<fopl:type value="U" subscript="*" />
					</fopl:row>
					such that
					<fopl:row>
						<fopl:tuple>
							<fopl:interpretation>
								<fopl:variable value="t" subscript="1" />
							</fopl:interpretation>
							<fopl:entity value="subcls" />
						</fopl:tuple>
						<fopl:isin />
						<fopl:relation value="BinaryRelation" />
					</fopl:row>
					and 
					<fopl:row>
						<fopl:tuple>
							<fopl:entity value="subcls" />
							<fopl:interpretation>
								<fopl:variable value="t" subscript="2"/>
							</fopl:interpretation>
						</fopl:tuple>
						<fopl:isin />
						<fopl:relation value="Inherit" transitive="yes"/>
					</fopl:row>
					<br></br>
					or
					<br></br>
					there exists some <a href="#Class_of_dimension_0">class of dimension 0</a>&nbsp;
					<fopl:row>
						<fopl:entity value="sprcls" />
					</fopl:row>
					in 
					<fopl:row>
						<fopl:type value="U" subscript="*" />
					</fopl:row>
					such that
					<fopl:row>
						<fopl:tuple>
							<fopl:entity value="sprcls" />
							<fopl:interpretation>
								<fopl:variable value="t" subscript="2" />
							</fopl:interpretation>
						</fopl:tuple>
						<fopl:isin />
						<fopl:relation value="BinaryRelation" />
					</fopl:row>
					and 
					<fopl:row>
						<fopl:tuple>
							<fopl:interpretation>
								<fopl:variable value="t" subscript="1"/>
							</fopl:interpretation>
							<fopl:entity value="sprcls" />
						</fopl:tuple>
						<fopl:isin />
						<fopl:relation value="Inherit" transitive="yes"/>
					</fopl:row>
				</li>
			</ul>
		</li>
	</ul>

</div>	<!-- Definition -->


<div class="sample_text">
	<p>
		For example, the formula 
		<classz:formula>
			<classz:relationsymbol value="Member" />
			<classz:constant value="a" />
			<classz:constant value="b" />
		</classz:formula>
		is satisfied not only when a member of class 	
		<classz:constant value="b" />
		is defined inside class
		<classz:constant value="a" />
		but also by a program which defines a member of class 
		<classz:constant value="c" />
		which inherits from class
		<classz:constant value="b" />
		inside class
		<classz:constant value="a" />
		.
	</p>

	<p>
		For example, the ground formula 
		<classz:formula>
			<classz:relationsymbol value="Inherit" transitive="yes" />
			<classz:constant value="a" />
			<classz:constant value="b" />
		</classz:formula>
		is semantically equivalent to the ground formula
		<classz:formula>
			<classz:relationsymbol value="Inherit" />
			<classz:constant value="a" />
			<classz:constant value="b" />
		</classz:formula>
		.
	</p>

	<p> For sample Class-Z ground formulas and their semantics see the examples in 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#Ground_formulas">§2: Ground Formulas</a> 
		in [Nicholson et al. 2007, Part II].</p>

	<p>
		For subtyping, see <a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example7b">
		Example 7:B</a> in [Nicholson et al. 2007, Part I].</p>
</div>  <!-- example -->

<p>
	<a class="termdef" name="Predicates">Predicates</a> offer us means for imposing constraints 
	on the relations that may exist between entities. The conditions for 
	satisfying each <a href="#pradicate_formulas">predicate formula</a> 
	are defined below using the conditions for satisfying
	<a href="#satisfaction_ground">ground formulas</a>.
</p>
	
<p>The truth conditions for predicate formulas are defined below for 1-dimensional term arguments. 
	But 0-dimensional term arguments for predicate formulas are also allowed, where each 0-dimensional term argument 
	<fopl:variable value="t" /> 
	is treated as representing the singleton set 
	<fopl:row>
		<fopl:set>
			<fopl:interpretation>
				<classz:variable value="t" />
			</fopl:interpretation>
		</fopl:set>
	</fopl:row>
	. For example:
	<fopl:par>
		<fopl:structure value="M" />
		<fopl:satisfies />
		<classz:formula>
			<classz:predicatesymbol value="TOTAL" />
			<classz:relationsymbol value="BinaryRelation" />
			<fopl:variable value="t" />
			<fopl:variable value="T" />
		</classz:formula>
	</fopl:par>
	iff
	<fopl:par>
		<fopl:structure value="M" />
		<fopl:satisfies />
		<classz:formula>
			<classz:predicatesymbol value="TOTAL" />
			<classz:relationsymbol value="BinaryRelation" />
			<fopl:set>
				<fopl:variable value="t" />
			</fopl:set>
	  		<fopl:variable value="T" />
		</classz:formula>
	</fopl:par>
	where 
	<fopl:row>
		<fopl:interpretation>
			<fopl:set>
				<fopl:variable value="t" />
			</fopl:set>
		</fopl:interpretation>
		<fopl:equals />
		<fopl:set>
			<fopl:interpretation>
				<fopl:variable value="t" />
			</fopl:interpretation>
		</fopl:set>
	</fopl:row>
	.</p>

<div class="definition">
	An 
	<a class="termdef" name="all_satis">ALL</a> predicate formula of the form 
	<fopl:row>
		<classz:formula>
			<classz:predicatesymbol value="ALL" />
			<classz:relationsymbol value="UnaryRelation" />
			<fopl:variable value="T" />
		</classz:formula>
	</fopl:row>
	is satisfied by <a href="#Design_model">design model</a>
	<fopl:row>
		<fopl:structure value="M" />
		<fopl:equals />
		<fopl:tuple>
			<fopl:type value="U" subscript="*" />
			<fopl:type value="R" />
			<fopl:interpretation value="I" />
		</fopl:tuple> 
	</fopl:row>
	iff for each 
	<fopl:row>
		<fopl:entity value="e" /> 
	</fopl:row>
	entity in 
	<fopl:row>
		<fopl:interpretation>
			<fopl:variable value="T" />
		</fopl:interpretation>
	</fopl:row>
	:
	<fopl:row>
		<fopl:structure value="M" />
		<fopl:satisfies />
		<classz:formula>
			<classz:relationsymbol value="UnaryRelation" />
			<classz:constant value="e" />
		</classz:formula> 
	</fopl:row>
	. 
</div>

<div class="sample_text">
	<p>For example, the predicate formula
		<classz:formula>
			<classz:predicatesymbol value="ALL" />
			<classz:relationsymbol value="Abstract" />
			<classz:superimposition>
				<classz:constant value="Operations"/>
				<classz:constant value="collection"/>
			</classz:superimposition>
		</classz:formula>
		requires that all the methods in class 
		<code>Collection</code>
		with a signature represented by the elements of 
		<classz:constant value="Operations"/>
		are abstract.
	</p>
	<p>
		See also 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example15">Example 15</a>, 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example16">Example 16</a>, and
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example17">Example 17</a> in [Nicholson et al. 2007, 
		Part II].</p>
</div>


<div class="definition"> 
	A TOTAL predicate indicates the existence of a total functional
	relation from the concrete elements of one set to another. More formally, 
	a <a class="termdef" name="total_satis">TOTAL</a> predicate formula of the form 
	<fopl:row>
		<classz:formula>
			<classz:predicatesymbol value="TOTAL" />
			<classz:relationsymbol value="BinaryRelation" />
			<fopl:variable value="T" subscript="1" />
			<fopl:variable value="T" subscript="2" />
		</classz:formula>
	</fopl:row>	
	is satisfied by 
	<a href="#Design_model">design model</a>
	<fopl:row>	
		<fopl:structure value="M" />
		<fopl:equals />
		<fopl:tuple>
			<fopl:type value="U" subscript="*" />
			<fopl:type value="R" />
			<fopl:interpretation value="I" />
		</fopl:tuple> 
	</fopl:row>	
	iff 
	<fopl:row>	
		<fopl:interpretation>
			<fopl:variable value="T" subscript="1" />
		</fopl:interpretation> 
	</fopl:row>	
	does not consist solely of abstract methods, and for each 
	<fopl:row>	
		<fopl:entity value="e" subscript="1" /> 
	</fopl:row>	
	entity in 
	<fopl:row>	
		<fopl:interpretation>
			<fopl:variable value="T" subscript="1" />
		</fopl:interpretation> 
	</fopl:row>	
	that is not an abstract method there exists some 
	<fopl:row>	
		<fopl:entity value="e" subscript="2" /> 
	</fopl:row>	
	entity in 
	<fopl:row>	
		<fopl:interpretation>
			<fopl:variable value="T" subscript="2" />
		</fopl:interpretation> 
	</fopl:row>	
	such that
	<fopl:row>	
		<fopl:structure value="M" />
		<fopl:satisfies />
		<classz:formula>
			<classz:relationsymbol value="BinaryRelation" />
			<classz:constant value="e" subscript="1" />
			<classz:constant value="e" subscript="2" />
		</classz:formula> 
	</fopl:row>	
	. 
</div>

<p> The formula 
	<classz:formula>
		<classz:predicatesymbol value="TOTAL" />
		<classz:relationsymbol value="BinaryRelation" />
		<classz:constant value="T" subscript="1" />
		<classz:constant value="T" subscript="2" />
	</classz:formula> 
	thus indicates that the relation 
	<classz:relationsymbol value="BinaryRelation" /> 
	is a total functional relation from the set of entities represented by the first term 
	<classz:constant value="T" subscript="1" /> 
	(with the exception of abstract methods) 
	to the set of entities represented by the second term
	<classz:constant value="T" subscript="2" />.
</p>

<div class="sample_text">
	<p>For example, the formula 
		<classz:formula>
			<classz:predicatesymbol value="Total" />
			<classz:relationsymbol value="Member" />
			<fopl:set>
				<classz:constant value="cls" subscript="1" />	
				<classz:constant value="cls" subscript="2" />	
			</fopl:set>
			<classz:constant value="object" />	
		</classz:formula>
		requires that class <code>cls1</code> and class <code>cls2</code> have each a member of type 
		<code>Object</code> (or of some class that inherits from it.)
	</p>
	<p>See also 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example18">Example 18</a>, 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example19">Example 19</a>, and
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example20">Example 20</a>
		in [Nicholson et al. 2007, Part II].</p>
</div> <!-- Example -->	



<div class="definition"> 
	An ISOMORPHIC predicate indicates the existence of a bijective (1:1 and onto) functional
	relation between the concrete elements of two sets. More formally, 
	an <a class="termdef" name="iso_satis">ISOMORPHIC</a>
	predicate formula of the form 
	<fopl:row>	
		<classz:formula>
			<classz:predicatesymbol value="ISOMORPHIC" />
			<classz:relationsymbol value="BinaryRelation" />
			<fopl:variable value="T" subscript="1" />
			<fopl:variable value="T" subscript="2" />
		</classz:formula>
	</fopl:row>	
	is satisfied by <a href="#Design_model">design model</a>
	<fopl:row>	
		<fopl:structure value="M" />
		<fopl:equals />
		<fopl:tuple>
			<fopl:type value="U" subscript="*" />
	 		<fopl:type value="R" />
			<fopl:interpretation value="I" />
		</fopl:tuple> 
	</fopl:row>	
	iff there exists a pair 
	<fopl:row>	
		<fopl:tuple>
			<fopl:entity value="e" subscript="1" />
			<fopl:entity value="e" subscript="2" />
		</fopl:tuple>
	</fopl:row>
	where 
	<fopl:row>	
		<fopl:entity value="e" subscript="1" />
		<fopl:isin />
		<fopl:func_args value="Concrete">
			<fopl:interpretation>
				<classz:variable value="T" subscript="1" />
			</fopl:interpretation> 
		</fopl:func_args>
	</fopl:row>	
	and
	<fopl:row>	
		<fopl:entity value="e" subscript="2" />
		<fopl:isin />
		<fopl:func_args value="Concrete">
			<fopl:interpretation>
				<classz:variable value="T" subscript="2" />
			</fopl:interpretation>
		</fopl:func_args>
	</fopl:row>
	such that:
	<ul>
		<li><fopl:row>	
				<fopl:structure value="M" /> 
				<fopl:satisfies />
				<classz:formula>
					<classz:relationsymbol value="BinaryRelation" />
					<classz:constant value="e" subscript="1" />
					<classz:constant value="e" subscript="2" />
				</classz:formula>
			</fopl:row>; and
		</li>
		<li>
			<fopl:row>	
				<fopl:structure value="M" /> 
				<fopl:satisfies />
				<classz:formula>
					<classz:predicatesymbol value="ISOMORPHIC" />
					<classz:relationsymbol value="BinaryRelation" />
					<fopl:row>	
						<fopl:variable value="T" subscript="1" />
						<fopl:minus />
						<classz:constant value="e" subscript="1" />
					</fopl:row>	
					<fopl:row>	
						<fopl:variable value="T" subscript="2" />
						<fopl:minus />
						<classz:constant value="e" subscript="2" />
					</fopl:row>	
				</classz:formula>
			</fopl:row>
			unless both 
			<fopl:row>	
				<fopl:variable value="T" subscript="1" />
				<fopl:minus />
				<classz:constant value="e" subscript="1" />
			</fopl:row>	
			and 
			<fopl:row>	
				<fopl:variable value="T" subscript="2" />
				<fopl:minus />
				<classz:constant value="e" subscript="2" />
			</fopl:row>	
			are empty.
		</li>
	</ul>
	where
	<fopl:row>	
		<fopl:interpretation value="I">
			<fopl:row>	
				<fopl:variable value="T" />
				<fopl:minus />
				<classz:constant value="e" />
			</fopl:row>	
		</fopl:interpretation>
		<fopl:equals />
		<fopl:interpretation value="I">
			<fopl:variable value="T" />
		</fopl:interpretation>
		<fopl:minus />
		<fopl:interpretation value="I" >
			<classz:constant value="e" />
		</fopl:interpretation>
	</fopl:row>
	and 
	<fopl:row>
		<fopl:func_args value="Concrete">
			<fopl:variable value="S" />
		</fopl:func_args>
	</fopl:row>
	stands for the subset of set 
	<fopl:variable value="S" />
	which consists of all and only non-abstract entities in 
	<fopl:variable value="S" />.
	
</div> <!-- Definition -->


<p> The formula 
	<classz:formula>
		<classz:predicatesymbol value="ISOMORPHIC" />
		<classz:relationsymbol value="BinaryRelation" />
		<classz:constant value="T" subscript="1" />
		<classz:constant value="T" subscript="2" />
	</classz:formula> 
	thus indicates that there exists a subset of the relation 
	<classz:relationsymbol value="BinaryRelation" /> 
	which is a bijective functional (one-to-one and onto) relation 
	from the set of concrete entities represented by the term 
	<classz:constant value="T" subscript="1" /> 
	to the set of entities represented by the term
	<classz:constant value="T" subscript="2" />.
</p>

<div class="sample_text">
	<p>For example, the formula 
		<classz:formula>
			<classz:predicatesymbol value="Isomorphic" />
			<classz:relationsymbol value="Member" />
			<fopl:set>
				<classz:constant value="a" subscript="1" />	
				<classz:constant value="a" subscript="2" />	
			</fopl:set>
			<fopl:set>
				<classz:constant value="b" subscript="1" />	
				<classz:constant value="b" subscript="2" />	
			</fopl:set>
		</classz:formula>
		, if all classes are non-abstract, requires that either 
		that class <code>A1</code> has a member of class <code>B1</code> (or of its subtypes) and 
		class <code>A2</code> has a member of class <code>B2</code> (or of its subtypes), or 
		that class <code>A1</code> has a member of class <code>B2</code> (or of its subtypes) and 
		class <code>A2</code> has a member of class <code>B1</code> (or of its subtypes).
	</p>
	<p>See also 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example21">Example 21</a>, 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example22">Example 22</a>,
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example23">Example 23</a>, 
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example24">Example 24</a>, and
		<a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml#example25">Example 25</a>
		in [Nicholson et al. 2007, Part II].</p>
</div> <!-- Example -->	


<h2>Satisfying open specifications</h2>

<p>The truth conditions for <a href="#open_spec">open specifications</a> 
	require the notion of an assignment.</p>

<div class="definition">
	An <a class="termdef" name="assignment">assignment</a> 
	<fopl:row>
		<fopl:variable value="g" />
	</fopl:row>
	from variables
	<fopl:row>
		<fopl:variable value="v" subscript="1" />
		<fopl:ldots />
		<fopl:variable value="v" subscript="n" />
	</fopl:row>
	to constants
	<fopl:row>
		<classz:constant value="c" subscript="1" />
		<fopl:ldots />
		<classz:constant value="c" subscript="k" />
	</fopl:row>
	is a function 
	<fopl:row>
		<fopl:variable value="g" />
		<fopl:colon />
		<fopl:set>
			<classz:variable value="v" subscript="1" />
			<fopl:ldots />
			<classz:variable value="v" subscript="n" />
		</fopl:set> 
		<fopl:rarr />
		<fopl:set>
			<classz:constant value="c" subscript="1" />
			<fopl:ldots />
			<classz:constant value="c" subscript="k" />
		</fopl:set>
	</fopl:row>
</div>

<p>
	A well-formed assignment associates each variable with a constant of same 
	type and dimension. Assignments are used so as to associate variables in generic 
	specifications, such as design patterns, to constants representing 
	specific elements of concrete programs. 
</p>

<div class="sample_text">
	<a name="JavaIteratorExample"></a>
	For example, an assignment 
	<fopl:row>
		<fopl:variable value="JavaIterator" /> 
	</fopl:row>
	from the 
	<a href="http://www.lepus.org.uk/ref/companion/Iterator.xml">Iterator design pattern</a>
	[Eden et al. 2007] to the 
	<a href="#abstractsemantics">abstract semantics</a> of <code>java.util</code> 
	may read:
	
	<table style="width: 100%">
		<tr>
			<td class="rigthalign" style="height: 30px; text-align:right">
				<fopl:func_args value="JavaIterator">
					<classz:variable value="Aggregates" />
				</fopl:func_args>
			</td>
			<td style="height: 30px">
				<fopl:equals />
			</td>
			<td class="leftalign" style="height: 30px; text-align:left">
				<fopl:set>
					<classz:constant value="collection" />
					<classz:constant value="linkedList" />
					<classz:constant value="hashSet" />
				</fopl:set>
			</td>
		</tr>
		<tr>
			<td class="rigthalign" style="height: 30px">
				<fopl:func_args value="JavaIterator">
					<classz:variable value="Iterators" />
				</fopl:func_args>
			</td>
			<td style="height: 30px">
				<fopl:equals />
			</td>
			<td class="leftalign">
				<fopl:set>
					<classz:constant value="iterator" />
					<classz:constant value="linkedList.ListItr" />
					<classz:constant value="hashMap.KeyIterator" />
				</fopl:set>
			</td>
		</tr>
		<tr>
			<td class="rigthalign">
				<fopl:func_args value="JavaIterator">
					<classz:variable value="next" />
				</fopl:func_args>
			</td>
			<td>
				<fopl:equals />
			</td>
			<td class="leftalign">
				<classz:constant value="next" />
			</td>
		</tr>
		<tr>
			<td class="rigthalign">
				<fopl:func_args value="JavaIterator">
					<classz:variable value="newItr" />
				</fopl:func_args>
			</td>
			<td>
				<fopl:equals />
			</td>
			<td class="leftalign">
				<classz:constant value="iterator()" />
			</td>
		</tr>
		<tr>
			<td class="rigthalign">
				<fopl:func_args value="JavaIterator">
					<classz:variable value="element" />
				</fopl:func_args>
			</td>
			<td>
				<fopl:equals />
			</td>
			<td class="leftalign">
				<classz:constant value="object" />
			</td>
		</tr>
	</table>
</div>

<p>We say that the open specification
	<fopl:row>
		<fopl:variable value="&Phi;" />
		<fopl:array>
			<classz:variable value="v" subscript="1" />
			<fopl:ldots />
			<classz:variable value="v" subscript="n" />
		</fopl:array>
	</fopl:row>
	, where
	<classz:variable value="v" subscript="1" />
	<fopl:ldots />
	<classz:variable value="v" subscript="n" />
	are all the (distinct) <a href="#variable_terms">variables</a> in
	<fopl:variable value="&Phi;" />
	, is satisfied by a <a href="#Design_model">design model</a>
	<fopl:row>
		<fopl:structure value="M" />
		<fopl:equals />
		<fopl:tuple>
			<fopl:type value="U" subscript="*" />
			<fopl:type value="R" />
			<fopl:interpretation value="I" />
		</fopl:tuple> 
	</fopl:row>
	under the assignment
	<fopl:row>
		<fopl:variable value="g" />
		<fopl:colon />
		<fopl:set>
			<classz:variable value="v" subscript="1" />
			<fopl:ldots />
			<classz:variable value="v" subscript="n" />
		</fopl:set> 
		<fopl:rarr />
		<fopl:set>
			<classz:constant value="c" subscript="1" />
			<fopl:ldots />
			<classz:constant value="c" subscript="k" />
		</fopl:set>
	</fopl:row> 
	, written</p>

<fopl:par>
	<fopl:structure value="M" />
	<fopl:satisfies subscript="g" />
	<fopl:variable value="&Phi;" />
	<fopl:array>
		<classz:variable value="v" subscript="1" />
		<fopl:ldots />
		<classz:variable value="v" subscript="n" />
	</fopl:array>
</fopl:par>

<p>iff </p>

<fopl:par>
	<fopl:structure value="M" />
	<fopl:satisfies />
	<fopl:variable value="&Phi;" />
	<fopl:array>
		<fopl:substitute>
			<fopl:func_args value="g">
				<classz:variable value="v" subscript="1" />
			</fopl:func_args>
			<classz:variable value="v" subscript="1" />
		</fopl:substitute>
		<fopl:ldots />
		<fopl:substitute>
			<fopl:func_args value="g">
				<classz:variable value="v" subscript="n" />
			</fopl:func_args>
			<classz:variable value="v" subscript="n" />
		</fopl:substitute>
	</fopl:array>
</fopl:par>

<p>where
	<fopl:row>
		<fopl:variable value="&Phi;" />
		<fopl:array>
			<fopl:substitute>
				<fopl:func_args value="g">
					<classz:variable value="v" subscript="1" />
				</fopl:func_args>
				<classz:variable value="v" subscript="1" />
			</fopl:substitute>
			<fopl:ldots />
			<fopl:substitute>
				<fopl:func_args value="g">
					<classz:variable value="v" subscript="n" />
				</fopl:func_args>
				<classz:variable value="v" subscript="n" />
			</fopl:substitute>
		</fopl:array>
	</fopl:row>
	is that <a href="#closed_spec">closed specification</a> which results from the consistent replacement of variable 
	<classz:variable value="v" subscript="1" />
	with the constant
	<fopl:row>
		<fopl:func_args value="g">
			<classz:variable value="v" subscript="1" />
		</fopl:func_args>
	</fopl:row>
	, ... and the consistent replacement of variable 
	<classz:variable value="v" subscript="n" />
	with the constant
	<fopl:row>
		<fopl:func_args value="g">
			<classz:variable value="v" subscript="n" />
		</fopl:func_args>
	</fopl:row>
	 in the open specification 
 	<fopl:variable value="&Phi;" />
 	.
</p>

<div class="sample_text">
	<p>For example, let 
		<fopl:row>
			<fopl:variable value="IteratorPattern" />
			<fopl:array>
				<classz:variable value="Aggregates" />
				<classz:variable value="Iterators" />
				<classz:variable value="next" />
				<classz:variable value="newItr" />
				<classz:variable value="element" />
			</fopl:array>
		</fopl:row>
		be the specification of the 
		the <a href="http://www.lepus.org.uk/ref/companion/Iterator.xml">Iterator design pattern</a>
	[Eden et al. 2007],
		design model
		<fopl:row>
			<fopl:structure value="JavaUtil" />
		</fopl:row>
		is the abstract semantics of the <code>java.util</code> package, and
		<a href="#JavaIteratorExample">
		<fopl:row>
			<fopl:variable value="JavaIterator" /> 
		</fopl:row>
		</a>
		be the assignment from 
		<fopl:row>
			<fopl:set>
				<classz:variable value="Aggregates" />
				<classz:variable value="Iterators" />
				<classz:variable value="next" />
				<classz:variable value="newItr" />
				<classz:variable value="element" />
			</fopl:set>
		</fopl:row>
		to the universe of 
		<fopl:row>
			<fopl:structure value="JavaUtil" />
		</fopl:row>
		. Then we write
		<fopl:par>
			<fopl:structure value="JavaUtil" />
			<fopl:satisfies subscript="JavaIterator" />
			<fopl:variable value="IteratorPattern" />
		</fopl:par>
		to indicate that <code>java.util</code> satisfies (also 
		'models' or 'implements') the Iterator design pattern.
	</p>
</div>


<h1>Consequences</h1>

<p>
	<a class="termdef" name="subsetsfopl">Proposition 1</a>: 
	LePUS3 and Class-Z are proper subsets of FOPL.
</p>

<p><a class="termdef"  name="inheritplustisstrictorder">Proposition 2</a>: 
	<fopl:row>
		<fopl:relation value="Inherit" transitive="yes" /> 
	</fopl:row>
	, the transitive closure of the 
	<fopl:row>
		<fopl:relation value="Inherit" /> 
	</fopl:row>
	relation, is a strict order on 
	<fopl:row>
		<fopl:relation value="Class" />
	</fopl:row>
</p>

<p><a class="termdef" name="sigisfunc">Proposition 3</a>: 
	<fopl:row>
		<fopl:relation value="SingatureOf" /> 
	</fopl:row>
	is a functional relation. 
</p>


<h1>Acknowledgements</h1>

<p>Many thanks go to Ray Turner for his continuous help.</p>

<h1>References</h1>

<ul>
	<li>Amnon H. Eden. &ldquo;Formal Specification of Object-Oriented Design.&rdquo; 
		<i>Proc. Int'l Conf. Multidisciplinary Design in Engineering CSME-MDE 2001</i> 
		(21&ndash;22 Nov. 2001), Montreal, Canada. 
		[<a href="http://www.eden-study.org/articles/2001/csme.pdf">.pdf</a>]</li>
	<li>Amnon H. Eden. <em>Object-Oriented Modelling</em>. Under preparation.</li>
	<li>Amnon H. Eden, Jonathan Nicholson, Epameinondas Gasparis. 
		&ldquo;<a href="http://www.lepus.org.uk/ref/companion/index.xml">The LePUS3 and Class-Z companion to the 'Gang of Four' design patterns</a>.&rdquo; 
		Technical report CSM-472, ISSN 1744-8050 (2007), Department of Computer Science, University of 
		Essex. [<a href="http://www.lepus.org.uk/ref/companion/companion.pdf">.pdf</a>]</li>
	<li>Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides. 
		<i>Design Patterns: Elements of Reusable Object-Oriented Software.</i> 
		Reading: Addison-Wesley, 1995.</li>
	<li>Michael R.A. Huth, Mark Ryan. <i>Logic in Computer Science</i>. 
		Cambridge: Cambridge University Press, 2000.</li>
	<li>Jonathan Nicholson, Amnon H Eden, Epameinondas Gasparis. &quot;Verification of LePUS3/Class-Z 
		Specifications: Sample models and Abstract Semantics for Java 1.4 (<a href="http://www.lepus.org.uk/ref/verif/1java_as.xml">Part 
		I</a>; <a href="http://www.lepus.org.uk/ref/verif/2case_studies.xml">Part II</a>).&quot; Department of 
		Computer Science, University of Essex, Tech. Rep. CSM-471, ISSN 1744-8050 
		(2007). [<a href="http://www.lepus.org.uk/ref/verif/verif.pdf">.pdf</a>]</li>
	<li>J. Michael Spivey. <i>The Z Notation: A Reference Manual</i>. Hertfordshire: Prentice-Hall, 1992.</li>
</ul>

</body>
</html>
