<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  targetNamespace="http://czt.sourceforge.net/zml"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:Z="http://czt.sourceforge.net/zml"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified"
  version="1.0">
	<xs:annotation>
		<xs:documentation>
			This XML schema defines XML markup for formal
			specifications written in the ISO Standard Z notation.
			$Id: Z_1_1.xsd 5487 2007-05-10 05:01:19Z petramalik $

			Copyright 2003 Mark Utting
			This file is part of the Community Z Tools (CZT) project.

			The CZT project contains free software; you can
			redistribute it and/or modify it under the terms
			of the GNU General Public License as published by
			the Free Software Foundation; either version 2 of
			the License, or (at your option) any later version.

			The CZT project is distributed in the hope that it
			will be useful, but WITHOUT ANY WARRANTY; without
			even the implied warranty of MERCHANTABILITY or
			FITNESS FOR A PARTICULAR PURPOSE.  See the
			GNU General Public License for more details.

			You should have received a copy of the GNU General
			Public License along with CZT; if not, write to the
			Free Software Foundation, Inc., 59 Temple Place,
			Suite 330, Boston, MA  02111-1307  USA
		</xs:documentation>
	</xs:annotation>
	<xs:element name="Spec" type="Z:Spec"/>
	<!-- the Section hierarchy -->
	<xs:element name="Sect" type="Z:Sect" abstract="true"/>
	<xs:element name="ZSect" type="Z:ZSect" substitutionGroup="Z:Sect"/>
	<xs:element name="UnparsedZSect" type="Z:UnparsedZSect" substitutionGroup="Z:Sect"/>
	<xs:element name="NarrSect" type="Z:NarrSect" substitutionGroup="Z:Sect"/>
	<!-- the Paragraph hierarchy -->
	<xs:element name="Para" type="Z:Para" abstract="true"/>
	<xs:element name="AxPara" type="Z:AxPara" substitutionGroup="Z:Para"/>
	<xs:element name="ConjPara" type="Z:ConjPara" substitutionGroup="Z:Para"/>
	<xs:element name="FreePara" type="Z:FreePara" substitutionGroup="Z:Para"/>
	<xs:element name="GivenPara" type="Z:GivenPara" substitutionGroup="Z:Para"/>
	<xs:element name="NarrPara" type="Z:NarrPara" substitutionGroup="Z:Para"/>
	<xs:element name="OptempPara" type="Z:OptempPara" substitutionGroup="Z:Para"/>
	<xs:element name="UnparsedPara" type="Z:UnparsedPara" substitutionGroup="Z:Para"/>
	<!-- the Declaration hierarchy -->
	<xs:element name="Decl" type="Z:Decl" abstract="true"/>
	<xs:element name="ConstDecl" type="Z:ConstDecl" substitutionGroup="Z:Decl"/>
	<xs:element name="InclDecl" type="Z:InclDecl" substitutionGroup="Z:Decl"/>
	<xs:element name="VarDecl" type="Z:VarDecl" substitutionGroup="Z:Decl"/>
	<!-- the decoratable-names hierarchy -->
	<xs:element name="Name" type="Z:Name"/>   <!--TODO: make this abstract?-->
	<xs:element name="DeclName" type="Z:DeclName" substitutionGroup="Z:Name"/>
	<xs:element name="RefName" type="Z:RefName" substitutionGroup="Z:Name"/>
	<!-- the Stroke (Decoration) hierarchy -->
	<xs:element name="Stroke" type="Z:Stroke" abstract="true"/>
	<xs:element name="InStroke" type="Z:Stroke" substitutionGroup="Z:Stroke"/>
	<xs:element name="OutStroke" type="Z:Stroke" substitutionGroup="Z:Stroke"/>
	<xs:element name="NextStroke" type="Z:Stroke" substitutionGroup="Z:Stroke"/>
	<xs:element name="NumStroke" type="Z:NumStroke" substitutionGroup="Z:Stroke"/>
	<!-- the Expression hierarchy -->
	<xs:element name="Expr" type="Z:Expr" abstract="true"/>
	<xs:element name="Expr1" type="Z:Expr1" abstract="true" substitutionGroup="Z:Expr"/>
	<xs:element name="Expr2" type="Z:Expr2" abstract="true" substitutionGroup="Z:Expr"/>
	<xs:element name="SchExpr2" type="Z:SchExpr2" abstract="true" substitutionGroup="Z:Expr2"/>
	<xs:element name="Expr0N" type="Z:Expr0N" abstract="true" substitutionGroup="Z:Expr"/>
	<xs:element name="Expr2N" type="Z:Expr2N" abstract="true" substitutionGroup="Z:Expr0N"/>
	<xs:element name="QntExpr" type="Z:QntExpr" abstract="true" substitutionGroup="Z:Expr"/>
	<xs:element name="Qnt1Expr" type="Z:Qnt1Expr" abstract="true" substitutionGroup="Z:QntExpr"/>
	<xs:element name="BindExpr" type="Z:BindExpr" substitutionGroup="Z:Expr"/>
	<xs:element name="CondExpr" type="Z:CondExpr" substitutionGroup="Z:Expr"/>
	<xs:element name="NumExpr" type="Z:NumExpr" substitutionGroup="Z:Expr"/>
	<xs:element name="RefExpr" type="Z:RefExpr" substitutionGroup="Z:Expr"/>
	<xs:element name="SchExpr" type="Z:SchExpr" substitutionGroup="Z:Expr"/>
	<xs:element name="BindSelExpr" type="Z:BindSelExpr" substitutionGroup="Z:Expr1"/>
	<xs:element name="DecorExpr" type="Z:DecorExpr" substitutionGroup="Z:Expr1"/>
	<xs:element name="HideExpr" type="Z:HideExpr" substitutionGroup="Z:Expr1"/>
	<xs:element name="NegExpr" type="Z:Expr1" substitutionGroup="Z:Expr1">
		<xs:annotation>
			<xs:documentation>Schema negation</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="PowerExpr" type="Z:Expr1" substitutionGroup="Z:Expr1"/>
	<xs:element name="PreExpr" type="Z:Expr1" substitutionGroup="Z:Expr1">
		<xs:annotation>
			<xs:documentation>Schema precondition</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="RenameExpr" type="Z:RenameExpr" substitutionGroup="Z:Expr1"/>
	<xs:element name="ThetaExpr" type="Z:ThetaExpr" substitutionGroup="Z:Expr1"/>
	<xs:element name="TupleSelExpr" type="Z:TupleSelExpr" substitutionGroup="Z:Expr1"/>
	<xs:element name="ApplExpr" type="Z:ApplExpr" substitutionGroup="Z:Expr2"/>
	<xs:element name="CompExpr" type="Z:SchExpr2" substitutionGroup="Z:SchExpr2"/>
	<xs:element name="PipeExpr" type="Z:SchExpr2" substitutionGroup="Z:SchExpr2"/>
	<xs:element name="ProjExpr" type="Z:SchExpr2" substitutionGroup="Z:SchExpr2"/>
	<xs:element name="AndExpr" type="Z:SchExpr2" substitutionGroup="Z:SchExpr2"/>
	<xs:element name="OrExpr" type="Z:SchExpr2" substitutionGroup="Z:SchExpr2"/>
	<xs:element name="ImpliesExpr" type="Z:SchExpr2" substitutionGroup="Z:SchExpr2"/>
	<xs:element name="IffExpr" type="Z:SchExpr2" substitutionGroup="Z:SchExpr2"/>
	<xs:element name="SetExpr" type="Z:Expr0N" substitutionGroup="Z:Expr0N"/>
	<xs:element name="ProdExpr" type="Z:Expr2N" substitutionGroup="Z:Expr2N"/>
	<xs:element name="TupleExpr" type="Z:Expr2N" substitutionGroup="Z:Expr2N"/>
	<xs:element name="MuExpr" type="Z:QntExpr" substitutionGroup="Z:QntExpr"/>
	<xs:element name="SetCompExpr" type="Z:QntExpr" substitutionGroup="Z:QntExpr"/>
	<xs:element name="ExistsExpr" type="Z:Qnt1Expr" substitutionGroup="Z:Qnt1Expr"/>
	<xs:element name="Exists1Expr" type="Z:Qnt1Expr" substitutionGroup="Z:Qnt1Expr"/>
	<xs:element name="ForallExpr" type="Z:Qnt1Expr" substitutionGroup="Z:Qnt1Expr"/>
	<xs:element name="LambdaExpr" type="Z:Qnt1Expr" substitutionGroup="Z:Qnt1Expr"/>
	<xs:element name="LetExpr" type="Z:Qnt1Expr" substitutionGroup="Z:Qnt1Expr">
		<xs:annotation>
			<xs:documentation>Note: the SchText should contain just several x==Expr, and no predicate.</xs:documentation>
		</xs:annotation>
	</xs:element>
	<!-- The Predicate hierarchy -->
	<xs:element name="Pred" type="Z:Pred" abstract="true"/>
	<xs:element name="Fact" type="Z:Fact" abstract="true" substitutionGroup="Z:Pred"/>
	<xs:element name="Pred2" type="Z:Pred2" abstract="true" substitutionGroup="Z:Pred"/>
	<xs:element name="QntPred" type="Z:QntPred" abstract="true" substitutionGroup="Z:Pred"/>
	<xs:element name="ExprPred" type="Z:ExprPred" substitutionGroup="Z:Pred"/>
	<xs:element name="MemPred" type="Z:MemPred" substitutionGroup="Z:Pred"/>
	<xs:element name="NegPred" type="Z:NegPred" substitutionGroup="Z:Pred"/>
	<xs:element name="FalsePred" type="Z:Fact" substitutionGroup="Z:Fact"/>
	<xs:element name="TruePred" type="Z:Fact" substitutionGroup="Z:Fact"/>
	<xs:element name="AndPred" type="Z:AndPred" substitutionGroup="Z:Pred2"/>
	<xs:element name="ImpliesPred" type="Z:Pred2" substitutionGroup="Z:Pred2"/>
	<xs:element name="IffPred" type="Z:Pred2" substitutionGroup="Z:Pred2"/>
	<xs:element name="OrPred" type="Z:Pred2" substitutionGroup="Z:Pred2"/>
	<xs:element name="ExistsPred" type="Z:QntPred" substitutionGroup="Z:QntPred"/>
	<xs:element name="Exists1Pred" type="Z:QntPred" substitutionGroup="Z:QntPred"/>
	<xs:element name="ForallPred" type="Z:QntPred" substitutionGroup="Z:QntPred"/>
	<!-- Miscellaneous Z elements -->
	<xs:element name="Parent" type="Z:Parent"/>
	<xs:element name="Freetype" type="Z:Freetype"/>
	<xs:element name="Branch" type="Z:Branch"/>
	<xs:element name="SchText" type="Z:SchText"/>
	<xs:element name="Signature" type="Z:Signature"/>
        <xs:element name="Operand" type="Z:Operand"/>
	<xs:element name="NameExprPair" type="Z:NameExprPair"/>
	<xs:element name="NameNamePair" type="Z:NameNamePair"/>
	<xs:element name="NameTypePair" type="Z:NameTypePair"/>
	<xs:element name="NameSectTypeTriple" type="Z:NameSectTypeTriple"/>

	<!-- Some standard Annotations -->
	<xs:element name="LocAnn" type="Z:LocAnn"/>
	<xs:element name="ParenAnn" type="Z:Ann">
		<xs:annotation>
			<xs:documentation>This means unnecessary parentheses surrounded the annotated element</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="SectTypeEnvAnn" type="Z:SectTypeEnvAnn"/>
	<xs:element name="TypeAnn" type="Z:TypeAnn"/>
	<xs:element name="TypeEnvAnn" type="Z:TypeEnvAnn"/>
	<!-- The Base Type hierarchy.  These usually appear inside annotations which are added by a typechecker -->
	<xs:element name="Type" type="Z:Type" abstract="true">
		<xs:annotation>
			<xs:documentation>Abstract: replacable by any Z base type</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="GenType" type="Z:GenType" substitutionGroup="Z:Type"/>
	<xs:element name="GivenType" type="Z:GivenType" substitutionGroup="Z:Type"/>
	<xs:element name="PowerType" type="Z:PowerType" substitutionGroup="Z:Type"/>
	<xs:element name="ProdType" type="Z:ProdType" substitutionGroup="Z:Type"/>
	<xs:element name="SchemaType" type="Z:SchemaType" substitutionGroup="Z:Type"/>


	<!-- Definitions of the complexTypes used above (same order as above) -->
	<xs:complexType name="TermA" mixed="false">
		<xs:annotation>
			<xs:documentation>Supertype of all ANNOTATED Z constructs</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="Anns" minOccurs="0">
				<xs:complexType mixed="false">
					<xs:sequence>
						<xs:any namespace="##any" processContents="lax" maxOccurs="unbounded"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="Spec">
		<xs:complexContent>
			<xs:extension base="Z:TermA">
				<xs:sequence>
					<xs:element ref="Z:Sect" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
				<xs:attribute name="Version" type="xs:string" use="optional" default="1.0"/>
				<xs:attribute name="Author" type="xs:string" use="optional"/>
				<xs:attribute name="Modified" type="xs:dateTime" use="optional"/>
				<xs:attribute name="Source" type="xs:anyURI" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Sect">
		<xs:annotation>
			<xs:documentation>Supertype of all sections</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:TermA"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="ZSect">
		<xs:annotation>
			<xs:documentation>A parsed Z section (may contain unparsed paragraphs)</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Sect">
				<xs:sequence>
					<xs:element name="Name" type="xs:string"/>
					<xs:element ref="Z:Parent" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element ref="Z:Para" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="UnparsedZSect">
		<xs:annotation>
			<xs:documentation>A completely unparsed Z section</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Sect">
				<xs:sequence>
					<xs:element name="Content" type="xs:anyType"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="NarrSect">
		<xs:annotation>
			<xs:documentation>Narrative before or after sections</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Sect">
				<xs:sequence>
					<xs:element name="Content" type="xs:anyType"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Para">
		<xs:annotation>
			<xs:documentation>Supertype of all paragraphs</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:TermA"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="AxPara">
		<xs:complexContent>
			<xs:extension base="Z:Para">
				<xs:sequence>
					<xs:element ref="Z:DeclName" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element ref="Z:SchText"/>
				</xs:sequence>
                                <xs:attribute name="Box" type="Z:Box" use="optional" default="AxBox"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:simpleType name="Box">
		<xs:restriction base="xs:string">
			<xs:enumeration value="OmitBox"/>
			<xs:enumeration value="AxBox"/>
			<xs:enumeration value="SchBox"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="ConjPara">
		<xs:complexContent>
			<xs:extension base="Z:Para">
				<xs:sequence>
					<xs:element ref="Z:DeclName" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element ref="Z:Pred"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="FreePara">
		<xs:complexContent>
			<xs:extension base="Z:Para">
				<xs:sequence>
					<xs:element ref="Z:Freetype" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="GivenPara">
		<xs:complexContent>
			<xs:extension base="Z:Para">
				<xs:sequence>
					<xs:element ref="Z:DeclName" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="NarrPara">
		<xs:complexContent>
			<xs:extension base="Z:Para">
				<xs:sequence>
					<xs:element name="Content" type="xs:anyType"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="OptempPara">
		<xs:complexContent>
			<xs:extension base="Z:Para">
				<xs:choice minOccurs="2" maxOccurs="unbounded">
					<xs:element name="Word" type="xs:string"/>
					<xs:element ref="Z:Operand"/>
				</xs:choice>
                                <xs:attribute name="Cat" type="Z:Cat" use="required"/>
                                <xs:attribute name="Assoc" type="Z:Assoc" use="optional" default="Left"/>
				<xs:attribute name="Prec" use="required" type="xs:nonNegativeInteger"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:simpleType name="Cat">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Relation"/>
			<xs:enumeration value="Function"/>
			<xs:enumeration value="Generic"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Assoc">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Left"/>
			<xs:enumeration value="Right"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="UnparsedPara">
		<xs:complexContent>
			<xs:extension base="Z:Para">
				<xs:sequence>
					<xs:element name="Content" type="xs:anyType"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Decl">
		<xs:annotation>
			<xs:documentation>Supertype of all declarations</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:TermA"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="ConstDecl">
		<xs:complexContent>
			<xs:extension base="Z:Decl">
				<xs:sequence>
					<xs:element ref="Z:DeclName"/>
					<xs:element ref="Z:Expr"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="InclDecl">
		<xs:complexContent>
			<xs:extension base="Z:Decl">
				<xs:sequence>
					<xs:element ref="Z:Expr"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="VarDecl">
		<xs:complexContent>
			<xs:extension base="Z:Decl">
				<xs:sequence>
					<xs:element ref="Z:DeclName" maxOccurs="unbounded"/>
					<xs:element ref="Z:Expr"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Name">
		<xs:annotation>
			<xs:documentation>Supertype of all Z names that can be decorated</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:TermA">
				<xs:sequence>
					<xs:element name="Word" type="xs:string"/>
					<xs:element ref="Z:Stroke" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="DeclName">
		<xs:complexContent>
			<xs:extension base="Z:Name">
				<xs:attribute name="Id" type="xs:ID" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="RefName">
		<xs:annotation>
			<xs:documentation>The Decl=IDREF attribute points to the matching declaration, which may not be the nearest enclosing one</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Name">
				<xs:attribute name="Decl" type="xs:IDREF" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Stroke" mixed="false">
		<xs:annotation>
			<xs:documentation>Supertype of the four kinds of name decorations</xs:documentation>
		</xs:annotation>
	</xs:complexType>
	<xs:complexType name="NumStroke">
		<xs:annotation>
			<xs:documentation>Multidigit strokes are not allowed</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Stroke">
                        	<xs:attribute name="Number" type="Z:Number" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:simpleType name="Number">
		<xs:restriction base="xs:nonNegativeInteger">
			<xs:minInclusive value="0"/>
			<xs:maxInclusive value="9"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="Expr">
		<xs:annotation>
			<xs:documentation>Supertype of all expressions</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:TermA"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Expr1">
		<xs:annotation>
			<xs:documentation>Supertype of unary expressions</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Expr">
				<xs:sequence>
					<xs:element ref="Z:Expr"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Expr2">
		<xs:annotation>
			<xs:documentation>Supertype of binary expressions</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Expr">
				<xs:sequence>
					<xs:element ref="Z:Expr" minOccurs="2" maxOccurs="2"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="SchExpr2">
		<xs:annotation>
			<xs:documentation>Supertype of binary schema operators</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Expr2"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Expr0N">
		<xs:annotation>
			<xs:documentation>Supertype of lists of 0..N expressions</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Expr">
				<xs:sequence>
					<xs:element ref="Z:Expr" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Expr2N">
		<xs:annotation>
			<xs:documentation>Supertype of lists of 2..N expressions (currently this schema does not check that there are at least two expressions, but code should)</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Expr0N"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="QntExpr">
		<xs:annotation>
			<xs:documentation>Supertype of all quantifier-like expressions</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Expr">
				<xs:sequence>
					<xs:element ref="Z:SchText"/>
					<xs:element ref="Z:Expr" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Qnt1Expr">
		<xs:annotation>
			<xs:documentation>Abstract subtype of QntExpr, with compulsory Expr (currently this schema does not check that the Expr is compulsory, but code should)</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:QntExpr"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="BindExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr">
				<xs:sequence>
					<xs:element ref="Z:NameExprPair" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="CondExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr">
				<xs:sequence>
					<xs:element ref="Z:Pred"/>
					<xs:element ref="Z:Expr" minOccurs="2" maxOccurs="2"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="NumExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr">
				<xs:attribute name="Value" type="xs:integer" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="RefExpr">
		<xs:complexContent>
			<xs:annotation>
			  <xs:documentation>The mixfix attribute distinguishes
			  S \fun T (mixfix=true) from (_ \fun _) [S, T] (mixfix=false).
			  </xs:documentation>
			</xs:annotation>
			<xs:extension base="Z:Expr">
				<xs:sequence>
					<xs:element ref="Z:RefName"/>
					<xs:element ref="Z:Expr" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
				<xs:attribute name="Mixfix" type="xs:boolean" use="optional" default="false"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="SchExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr">
				<xs:sequence>
					<xs:element ref="Z:SchText"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="BindSelExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr1">
				<xs:sequence>
					<xs:element name="Name" type="Z:RefName"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="DecorExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr1">
				<xs:sequence>
					<xs:element ref="Z:Stroke"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="HideExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr1">
				<xs:sequence>
					<xs:element name="Name" type="Z:RefName" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="RenameExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr1">
				<xs:sequence>
					<xs:element ref="Z:NameNamePair" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="ThetaExpr">
		<xs:complexContent>
			<xs:extension base="Z:Expr1">
				<xs:sequence>
					<xs:element ref="Z:Stroke" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="TupleSelExpr" >
		<xs:complexContent>
			<xs:extension base="Z:Expr1">
				<xs:attribute name="Select" type="xs:positiveInteger" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="ApplExpr">
		<xs:annotation>
		  <xs:documentation>The mixfix attribute distinguishes
		     m + n (mixfix=true) from (_ + _)(m, n) (mixfix=false).
		  </xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Expr2">
				<xs:attribute name="Mixfix" type="xs:boolean" use="optional" default="false"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Pred">
		<xs:annotation>
			<xs:documentation>Supertype of all predicates</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:TermA"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Fact">
		<xs:complexContent>
			<xs:extension base="Z:Pred"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Pred2">
		<xs:annotation>
			<xs:documentation>Supertype of binary predicates</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Pred">
				<xs:sequence>
					<xs:element ref="Z:Pred" minOccurs="2" maxOccurs="2"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="QntPred">
		<xs:annotation>
			<xs:documentation>Supertype of all quantifier-like predicates</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Pred">
				<xs:sequence>
					<xs:element ref="Z:SchText"/>
					<xs:element ref="Z:Pred"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="ExprPred">
		<xs:complexContent>
			<xs:extension base="Z:Pred">
				<xs:sequence>
					<xs:element ref="Z:Expr"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="MemPred">
		<xs:annotation>
		  <xs:documentation>The mixfix attribute distinguishes
		     m = n (mixfix=true) from (m,n) \in (_ = _) (mixfix=false).
		  </xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Pred">
				<xs:sequence>
					<xs:element ref="Z:Expr" minOccurs="2" maxOccurs="2"/>
				</xs:sequence>
				<xs:attribute name="Mixfix" type="xs:boolean" use="optional" default="false"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="NegPred">
		<xs:complexContent>
			<xs:extension base="Z:Pred">
				<xs:sequence>
					<xs:element ref="Z:Pred"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="AndPred">
		<xs:complexContent>
			<xs:extension base="Z:Pred2">
                        	<xs:attribute name="Op" type="Z:Op" use="optional" default="And"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:simpleType name="Op">
		<xs:restriction base="xs:string">
			<xs:enumeration value="And"/>
			<xs:enumeration value="NL"/>
			<xs:enumeration value="Semi"/>
			<xs:enumeration value="Chain"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="Parent">
		<xs:complexContent>
			<xs:extension base="Z:TermA">
				<xs:sequence>
					<xs:element name="Word" type="xs:string"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Freetype">
		<xs:complexContent>
			<xs:extension base="Z:TermA">
				<xs:sequence>
					<xs:element ref="Z:DeclName"/>
					<xs:element ref="Z:Branch" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Branch">
		<xs:complexContent>
			<xs:extension base="Z:TermA">
				<xs:sequence>
					<xs:element ref="Z:DeclName"/>
					<xs:element ref="Z:Expr" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="SchText">
		<xs:complexContent>
			<xs:extension base="Z:TermA">
				<xs:sequence>
					<xs:element ref="Z:Decl" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element ref="Z:Pred" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Ann" mixed="false">
		<xs:annotation>
			<xs:documentation>Supertype of all annotations</xs:documentation>
		</xs:annotation>
	</xs:complexType>
	<xs:complexType name="LocAnn">
		<xs:annotation>
			<xs:documentation>Location annotations define the source-code location of a construct.</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Ann">
				<xs:attribute name="Loc" type="xs:anyURI" use="required"/>
				<xs:attribute name="Line" type="xs:nonNegativeInteger" use="optional"/>
				<xs:attribute name="Col" type="xs:nonNegativeInteger" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="SectTypeEnvAnn">
		<xs:annotation>
			<xs:documentation>Section-Type environments map names to (SectionName,Type) pairs</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Ann">
				<xs:sequence>
					<xs:element ref="Z:NameSectTypeTriple" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="TypeAnn">
		<xs:annotation>
			<xs:documentation>Type annotations give the type of an expression/term</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Ann">
				<xs:sequence>
					<xs:element ref="Z:Type"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="TypeEnvAnn">
		<xs:annotation>
			<xs:documentation>Type environments map names to types</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:Ann">
				<xs:sequence>
					<xs:element ref="Z:NameTypePair" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Type">
		<xs:annotation>
			<xs:documentation>Supertype of all Z base types</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="Z:TermA"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="GenType">
		<xs:complexContent>
			<xs:extension base="Z:Type">
				<xs:sequence>
					<xs:element name="Name" type="Z:DeclName"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="GivenType">
		<xs:complexContent>
			<xs:extension base="Z:Type">
				<xs:sequence>
					<xs:element name="Name" type="Z:DeclName"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PowerType">
		<xs:complexContent>
			<xs:extension base="Z:Type">
				<xs:sequence>
					<xs:element ref="Z:Type"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="ProdType">
		<xs:complexContent>
			<xs:extension base="Z:Type">
				<xs:sequence>
					<xs:element ref="Z:Type" minOccurs="2" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="SchemaType">
		<xs:complexContent>
			<xs:extension base="Z:Type">
				<xs:sequence>
					<xs:element ref="Z:Signature"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="Signature">   <!-- TODO: mixed="false"? -->
		<xs:sequence>
			     <xs:element ref="Z:NameTypePair" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NameExprPair">
		<xs:sequence>
			<xs:element name="Name" type="Z:DeclName"/>
			<xs:element ref="Z:Expr"/>
		</xs:sequence>
	</xs:complexType>
        <xs:complexType name="Operand">
          <xs:attribute name="List" type="xs:boolean" default="false"/>
        </xs:complexType>
	<xs:complexType name="NameTypePair">
		<xs:sequence>
			<xs:element name="Name" type="Z:DeclName"/>
			<xs:element ref="Z:Type"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NameSectTypeTriple">
		<xs:sequence>
			<xs:element name="Name" type="Z:DeclName"/>
			<xs:element name="Sect" type="xs:string"/>
			<xs:element ref="Z:Type"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NameNamePair">
		<xs:sequence>
			<xs:element name="OldName" type="Z:RefName"/>
			<xs:element name="NewName" type="Z:DeclName"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>
