﻿<?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">

	<head>
		<link rel="stylesheet" type="text/css" href="http://www.lepus.org.uk/templates/doc.css" />
		<title>Complete verification case study</title>
		<meta http-equiv="Content-Style-Type" content="text/css" />
		<meta name="Author" content="Amnon H Eden, Jonathan Nicholson, Epameinondas Gasparis" />
		<style type="text/css">
			th { background-color:transparent; }
		</style>
	</head>

	<body>
		<p class="pagetitle">Complete verification case study</p>
		<p class="subtitle">The Iterator pattern</p>
		<p>
			<a href="http://www.nicholsonweb.co.uk/">Jonathan Nicholson</a>,
			<a href="http://www.eden-study.org/">Amnon H Eden</a>,
			Epameinondas Gasparis
			<br />
			Department of Computer Science, University of Essex, United Kingdom
		</p>
		<p>Draft: 14 August 2007</p>
		<div class="abstract">
			<h3>Abstract</h3>
			A complete case study of an implementation of the 
			<a href="../companion/Iterator.xml">Iterator</a>
			design pattern, and verification thereof.
		</div>
		<doc:toc />
		<div>
			<h1>The program and the design model</h1>
			The program presented shows two "collection" classes; one for lists and one for sets, both
			encapsulate an array as its main method of data storage. The classes are incomplete as they
			are missing the behaviour (methods) common to classes of this type, these are not shown as
			they provide more than the desired complexity for the purposes of this example.
			<br /> 
			See <a href="1java_as.xml">Abstract Semantics for Java 1.4 Programs</a>
			for further details on how the finite structure has been generated.

			<h2>Source code</h2>
			<div class="example">
				<pre class="program">
public abstract class AbstractCollection {
  public abstract Iterator iterator();
}

public class List extends AbstractCollection {
  private Object[] data;
  
  ...
  
  public Iterator iterator() {
    return new ListIterator();
  }
}

public class Set extends AbstractCollection {
  private Object[] data;
  
  ...
  
  public Iterator iterator() {
    return new SetIterator();
  }
}

public interface Iterator {
  public Object next();
}

class ListIterator implements Iterator {
  public Object next() {
    ...
  }
}

class SetIterator implements Iterator {
  public Object next() {
    ...
  }
}
				</pre>
			</div>
			<h2>Finite structure</h2>
			<div class="example">
				<table class="designmodel">
					<tr>
						<td class="domain">
							<fopl:set vertical="yes">
								<fopl:tuple><fopl:entity value="AbstractCollection" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="List" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Set" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Iterator" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="ListIterator" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="SetIterator" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Object" /></fopl:tuple>
							</fopl:set>
						</td>
						<td class="operator"><fopl:equals /></td>
						<td class="range"><fopl:relation value="Class" /></td>
					</tr>
					<tr>
						<td class="domain">
							<fopl:set vertical="yes">
								<fopl:tuple><fopl:entity value="AbstractCollection.iterator(void)" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="List.iterator(void)" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Set.iterator(void)" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Iterator.next(void)" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="ListIterator.next(void)" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="SetIterator.next(void)" /></fopl:tuple>
							</fopl:set>
						</td>
						<td class="operator"><fopl:equals /></td>
						<td class="range"><fopl:relation value="Method" /></td>
					</tr>
					<tr>
						<td class="domain">
							<fopl:set vertical="yes">
								<fopl:tuple><fopl:entity value="iterator(void)" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="next(void)" /></fopl:tuple>
							</fopl:set>
						</td>
						<td class="operator"><fopl:equals /></td>
						<td class="range"><fopl:relation value="Signature" /></td>
					</tr>
					<tr>
						<td class="domain">
							<fopl:set vertical="yes">
								<fopl:tuple>
									<fopl:entity value="iterator(void)" />
									<fopl:entity value="AbstractCollection.iterator(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="iterator(void)" />
									<fopl:entity value="List.iterator(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="iterator(void)" />
									<fopl:entity value="Set.iterator(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="next(void)" />
									<fopl:entity value="Iterator.next(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="next(void)" />
									<fopl:entity value="ListIterator.next(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="next(void)" />
									<fopl:entity value="SetIterator.next(void)" />
								</fopl:tuple>
							</fopl:set>
						</td>
						<td class="operator"><fopl:equals /></td>
						<td class="range"><fopl:relation value="SignatureOf" /></td>
					</tr>
					<tr>
						<td class="domain">
							<fopl:set vertical="yes">
								<fopl:tuple>
									<fopl:entity value="AbstractCollection" />
									<fopl:entity value="AbstractCollection.iterator(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="List" />
									<fopl:entity value="List.iterator(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="List" />
									<fopl:entity value="Object[]" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="Set" />
									<fopl:entity value="Set.iterator(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="Set" />
									<fopl:entity value="Object[]" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="Iterator" />
									<fopl:entity value="Iterator.next(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="ListIterator" />
									<fopl:entity value="ListIterator.next(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="SetIterator" />
									<fopl:entity value="SetIterator.next(void)" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="Object[]" />
									<fopl:entity value="Object" />
								</fopl:tuple>
							</fopl:set>
						</td>
						<td class="operator"><fopl:equals /></td>
						<td class="range"><fopl:relation value="Member" /></td>
					</tr>
					<tr>
						<td class="domain">
							<fopl:set vertical="yes">
								<fopl:tuple><fopl:entity value="AbstractCollection" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Iterator" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="AbstractCollection.iterator(void)" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Iterator.next(void)" /></fopl:tuple>
							</fopl:set>
						</td>
						<td class="operator"><fopl:equals /></td>
						<td class="range"><fopl:relation value="Abstract" /></td>
					</tr>
					<tr>
						<td class="domain">
							<fopl:set vertical="yes">
								<fopl:tuple>
									<fopl:entity value="Set" />
									<fopl:entity value="AbstractCollection" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="List" />
									<fopl:entity value="AbstractCollection" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="AbstractCollection" />
									<fopl:entity value="Object" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="SetIterator" />
									<fopl:entity value="Iterator" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="ListIterator" />
									<fopl:entity value="Iterator" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="Iterator" />
									<fopl:entity value="Object" />
								</fopl:tuple>
							</fopl:set>
						</td>
						<td class="operator"><fopl:equals /></td>
						<td class="range"><fopl:relation value="Inherit" /></td>
					</tr>
					<tr>
						<td class="domain">
							<fopl:set vertical="yes">
								<fopl:tuple>
									<fopl:entity value="List.iterator(void)" />
									<fopl:entity value="ListIterator" />
								</fopl:tuple>
								<fopl:tuple>
									<fopl:entity value="Set.iterator(void)" />
									<fopl:entity value="SetIterator" />
								</fopl:tuple>
							</fopl:set>
						</td>
						<td class="operator"><fopl:equals /></td>
						<td class="range"><fopl:relation value="Produce" /></td>
					</tr>
				</table>
			</div>
			<h2>Design model</h2>
			<div class="example">
				The design model is as the
				<a href="#Finite_structure">finite structure</a>
				above, but also includes the following higher-dimensional entities
				(see <a href="http://www.lepus.org.uk/ref/refman/refman.xml#Entities">Entities</a>):
				<table class="designmodel">
					<tr>
						<td class="domain"><fopl:entity value="ConcreteCollections" /></td>
						<td class="operator"><fopl:equals /></td>
						<td class="range">
							<fopl:set vertical="yes">
								<fopl:tuple><fopl:entity value="List" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Set" /></fopl:tuple>
							</fopl:set>
						</td>
					</tr>
					<tr>
						<td class="domain"><fopl:entity value="Collections" /></td>
						<td class="operator"><fopl:equals /></td>
						<td class="range">
							<fopl:set vertical="yes">
								<fopl:tuple><fopl:entity value="AbstractCollection" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="List" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="Set" /></fopl:tuple>
							</fopl:set>
						</td>
					</tr>
					<tr>
						<td class="domain"><fopl:entity value="Iterators" /></td>
						<td class="operator"><fopl:equals /></td>
						<td class="range">
							<fopl:set vertical="yes">
								<fopl:tuple><fopl:entity value="Iterator" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="ListIterator" /></fopl:tuple>
								<fopl:tuple><fopl:entity value="SetIterator" /></fopl:tuple>
							</fopl:set>
						</td>
					</tr>
				</table>
			</div>
		</div>
		<div>
			<h1>Assigning variables to constants</h1>
			See the &quot;<a href="http://www.lepus.org.uk/spec/gof/index.xml">gang of four</a>&quot; companion for
			more information on their design patterns, including how the Iterator pattern looks when modelled in LePUS3.
			Also see the <a href="http://www.lepus.org.uk/docs/refman/refman.xml">LePUS3 and Class-Z Reference Manual</a>
			for more information on assignments (<a href="http://www.lepus.org.uk/docs/refman/refman.xml#definition20">Definition XX</a>),
			and the differences between open and closed specifications
			(<a href="http://www.lepus.org.uk/docs/refman/refman.xml#definition15">Definition XV</a>). Each specification presented here
			takes the form of a <em>Class-Z Schema</em> (<a href="http://www.lepus.org.uk/docs/refman/refman.xml#definition14">Definition XIV</a>).
			<h2>The Iterator pattern</h2>
			<div class="example">
				<doc:include value="../../spec/gof/classz/Iterator.xml" />
			</div>
			<h2>Assignment</h2>
			<div class="example">
				Assignment
				<fopl:func_args value="g" />
				is defined as:
				<ul>
					<li>
						<fopl:func_args value="g">
							<classz:variable value="Element" />
						</fopl:func_args>
						<fopl:equals />
						<classz:constant value="Object" />
					</li>
					<li>
						<fopl:func_args value="g">
							<classz:variable value="Aggregates" />
						</fopl:func_args>
						<fopl:equals />
						<classz:constant value="Collections" />
					</li>
					<li>
						<fopl:func_args value="g">
							<classz:variable value="Iterators" />
						</fopl:func_args>
						<fopl:equals />
						<classz:constant value="Iterators" />
					</li>
					<li>
						<fopl:func_args value="g">
							<classz:variable value="createIterator" />
						</fopl:func_args>
						<fopl:equals />
						<classz:constant value="iterator(void)" />
					</li>
					<li>
						<fopl:func_args value="g">
							<classz:variable value="next" />
						</fopl:func_args>
						<fopl:equals />
						<classz:constant value="next(void)" />
					</li>
				</ul>
			</div>
			<h2>The Iterator after assignment</h2>
			<div class="example">
				<classz:schema title="Iterator">
					<classz:declarations>
						<classz:declare>
							<classz:constant value="Object" />
							<classz:type value="CLASS" exponent="0" />
						</classz:declare>
						<classz:declare>
							<classz:constant value="Collections" />
							<classz:constant value="Iterators" />
							<classz:type value="HIERARCHY" exponent="1" />
						</classz:declare>
						<classz:declare>
							<classz:constant value="iterator(void)" />
							<classz:constant value="next(void)" />
							<classz:type value="SIGNATURE" exponent="0" />
						</classz:declare>
					</classz:declarations>
					<classz:formulas>
						<classz:formula>
							<classz:predicatesymbol value="Isomorphic" />
							<classz:relationsymbol value="Produce" />
							<classz:superimposition>
								<classz:constant value="iterator(void)" />
								<classz:constant value="Collections" />
							</classz:superimposition>
							<classz:constant value="Iterators" />
						</classz:formula>
						<classz:formula>
							<classz:predicatesymbol value="Total" />
							<classz:relationsymbol value="Return" />
							<classz:superimposition>
								<classz:constant value="next(void)" />
								<classz:constant value="Iterators" />
							</classz:superimposition>
							<classz:constant value="Object" />
						</classz:formula>
						<classz:formula>
							<classz:predicatesymbol value="Total" />
							<classz:relationsymbol value="Member" transitive="yes" />
							<classz:constant value="Collections" />
							<classz:constant value="Object" />
						</classz:formula>
					</classz:formulas>
				</classz:schema>
			</div>
			<h1>Verification algorithm</h1>
			See <a href="casestudies.xml">Verification of LePUS3/Class-Z Specifications: Sample models and Abstract Semantics for Java 1.4 (part 2)</a>
			for further details on how each specified property can be verified.
			<h2>Declarations</h2>
			<div class="example">
				<table>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple><fopl:entity value="Object" /></fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Class" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:declare>
								<classz:constant value="Object" /><classz:type value="CLASS" exponent="0" />
							</classz:declare>
						</td>
					</tr>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple><fopl:entity value="Collections" /></fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:powerset /><fopl:relation value="Class" /></td>
								</tr>
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="List" />
												<fopl:entity value="AbstractCollection" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="Set" />
												<fopl:entity value="AbstractCollection" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Inherit" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:declare>
								<classz:constant value="Collections" /><classz:type value="HIERARCHY" exponent="1" />
							</classz:declare>
						</td>
					</tr>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple><fopl:entity value="Iterators" /></fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:powerset /><fopl:relation value="Class" /></td>
								</tr>
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="ListIterator" />
												<fopl:entity value="Iterator" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="SetIterator" />
												<fopl:entity value="Iterator" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Inherit" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:declare>
								<classz:constant value="Iterators" /><classz:type value="HIERARCHY" exponent="1" />
							</classz:declare>
						</td>
					</tr>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple><fopl:entity value="iterator(void)" /></fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Signature" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:declare>
								<classz:constant value="iterator(void)" /><classz:type value="SIGNATURE" exponent="0" />
							</classz:declare>
						</td>
					</tr>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple><fopl:entity value="next(void)" /></fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Signature" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:declare>
								<classz:constant value="next(void)" /><classz:type value="SIGNATURE" exponent="0" />
							</classz:declare>
						</td>
					</tr>
				</table>
			</div>
			<h2>Superimpositions</h2>
			See <a href="http://www.lepus.org.uk/docs/refman/refman.xml#definition9">Definition IX</a> for more information on superimpositions.
			<div class="example">
				<table>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple><fopl:entity value="AbstractCollection.iterator(void)" /></fopl:tuple>
											<fopl:tuple><fopl:entity value="List.Iterator(void)" /></fopl:tuple>
											<fopl:tuple><fopl:entity value="Set.Iterator(void)" /></fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Method" /></td>
								</tr>
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="iterator(void)" />
												<fopl:entity value="AbstractCollection.iterator(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="iterator(void)" />
												<fopl:entity value="List.iterator(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="iterator(void)" />
												<fopl:entity value="Set.iterator(void)" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="SignatureOf" /></td>
								</tr>
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="AbstractCollection" />
												<fopl:entity value="AbstractCollection.iterator(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="List" />
												<fopl:entity value="List.iterator(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="Set" />
												<fopl:entity value="Set.iterator(void)" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Member" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:superimposition>
								<classz:constant value="iterator(void)" />
								<classz:constant value="Collections" />
							</classz:superimposition>
						</td>
					</tr>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple><fopl:entity value="Iterator.next(void)" /></fopl:tuple>
											<fopl:tuple><fopl:entity value="ListIterator.next(void)" /></fopl:tuple>
											<fopl:tuple><fopl:entity value="SetIterator.next(void)" /></fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Method" /></td>
								</tr>
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="next(void)" />
												<fopl:entity value="Iterator.next(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="next(void)" />
												<fopl:entity value="ListIterator.next(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="next(void)" />
												<fopl:entity value="SetIterator.next(void)" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="SignatureOf" /></td>
								</tr>
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="Iterator" />
												<fopl:entity value="Iterator.next(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="ListIterator" />
												<fopl:entity value="ListIterator.next(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="SetIterator" />
												<fopl:entity value="SetIterator.next(void)" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Member" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:superimposition>
								<classz:constant value="next(void)" />
								<classz:constant value="Iterators" />
							</classz:superimposition>
						</td>
					</tr>
				</table>
			</div>
			<h2>Formulas</h2>
			<div class="example">
				<table>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="AbstractCollection.iterator(void)" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="Iterator" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Abstract" /></td>
								</tr>
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="List.Iterator(void)" />
												<fopl:entity value="ListIterator" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="Set.Iterator(void)" />
												<fopl:entity value="SetIterator" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Produce" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:formula>
								<classz:predicatesymbol value="Isomorphic" />
								<classz:relationsymbol value="Produce" />
								<classz:superimposition>
									<classz:constant value="iterator(void)" />
									<classz:constant value="Collections" />
								</classz:superimposition>
								<classz:constant value="Iterators" />
							</classz:formula>
						</td>
					</tr>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="Iterator.next(void)" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Abstract" /></td>
								</tr>
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="ListIterator.next(void)" />
												<fopl:entity value="Object" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="SetIterator.next(void)" />
												<fopl:entity value="Object" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Return" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:formula>
								<classz:predicatesymbol value="Total" />
								<classz:relationsymbol value="Return" />
								<classz:superimposition>
									<classz:constant value="next(void)" />
									<classz:constant value="Iterators" />
								</classz:superimposition>
								<classz:constant value="Object" />
							</classz:formula>
						</td>
					</tr>
					<tr>
						<td><doc:enum /></td>
						<td style="width:100%;">
							<table class="designmodel">
								<tr>
									<td class="domain">
										<fopl:set vertical="yes">
											<fopl:tuple>
												<fopl:entity value="List" />
												<fopl:entity value="Object[]" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="Set" />
												<fopl:entity value="Object[]" />
											</fopl:tuple>
											<fopl:tuple>
												<fopl:entity value="Object[]" />
												<fopl:entity value="Object" />
											</fopl:tuple>
										</fopl:set>
									</td>
									<td class="operator"><fopl:subset /></td>
									<td class="range"><fopl:relation value="Member" /></td>
								</tr>
							</table>
						</td>
						<td><fopl:satisfies /></td>
						<td>
							<classz:formula>
								<classz:predicatesymbol value="Total" />
								<classz:relationsymbol value="Member" transitive="yes" />
								<classz:constant value="Collections" />
								<classz:constant value="Object" />
							</classz:formula>
						</td>
					</tr>
				</table>
			</div>
		</div>
		<h1>References</h1>
		<ul>
			<li>Amnon H. Eden, Jonathan Nicholson, Epameinondas Gasparis. 
				&ldquo;<a href="../refman/refman.xml">The LePUS3 and Class-Z Reference manual</a>.&rdquo; 
				Technical report CSM-474, ISSN 1744-8050 (2007), Department of Computer Science, University of 
				Essex. [<a href="../refman/refman.pdf">.pdf</a>]</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="1java_as.xml">Part 
				I</a>; <a href="2case_studies.xml">Part II</a>).&quot; Department of 
				Computer Science, University of Essex, Tech. Rep. CSM-471, ISSN 1744-8050 
				(2007). [<a href="verif.pdf">.pdf</a>]</li>
		</ul>
	</body>
</html>