\documentclass [fleqn]{article}
\setlength {\overfullrule }{1mm}
\input{lgwinclude}

\usepackage{latexsym}

%\setlength{\parindent}{0em}
%\setlength{\parskip}{1ex}

% The font of each Logiweb construct is under tight control except that
% strings are typeset in whatever font is in effect at the time of
% typesetting. This is done to enhance the readability of strings in the
% TeX source generated by Logiweb. The default font for typesetting
% strings is \rm:
\everymath{\rm}

\usepackage{makeidx}
\usepackage{page}
\makeindex
\newcommand{\intro}[1]{\emph{#1}}
\newcommand{\indexintro}[1]{\index{#1}\intro{#1}}
\newcommand{\indexintros}[2]{\index{#1}\intro{#1#2}}
\newlength{\bracketwidth}
\settowidth{\bracketwidth}{$[{}$}
\newcommand{\back}{\protect\makebox[-1.0\bracketwidth]{}}

\usepackage[dvipdfm=true]{hyperref}
\hypersetup{pdfpagemode=none}
\hypersetup{pdfstartpage=1}
\hypersetup{pdfstartview=FitBH}
\hypersetup{pdfpagescrop={120 80 490 680}}
\hypersetup{pdftitle=A Logiweb base page}
\hypersetup{colorlinks=true}
\bibliographystyle{plain}

% \tex{something} writes something to page.otx for later inclusion
\newwrite\outex
\newtoks\toktex
\immediate\openout\outex=page.otx
\newcommand{\tex}[1]{\toktex={\item #1}\immediate\write\outex{\the\toktex}}

% \test{something} writes something to page.tst for later inclusion
\newwrite\outest
\immediate\openout\outest=page.tst
\newcommand{\test}[1]{\toktex={\item #1}\immediate\write\outest{\the\toktex}}

% Concerning \catcode`\@=11 : See the TeXbook, Appendix B (page 344).
% \afterheading suppresses indentation once, c.f. latex.ltx.
% \display{something} displays something as a displayed equation except
% that linebreaking is possible and displaymath is not turned on by default.
% The first paragraph after \display{something} is unindented.
% There may be too little space between a \display and a \section: The
% definition of \display misses something like \addvspace{\belowdisplayskip}.
\catcode`\@=11
\def\afterheading{\@afterheading}
\catcode`\@=12
\newcommand{\display}[1]{\begin{list}{}{\setlength{\leftmargin}{\mathindent}}
\item #1\end{list}

\afterheading}
\newcommand{\statement}[1]{\begin{list}{}{\setlength{\leftmargin}{0mm}}
\item #1\end{list}

\afterheading}



% Save current \parindent.

\newlength{\docparindent}
\setlength{\docparindent}{\parindent}



% To be included after each \section, \subsection, etc. when using
% (display * end display) and (statement * end statement)

\newcommand{\sect}[1]{\label{section:#1}\setlength{\parindent}{\docparindent}}



\begin {document}
\title{A Logiweb base page}
\author{Klaus Grue}
\maketitle
\tableofcontents



\section{Introduction}

This is a Logiweb \indexintro{base page}\footnote{For the convenience of the reader, things that enter the index are in italics}. The Logiweb system \cite{Logiweb} is able to bootstrap using a page like the present one. Logiweb itself is a system for machine verification and distribution of formal mathematics.

The base page contains quite a number of elementary definitions:

\begin{itemize}

\item On top of the Logiweb computing engine, the base page defines elementary operations on lists and cardinals (where \indexintro{cardinal} means \indexintro{natural number}).

\item On top of the operations on lists and cardinals, the base page defines a macro expansion facility and a number of useful macros.

\item On top of the operations on lists and cardinals, the base page defines a proof checker and a number of useful mathematical theories.

\item Finally, the base page defines how to render the syntactic constructs defined on the page in the pyk and \TeX\ languages.

\end{itemize}



\subsection{The attributes of a Logiweb page}

In general, a page has several attributes:

\begin{description}

\item[The reference]\index{reference} of a page is a cardinal that identifies the page. The reference of a page is world-wide unique. The Logiweb system includes Logiweb servers that can translate Logiweb references to Uniform Resource Locators (URLs) so that, having the reference of a page, one can locate the page without knowing which physical mirrors hold a copy of the page.

\item[The vector]\index{vector} of a page is the sequence of bytes that encode the page when it is stored on disk or transmitted over a network. All attributes of a page, including the reference, can be computed from the vector.

\item[The bibliography]\index{bibliography} of a page is a list of references to Logiweb pages. Entry number zero of the bibliography (i.e.\ the first element of the list of references) is the reference of the page itself. Appart from this self-reference, Logiweb pages and bibliographic references form a directed, acyclic graph.

\item[The dictionary]\index{dictionary} of a page is a list of all concepts defined on the page.

\item[The body]\index{body} of a page comprises all the text and definitions of the page. When a user wants to read a Logiweb page, the system renders the body of the page using the \TeX\ system and shows that to the user. What you read right now is such a rendering. % (Unless you are reading the pyk or tex sources, of course :-)

\item[The expansion]\index{expansion} of a page is the macro expanded version of the body. Proof checking is done after macro expansion.

\item[The codex]\index{codex} of a page is an associative structure for fast lookup of all definitions made on a page.

\item[The cache]\index{cache} of a page is an associative structure for fast lookup of any attribute of any referenced page.

\item[The diagnose]\index{diagnose} (if any) of a page indicates what is wrong with the page (if anything).

\end{description}



\subsection{Base pages}

A Logiweb \indexintro{base page} is a page whose Logiweb bibliography references no other pages.

As mentioned, Logiweb bibliographies form directed, acyclic graphs, so if one follows bibliographic references one can be sure to end up in a base page eventually.

What you read right now is the body of a base page. % (Unless you are reading the pyk or tex sources, of course :-)
The body does not include the Logiweb bibliography, so you cannot verify that the present page is a base page by reading the present text. The bibliography at the end of the present body is an ordinary \textsc{Bib}\TeX\ bibliography which is unrelated to the Logiweb bibliography.

To see the Logiweb bibliography of a page, you must view the page in a Logiweb browser and open the bibliography. If the page is generated from a pyk source, you may also see the Logiweb bibliography in that source.



\section{Elementary definitions}

\subsection{Proclamations}

\subsubsection{Loading}\label{section:loading}

When Logiweb reads a Logiweb page in order to ``understand'' it, we shall say that Logiweb \indexintros{load}{s} the page. Logiweb loads a page as follows:

\begin{description}

\item[Resolving] Given the reference of the page, Logiweb uses the mesh of Logiweb servers to \indexintro{resolve} the reference, i.e.\ to locate a mirror that holds a copy of the page. That mirror typically is the server of the author of the page, but important pages may exist many places.

\item[Retrieving] Once the reference is resolved into a Uniform Resource Locator (URL), Logiweb \indexintros{retrieve}{s} the vector of the page, i.e.\ the sequence of bytes that encode the page when it is stored on disk or transmitted over a network.

\item[Unpacking] Once the vector is retrieved, Logiweb \indexintros{unpack}{s} it into a bibliography, a dictionary, and a body. During this process, Logiweb recursively loads all pages referenced in the bibliography of the page.

\item[Codifying] Once the bibliography, dictionary, and body are available, Logiweb \index{codify}\intro{codifies} the body. Logiweb does so by reading the body over and over again (c.f.\ Section \ref{section:IteratedMacroExpansion}). During these iterations, Logiweb is supposed to obtain a deeper and deeper ``understanding'' of the page. The iterations end when the understanding reaches a fixed point. This is similar to \TeX\ that has to read a \TeX\ source over and over again to get the references right. The outcome of the codification is a \indexintro{codex} and an \indexintro{expansion}. The expansion is a macro expanded version of the body. The codex is an associative structure for fast lookup of all definitions made on a page.

\item[Verifying] Once the page is codified, Logiweb \index{verify}\intro{verifies} the page. Verification involves execution of the \indexintro{claim} of the page as described later. The claim of a page typically runs a proof verifyer on all proofs on the page and typically also does several other chores to ensure that the formal mathematics presented on the page is correct.

\end{description}

\noindent Once a page is loaded, Logiweb can render it using \TeX\ to produce a human readable version of it.

As a more exotic facility, Logiweb can also render a page in pyk to produce a pyk source file from which the page can be recompiled. This corresponds to ``view source'' when viewing html-pages but is more complex since Logiweb uses a compact, binary format from which the source has to be reverse engineered.

Finally, Logiweb is supposed to be able to \indexintro{execute} the page, but that is not implemented at the time of writing. The execution facility will be a general programming facility including general I/O facilities. Logiweb itself is ultimately intended to be implemented using this facility. At the time of writing, Logiweb is implemented in Lisp.



\subsubsection{Revelations}\label{section:revelations}

Logiweb has three kinds of \indexintro{revelation} constructs that connect syntactic constructs with semantic concepts. The three kinds of revelations are called \indexintros{proclamation}{s}, \indexintros{definitition}{s}, and \indexintros{introduction}{s}.

Logiweb has a small number of predefined concepts; a proclamation connects a syntactic construct with one of these predefined concepts. Definitions and introductions allow to connect syntactic constructs with user defined concepts.

On the present page, proclamations are made using the \indexintro{proclamation construct} $
[
\mathsf{x}
\bowtie
\mathsf{y}
]$\footnote{For the convenience of the reader, mathematics is enclosed in brackets to distinguish it clearly from other text. Such use of brackets is a stylistic choice which is independent of Logiweb.}. As we shall see in Section \ref{section:selfproclamation}, $
[
\mathsf{x}
\bowtie
\mathsf{y}
]$ proclaims $[
\mathsf{x}]$ to denote the concept identified by $[
\mathsf{y}]$.



\subsubsection{Logiweb symbols}

Every Logiweb construct is identified by a \indexintro{reference} and an \indexintro{identifier}, both of which are cardinals (i.e.\ natural numbers). The reference of a construct equals the reference of the page that introduces the construct. The identifier identifies the operation among all operations introduced by that page.

The reference of the $
[
\mathsf{x}
\bowtie
\mathsf{y}
]$ construct equals the reference of the present page (which is a big number) and the identifier equals one. As we shall see, it is important to Logiweb that the identifier equals one.

We shall refer to a pair consisting of the reference and identifier of a Logiweb construct as a Logiweb \indexintro{symbol}. Logiweb symbols resemble Common Lisp symbols \cite{steele} which is the same as Lisp atoms in the original sense of the word \cite{mccarthy60}.

There is a one-to-one correpondence between Logiweb symbols and Logiweb constructs. But the concepts are not identical; Logiweb constructs are things one may encounter on Logiweb pages, Logiweb symbols are pairs of integers that represent the constructs.



\subsubsection{Preconceived opinions}

To begin with, and with two exceptions, Logiweb does not assign any particular meaning to any particular construct. The general rule that Logiweb has no preconceived opinion about the meaning of constructs makes Logiweb flexible and ensures the notational freedom of each, individual author. The exceptions allow Logiweb to bootstrap.

The two exceptions relate to \indexintros{page construct}{s} and proclamation constructs.

A page construct is a Logiweb construct whose identifier equals zero. There is a one-to-one correspondence between Logiweb pages and Logiweb page constructs: Given the reference of a page, one just adds a zero to get its page construct, and given a page construct one just removes the zero to get the reference of the page.

Page constructs are used whenever there is a need to reference a page in a context that requires a symbol. As an example, Logiweb allows to assign names (i.e.\ pyk names) to symbols. Logiweb does not allow to assign names to pages. But every page has a page symbol, and the name of the page symbol effectively becomes the name of the page.

Page constructs are unrelated to the bootstrapping of Logiweb. Rather, bootstrapping depends on proclamation constructs.



\subsubsection{Bootstrapping and proclamation constructs}\label{section:Bootstrapping}

As mentioned in Section \ref{section:loading}, Logiweb codifies a page by reading its body over and over again. At each reading, Logiweb ``understands'' the page in the light of what Logiweb already knows. This knowledge includes anything Logiweb managed to extract from pages referenced in the bibliography and anything Logiweb managed to extract from the present page at the previous reading.

In one situation, Logiweb has no prior knowledge when reading a page. That happens when Logiweb reads a base page first time (recall that a base page is a Logiweb page that references no other pages).

To get started, Logiweb has the preconceived opinion that, on first reading of a base page, the symbol whose identifier equals one is a proclamation symbol.

The proclamation construct in turn has the preconceived opinion that Logiweb constructs with identifiers from $[97]$ to $[122]$ denote the small letters from a to z and that certain sequences of such letters denote particular concepts. How the constructs with identifiers from $[97]$ to $[122]$ are used to form strings is treated in Section \ref{section:strings}.



\subsubsection{Self-proclamation}\label{section:selfproclamation}

The first task of the proclamation symbol is to secure itself. Logiweb only has the preconceived opinion that the symbol whose identifier equals one is a proclamation symbol on first reading of a base page. On the second reading, Logiweb has no such preconceived opinion. For that reason, we make the following proclamation:

\display{$
[
[
\mathsf{x}
\bowtie
\mathsf{y}
]
\bowtie
\mbox{``}proclaim
\mbox{''}
]$}

The proclaimation construct happens to have the preconceived opinion that the string ``proclaim'' denotes the proclamation concept. Hence, during first reading of the present base page, Logiweb sees that $
[
\mathsf{x}
\bowtie
\mathsf{y}
]$ is proclaimed to denote proclamation and, hence, $
[
\mathsf{x}
\bowtie
\mathsf{y}
]$ denotes proclaimation during second reading of the base page. During second reading, $
[
\mathsf{x}
\bowtie
\mathsf{y}
]$ is again proclaimed to denote proclamation and, hence, $
[
\mathsf{x}
\bowtie
\mathsf{y}
]$ denotes proclaimation during third reading and so on.

Readers with plenty of spare time may find fun in constructing a base page for which the constructs whose identifiers equal two and three end up being proclamation constructs whereas the construct whose identifier equals one ends up not being a proclamation construct.



\subsection{Definitions}

\subsubsection{Aspects}

As mentioned in Section \ref{section:revelations}, Logiweb has three kinds of revelations: proclamations, definititions, and introductions. We now proclaim $
[
\mathsf{y}
\stackrel{
\mathsf{x}
}{\rightarrow}
\mathsf{z}
]$ as a construct for definitions:

\display{$
[
[
\mathsf{y}
\stackrel{
\mathsf{x}
}{\rightarrow}
\mathsf{z}
]
\bowtie
\mbox{``}define
\mbox{''}
]$}

The construct $
[
\mathsf{y}
\stackrel{
\mathsf{x}
}{\rightarrow}
\mathsf{z}
]$ states that the $[
\mathsf{x}]$ \indexintro{aspect} of $[
\mathsf{y}]$ equals $[
\mathsf{z}]$.

A mathematical definition like $ [ r ( x , y ) \doteq \sqrt{ x ^ 2 + y ^ 2 } ] $ corresponds to a Logiweb definition in which the value aspect of $  [ r ( x , y ) ] $ is defined to be $ [ \sqrt{ x ^ 2 + y ^ 2 } ] $. In general, ordinary, mathematical definitions correspond to Logiweb value definitions. Logiweb, however, allows the user to define a variety aspects of each construct.



\subsubsection{The pyk aspect}

A particular important aspect is the \index{aspect, pyk}\indexintro{pyk aspect}. We use $[
\mathrm{pyk}]$ to denote the pyk aspect:

\display{$
[
\mathrm{pyk}
\bowtie
\mbox{``}pyk
\mbox{''}
]$}

The pyk aspect of a construct indicates how to render the construct in the pyk language. That rendering allows to read a Logiweb page using an ordinary text editor. See Appendix \ref{section:PykDefinitions} for pyk definitions of each and every construct introduced on the present Logiweb page.

One may also use the pyk language for editing Logiweb pages. To construct a Logiweb page, one may prepare a pyk source file using a text editor and run the pyk file through the pyk compiler. At the time of writing, the pyk compiler is the only available tool for producing Logiweb pages. Logiweb, however, is not tied to the pyk compiler and other tools for producing Logiweb pages may emerge.



\subsubsection{The tex aspect}

The \index{tex aspect}\index{aspect, tex}\intro{tex aspect} is another important aspect. The tex aspect of a construct indicates how to render the construct in the \TeX\ language. We use $[
\mathrm{tex}]$ to denote the tex aspect:

\index{tex @\back $[
\mathrm{tex}]$ tex}%
%
\tex{$
[
\mathrm{tex}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{tex
\}
\mbox{''}
]$}%
%
\display{$
[
\mathrm{tex}
\bowtie
\mbox{``}tex
\mbox{''}
]$}

Tex definitions for the present page are collected in Appendix \ref{appendix:TeXdefinitions}. In that Appendix, one may find a definition like

\display{$
[
\mathsf{x}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mathsf{x}
]$}

\noindent which defines how to render that particular variable. For more information, see Appendix \ref{appendix:TeXdefinitions}.

Note that the tex aspect of $
\mathsf{x}$ is defined both above and in Appendix \ref{appendix:TeXdefinitions}. Logiweb just uses the definition that is leftmost after macro expansion. The pyk compiler is a little more touchy: it prints a warning if there are definitions that contradict one another. The pyk compiler accepts the two tex definitions of $
\mathsf{x}$ without notice since all the definitions are identical after macro expansion.



\subsection{Associativity and priority}

\subsubsection{Introduction}

A ``preassociative'' construct is left associative in text that runs left to right, right associative in text that runs right to left, top associative in text that runs from top to bottom, counterclockwise associative in text written in left turning spirals, and so on. Text on Logiweb pages may run in any conceivable direction. Pyk source text runs from left to right.

The pyk compiler uses associativities when parsing pyk source text. As an example, if the construct ``*~plus~*'' is preassociative then ``var~x plus var~y plus var~z'' is interpretted as ``(var~x plus var~y) plus var~z. Likewise, if ``*~pair~*'' is postassociative then ``var~x pair var~y pair var~z'' means ``var~x pair (var~y pair var~z)''.

The pyk compiler also uses priorities. As an example, it ``*~plus~*'' has greater priority than ``*~pair~*'' then ``var~x plus var~y pair var~z'' means ``(var~x plus var~y) pair var~z'' and ``var~x pair var~y plus var~z'' means ``var~x pair (var~y plus var~z)''.

If two constructs have equal priority, then they are forced to have the same associativity as well. As an example, if ``*~minus~*'' has the same priority as ``*~plus~*'' then ``*~minus~*'' automatically becomes preassociative. Hence, ``var~x plus var~y minus var~z'' means ``(var~x plus var~y) minus var~z'' and ``var~x minus var~y plus var~z'' means ``(var~x minus var~y) plus var~z''.



\subsubsection{Open and closed constructs}

A construct is said to be ``preopen'' if it starts with an asterisk and to be ``preclosed'' otherwise. Likewise, a construct is ``postopen'' and ``postclosed'' if it does and doesn't end with an asterisk, respectively.

A construct is said to be ``open'' if it is pre- and postopen and ``closed'' if it is pre- and postclosed. A construct is said to be ``prefix'' if it is preclosed and post open and ``suffix'' if it is preopen and post closed. Here are some examples:

\begin{tabular}{llll}
parenthesis * end & preclosed & postclosed & closed \\
{*} apply *       & preopen   & postopen   & open   \\
lambda * dot *    & preclosed & postopen   & prefix \\
* factorial       & preopen   & postclosed & suffix \\
\end{tabular}

None of the four constructs above are declared on this page; they are just included for the example.

Associativity and priority is irrelevant for closed constructs.

Associativity does affect prefix and suffix constructs. As an example, if ``*~apply~*'', ``lambda~*~dot~*'' and ``*~factorial'' have the same priority, then ``lambda var~x dot var~y apply var~z factorial'' means ``((lambda var~x dot var~y) apply var~z) factorial'' if the constructs are preassociative and ``lambda var~x dot (var~y apply (var~z factorial))'' if they are postassociative.



\subsubsection{Priority interference}

Prefixness and suffixness occasionally interfere with priorities. As an example, suppose ``*~apply~*'' has greater priority than ``lambda~*~dot~*'' and consider the following pyk source:

var x apply lambda var y dot var y apply var y

First step in disambiguating the text above is to put parentheses around the operator that has the lowest priority and to put parentheses around its parameters:

var x apply (lambda (var y) dot (var y apply var y))

This divides the problem into two smaller problems: disambiguating ``var~x apply~$\cdots$'' and disambiguating ``var y apply var y'' both of which are trivial:

((var x) apply (lambda (var y) dot ((var y) apply (var y))))

Hence, the principal operator of ``var~x apply lambda var~y dot var~y apply var~y'' is the leftmost ``apply'' which may be surprising since the lambda is the operator with the lowest priority.



\subsubsection{Openness coherence}

When defining the pyk and tex aspects of a construct it is important to let them have the same ``openness'', i.e. to make them both open, both closed, both prefix, or both suffix. As an example, if one renders a pair as e.g.\ $x \mathrel{:\,:} y$ which is open then one should ensure that the pyk aspect is also open as in ``* plus *''. If one renders the pair as e.g.\ $(x,y)$ which is closed then one should ensure that the pyk aspect is closed as in ``pair * comma * end pair''.

Failure to make openness coherent may seriously baffle the reader since it may make the pyk compiler and a human reader interpret terms differently.

Some constructs are non-trivial to classify. As an example, exponentiation $x^y$ is best classified as a suffix construct because $a+x^y$ could mean $(a+x)^y$ or $a+(x^y)$ whereas $x^y+a$ can only mean $(x^y)+a$ and, thus, $x^y$ is ambiguous the way suffix constructs are. Hence, the pyk name of exponentiation should be something like ``* power * end power''.



\subsubsection{Priority tables}

A Logiweb page may contain constructs from the page itself as well as constructs from all pages it references in its Logiweb bibliography.

The pyk compiler insists on knowing the associativity and priority af each non-closed construct that might possibly appear on a page. The pyk compiler is somewhat relaxed about whether or not priorities and associativities are specified for closed constructs because the associativities and priorities of such constructs have no effect.

To avoid double work, a Logiweb page should contain a priority table which the pyk compiler can import when the page is included in the Logiweb bibliography of another Logiweb page.

A page should contain one priority table, not one for each construct. Hence, the priority table is an aspect of the page rather than an aspect of each, individual construct. This is a problem because Logiweb allows to define aspects of constructs but does not allow to define aspects of pages. So what do we do?



\subsubsection{The page symbol}

As mentioned, every construct in Logiweb is identified by a reference $[r]$ and an id $[i]$, both of which are cardinals. The reference uniquely identifies the Logiweb page that introduces the construct and the id identifies the construct within the page. We shall refer to a construct with reference $[r]$ and id $[i]$ as the $[i]$'th construct of page $[r]$.

The zero'th construct of a Logiweb page will be referred to as the ``page construct'' of the page. Aspects of the page construct should be thought of as aspects that concern the entire page.

As an example, consider the following pyk definition of the page construct of the present page:

$
[
\mbox{base}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}base
\mbox{''}
]$

Because of the definition above we shall say that the present page is named ``base''.

To see that $[
\mbox{base}]$ is the page construct of the present page one has to open the present page in a Logiweb browser, find the id of the construct, and see that the id is zero. In the Logiweb crossbrowser, one may do that by opening the ``dictionary'' window. More advanced browsers would probably allow the user to click on $[
\mbox{base}]$ and view its properties somehow.

We do not define a tex aspect of the page construct, and for that reason the tex aspect defaults to \verb+\mathrm{base}+. We do not define a tex name aspect either, and for that reason the tex name aspect defaults to be identical to the tex aspect.

The page construct is forced to have arity zero, i.e. it has no parameters.



\subsubsection{The priority aspect}

The priority table is defined as a ``priority aspect'' of the page construct. We introduce the priority aspect thus:

$
[
\mathrm{prio}
\bowtie
\mbox{``}priority
\mbox{''}
]$

$
[
\mathrm{prio}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{prio
\}
\mbox{''}
]$



\subsubsection{Flush left environment}

The priority table is a long, heterogeneous formula which is difficult to linebreak. For that reason we shall typeset it \index{right, ragged}\indexintro{ragged right} or \index{left, flush}\indexintro{flush left}. To do so, we introduce a
%
\index{flush left x end left @\back $[
\mathbf{flush\ left\ }[ 
\mathsf{x}
]]$ flush left x end left}%
%
\tex{$
[
\mathbf{flush\ left\ }[ 
\mathsf{x}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}begin
\linebreak [0]\ \hskip0em plus2.0em{}
\{flushleft
\}
\#1.
\newline 
\mbox {$\backslash $}end
\linebreak [0]\ \hskip0em plus2.0em{}
\{flushleft
\}
\mbox{''}
]$}%
%
\tex{$
[
\mathbf{flush\ left\ }[ 
\mathsf{x}
]
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{flush
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}left
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}[
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ]
\mbox{''}
]$}%
%
$[
\mathbf{flush\ left\ }[ 
\mathsf{x}
]]$%
%
construct which typesets its argument with a ragged right margin.



\subsubsection{The priority table}

For convenience, we introduce a variable named $[
\ast ]$ which we use in pyk, \TeX, and priority definitions where parameter names are ignored.

The priority table itself is given in Appendix \ref{section:PriorityTable}. The number of constructs in it is colossal, but that is normal for large base pages since the table contains lots of trivia like characters and variable names.



\subsubsection{Priority table constructors}

The priority table in Appendix \ref{section:PriorityTable} is constructed from the following four constructs:

$
[
\mathbf{Preassociative}\,
\mathsf{x}
; 
\mathsf{y}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}preassociative
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}greater
\linebreak [0]\ \hskip0em plus2.0em{}than
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]$

$
[
\mathbf{Postassociative}\,
\mathsf{x}
; 
\mathsf{y}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}postassociative
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}greater
\linebreak [0]\ \hskip0em plus2.0em{}than
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]$

$
[
[
\mathsf{x}
] , \linebreak [0] 
\mathsf{y}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}priority
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]$

$
[
\mathrm{priority} \,
\mathsf{x}
\, \mathrm{end}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}priority
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}priority
\mbox{''}
]$

The pyk source of the table looks something like

\begin{verbatim}
math define priority of base as

preassociative
priority bracket var x end bracket equal
priority math var x end math equal
...
priority priority end priority

greater than preassociative
priority unicode start of text var x end unicode text equal
...
priority priority var x end priority end priority

greater than postassociative
priority var x , var y equal
priority var x [ var y ] var z end priority

greater than base end define end math
\end{verbatim}

From the structure of the table, the pyk compiler can guess that ``priority * equal *'' denotes ``equal priority'' and that ``priority * end priority'' marks the end of a list of equal priorities.

The pyk compiler can also guess that ``preassociative * greater than *'' and ``postassociative * greater than *'' denote pre- and postassociativity but cannot guess which is which. For that reason, we have to reveal that to Logiweb explicitly using proclamations:

$
[
\mathbf{Preassociative}\,
\mathsf{x}
; 
\mathsf{y}
\bowtie
\mbox{``}pre
\mbox{''}
]$

$
[
\mathbf{Postassociative}\,
\mathsf{x}
; 
\mathsf{y}
\bowtie
\mbox{``}post
\mbox{''}
]$



\subsubsection{Tex aspects}

Tex aspects of priority table constructors read:

$
[
\mathbf{Preassociative}\,
\mathsf{x}
; 
\mathsf{y}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{Preassociative
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ;
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\mathbf{Preassociative}\,
\mathsf{x}
; 
\mathsf{y}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{Preassociative
\}
\mbox {$\backslash $},
\#1.
\newline ;
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\mathbf{Postassociative}\,
\mathsf{x}
; 
\mathsf{y}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\mbox {$\backslash $}mathbf
\{Postassociative
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ;
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\mathbf{Postassociative}\,
\mathsf{x}
; 
\mathsf{y}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{Postassociative
\}
\mbox {$\backslash $},
\#1.
\newline ;
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
[
\mathsf{x}
] , \linebreak [0] 
\mathsf{y}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline ]
\linebreak [0]\ \hskip0em plus2.0em{},
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}[0]
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
[
\mathsf{x}
] , \linebreak [0] 
\mathsf{y}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\newline [
\#1.
\newline ]
\linebreak [0]\ \hskip0em plus2.0em{},
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}[0]
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\mathrm{priority} \,
\mathsf{x}
\, \mathrm{end}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline ]
\mbox{''}
]$

$
[
\mathrm{priority} \,
\mathsf{x}
\, \mathrm{end}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{priority
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\#1.
\newline 
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}mathrm
\{end
\}
\mbox{''}
]$



\subsection{Strings}\label{section:strings}

\subsubsection{Introduction}

The pyk language itself is a rather purist language that merely uses the small letters from a to z and space and newline characters for expressing Logiweb pages of arbitrary complexity. Capital letters and punktuation marks have been omitted to prepare the language for input via a microphone (it is easy, though, to adapt pyk to allow letters from other alphabets).

Furthermore, the rather purist Logiweb computing engine described elsewhere has sufficient power to render pages all the way from layout to pixels without resorting to external systems like \TeX\ or \textsc{Bib}\TeX\ or whatever. Or, at least, programs like \TeX\ may be translated to the Logiweb language, placed on a Logiweb page, and executed from there by the Logiweb engine.

During the early phases of the development of Logiweb, however, too much purism is unaffordable. \TeX\ is a very mature system that cannot be replaced overnight. To allow Logiweb pages to include \TeX\ source, the pyk language has support for strings.

The treatment of strings in the following should make sense in itself, but the motivation for going through the pain of introducing strings requires quite some overview of how all the parts of Logiweb play together.



\subsubsection{Construction of strings}

As mentioned earlier, every construct in Logiweb is identified by a reference $[r]$ and an id $[i]$, both of which are cardinals.

We shall say that a construct is ``blind'' if its id is between zero and nine, inclusive, or between 11 and 31, inclusive. We shall say that constructs whose ids equal 10 or are greater than 31 are non-blind.

When used in strings, non-blind constructs represents the character whose unicode equals the id of the construct. Blind constructs represent no characters.

As an example, The id's of the pyk construct ``unicode small a *'', ``unicode small b *'', ``unicode small c *'', and ``unicode end of text'' equal 97, 98, 99, and 3, respectively (to see that one needs access to the pyk source of the present page or needs to view the page in a Logiweb browser). The expression

\begin{quote}
unicode small a unicode small b unicode small c unicode end of text
\end{quote}

\noindent is interpretted as

\begin{quote}
unicode small a ( unicode small b ( unicode small c ( unicode end of text ) ) )
\end{quote}

\noindent When read from left to right, the id's of the constructs are 97, 98, 99, and 3. Ignoring 3 which is blind, we are left with 97, 98, and 99 which are the unicodes for ``a'', ``b'', and ``c'', respectively. For that reason,

\begin{quote}
unicode small a unicode small b unicode small c unicode end of text
\end{quote}

\noindent represents the string ``abc''.



\subsubsection{Pyk strings}

Continuing the previous example, the id of the pyk construct ``unicode start of text * end unicode text'' equals two. Whenever the pyk compiler sees a string like \verb\"abc"\ inside a mathematical expression, it translates it to

\begin{verbatim}
unicode start of text
  unicode small a
  unicode small b
  unicode small c
  unicode end of text
end unicode text
\end{verbatim}

Ignoring blind constructs, the expression above represents the string ``abc''.

Logiweb itself assigns no particular semantics to constructs like ``unicode start of text * end unicode text'' and ``unicode end of text'' whose ids equal two or three. But the pyk compiler consistently add constructs with these particular ids whenever it translates a string.

The representation of Logiweb pages is such that characters with codes below 128 take up one byte. A string like ``abc'' takes up five bytes because the start and end of text characters also take up one byte.



\subsubsection{Rendering of strings}

Rendering of ``a'', ``b'', and ``c'' is completely straighforward:

$
[a
\mathsf{x}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}a
\#1.
\mbox{''}
]$

$
[b
\mathsf{x}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}b
\#1.
\mbox{''}
]$

$
[c
\mathsf{x}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}c
\#1.
\mbox{''}
]$

Pyk and tex definitions for ``a'', ``b'', ``c'', and many other non-blind characters are collected in the appendix.



The tex aspects of the start of text character clearly show that it is blind:

$
[
\mbox{``}
\mathsf{x}
\mbox{''}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\#1.
\mbox{''}
]$

However, when talking about the start of text character it is inconvenient if it is blind. Instead, we represent it by double quotes:

$
[
\mbox{``}
\mathsf{x}
\mbox{''}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\{
\mbox {`}
\mbox {`}
\}
\#1.
\newline 
\mbox {$\backslash $}mbox
\{
\mbox {'}
\mbox {'}
\}
\mbox{''}
]$

We shall take the liberty to make the end of text character completely blind:

$
[
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\mbox{''}
]$

As you can see (or, rather, cannot see), there are no glyphs in the left hand side of the definition above. That indicates that the left hand side comprises a unicode end of text. We shall define no other constructs that are completely blind, i.e.\ blind when talking about them. Lots of constructs are blind when using them, but the unicode end of text is the only one that is blind when talking about it. The unicode end of text should be used with caution is it may baffle the reader.



\subsubsection{Rendering of special characters}

The rendering of a backslash reads:

$
[
\mbox {$\backslash $}
\mathsf{x}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\mbox {$\backslash $}
\#1.
\mbox{''}
]$

$
[
\mbox {$\backslash $}
\mathsf{x}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\{
\$
\mbox {$\backslash $}backslash
\$
\}
\#1.
\mbox{''}
]$

The tex aspect of a backslash generates a backslash character in the input to \TeX. In contrast, the tex name aspect generates a backslash in the output from \TeX.



\subsubsection{Talking about strings}

The id of the pyk construct ``text * end text'' equals six so it is yet another blind construct. The construct is rendered thus:

$
[
(
\mathsf{x}
)^{\bf t}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\mbox{''}
]$

$
[
(
\mathsf{x}
)^{\bf t}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\newline (
\#1.
\newline )
{\char94}
\{
\mbox {$\backslash $}bf
\linebreak [0]\ \hskip0em plus2.0em{}t
\}
\mbox{''}
]$

The tex aspect of ``text * end text'' is invisible in itself but has the effect that all of its argument is rendered using the tex name aspect. As an example, the expression

\begin{verbatim}
text
  unicode start of text
    unicode backslash
    unicode small b
    unicode small f
    unicode end of text
  end unicode text
end text
\end{verbatim}

generates a start double quote, a backslash, a ``b'', an ``f'', and an end double quote in the output from \TeX. Without the ``text * end text'', the expression generates \verb+\bf+ in the input to \TeX\ which makes \TeX\ change to bold face.



\subsubsection{Breaking strings}

The id of the pyk construct  ``text * plus *'' equals seven and the construct is rendered thus:

$
[
\mbox{string}(
\mathsf{x}
)+
\mathsf{y}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline 
\}
{+}
\mbox {$\backslash $}newline
\#2.
\mbox{''}
]$

$
[
\mbox{string}(
\mathsf{x}
)+
\mathsf{y}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\{string
\}(
\#1.
\newline )
{+}
\#2.
\mbox{''}
]$

A term like

\begin{verbatim}
text
  unicode start of text
    unicode small a
    unicode small b
    unicode end of text
  end unicode text
plus
  text
    unicode start of text
      unicode small c
      unicode end of text
    end unicode text
  end text
\end{verbatim}

denotes the string ``abc''. This is so because if one scans the text left to right (or scans the associated parse tree root to leaf, left to right) then one encounters the id's 7, 2, 97, 98, 3, 6, 99, 3 in that order. Ignoring blind codes leaves one with the sequence 97, 98, 99 which represents ``abc''.

The rendering of the string consists of ``ab'' on one line and ``c'' on the next. The ``text * plus *'' construct allows the author of a Logiweb page to split a long string over several lines.

The id of the ``text * plus indent *'' construct equals eight; the construct does the same as ``text * plus *'' but also indents the second line:

$
[\mbox{string}(
\mathsf{x}
)\mathrel{++}
\mathsf{y}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline 
\}
\mbox {$\backslash $};
\{
{+}
{+}
\}
\mbox {$\backslash $}newline
\{
\}
\mbox {$\backslash $}qquad
\#2.
\mbox{''}
]$

$
[\mbox{string}(
\mathsf{x}
)\mathrel{++}
\mathsf{y}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\mbox {$\backslash $}mbox
\{string
\}(
\#1.
\newline )
\mbox {$\backslash $}mathrel
\{
{+}
{+}
\}
\#2.
\mbox{''}
]$



\subsubsection{Formulas in text}

The id of the pyk construct  ``{\tt \char34} [ {\tt \char34} ] {\tt \char34}'' equals five and the construct is rendered thus:

$
[
\mathsf{x}
{[}
\mathsf{y}
{]}
\mathsf{z}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\#1.
\#2.
\#3.
\mbox{''}
]$

$
[
\mathsf{x}
{[}
\mathsf{y}
{]}
\mathsf{z}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\#1.
\newline 
\{[
\}
\#2.
\newline 
\{]
\}
\#3.
\mbox{''}
]$

As an example of use, the pyk source

\begin{verbatim}
"abc"[ math var x end math ]"def"
\end{verbatim}

is equivalent to

\begin{verbatim}
  unicode start of text
    unicode small a
    unicode small b
    unicode small c
    unicode end of text
  end unicode text
[
  math var x end math
]
  unicode start of text
    unicode small d
    unicode small e
    unicode small f
    unicode end of text
  end unicode text
\end{verbatim}

The tex face of the expression above reads

\begin{verbatim}
abc$\mathsf{x}$def
\end{verbatim}

which, when run through \TeX, places the variable ``x'' in the middle of the string ``abcdef''.

In general, the ``{\tt \char34} [ {\tt \char34} ] {\tt \char34}'' construct allows to place mathematical formulas in text.

The space character between the left bracket and the ``m'' in ``math'' above is obligatory.



\subsubsection{Juxtaposition}

The id of the pyk construct  ``{\tt \char34} , {\tt \char34}'' equals four and the construct is rendered thus:

$
[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\#1.
\#2.
\mbox{''}
]$

$
[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\{
\mbox {$\backslash $}mathrm
\{,
\}
\}
\#2.
\mbox{''}
]$

For that reason one may write

\begin{verbatim}
var x, "\cdots", var y
\end{verbatim}

to obtain $[
\mathsf{x}\cdots
\mathsf{y}]$.



\subsubsection{Purism versus pragmatism}

Purism is a good thing when defining, designing, implementing, debugging, testing, explaining, teaching, learning, understanding, and using a computational system, and one should only resort to pragmatism when neccessary. The pyk compiler is rather puristic, but resorts to pragmatism in the treatment of strings: Double quotes, brackets, and commas are treated specially and constructs whose id equal two, three, four, and five are used when translating those special characters.



\section{The Engine}

This section describes the Logiweb computing engine.

The Logiweb engine is the computing machinery that performs proof checking, macro expansion, and general evaluation in the Logiweb system.

At a later stage of the development of Logiweb, the engine is supposed to take over the layout and rendering of Logiweb pages. As mentioned previously, that task is currently done by \TeX\cite{TeXbook} and related programs.

The engine is just a computing engine; it has no facilities to communicate with the outside world. The Logiweb ``machine'' described elsewhere contains the Logiweb engine and also contains facilities for input/output.

Apart from introducing the engine, the present page also introduces a number of operations suited for manipulation of ``tagged trees''. Tagged trees are to Logiweb what Lisp S-expressions are to Lisp\cite{mccarthy60}.



\subsection{Elementary concepts}

\subsubsection{Fundamental, computable constructs}

The Logiweb engine has four fundamental, computable constructs: lambda abstraction $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$\footnote{For the convenience of the reader, mathematics is enclosed in brackets to distinguish it clearly from other text. Such use of brackets is a stylistic choice which is independent of Logiweb.}, functional application $[
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{y}]$, truth $[
\mathsf {T}]$, and conditional $[
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$.

$[
\lambda 
\mathsf{x}
.
\mathsf{y}]$ denotes lambda abstraction\cite{church41}. Lambda abstraction is a \indexintro{predefined concept} of Logiweb in the sense that knowledge of lambda abstraction is hardwired into Logiweb. Logiweb does not connect lambda abstraction with any, particular syntax, so we must connect the syntactic construct $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$ with the concept of lamdba abstraction. We do so using a proclamation: $
[
\lambda 
\mathsf{x}
.
\mathsf{y}
\bowtie
\mbox{``}lambda
\mbox{''}
]$.

The proclamation $
[
\lambda 
\mathsf{x}
.
\mathsf{y}
\bowtie
\mbox{``}lambda
\mbox{''}
]$ makes $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$ denote lambda abstraction on the present Logiweb page and on all Logiweb pages that include the present page in their Logiweb bibliography. This does not exclude other constructs from denoting lambda abstraction as well. One may proclaim any number of binary constructs to denote lambda abstraction. Neither does this exclude the possibility of using the notation $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$ for other concepts than lambda abstraction on other Logiweb pages.

$[
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{y}]$ denotes functional application. As an example, if $[
\mathsf{x}]$ equals $[
\lambda 
\mathsf{z}
.
\mathsf{z}+
3]$ then $[
\mathsf{x}
\mathbin {\mbox {'}}
2]$ equals $[
2+
3]$ which in turn equals $[
5]$. We connect syntax and semantics of functional application thus: $
[
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{y}
\bowtie
\mbox{``}apply
\mbox{''}
]$.

All computable functions can be expressed in \indexintro{pure lambda calculus}, i.e.\ using only $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$ and $[
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{y}]$. Doing so is inconvenient, however. As an example, the range of any function of pure lambda calculus contains one or infinitely many values, and one often wants a computer program to have a finite range of possible responses. Just think of a computer program which is required to loop indefinitely or answer ``yes'' or ``no'' for arbitrary input, and which is required to answer ``yes'' in certain situations and ``no'' in certain, other, situations. Such a computer program cannot be implemented in pure lambda calculus since its range is finite and contains more than one possible response.

One symptom of the inconvenience of pure lambda calculus is the difficulty of constructing models for it. Another symptom is the inability so far to construct a foundation of mathematics upon pure lambda calculus.

If one adds two more constructs, truth $[
\mathsf {T}]$ and conditional $[
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$, then the problems disappear: One may express functions like $[
\lambda 
\mathsf{x}
.
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$ whose range is finite, one may construct rather simple models\cite{berline97}, and one may extend the system into a foundation of mathematics by the drop of a quantifier\cite{grue92}.

$
[
\mathsf {T}
\bowtie
\mbox{``}true
\mbox{''}
]$ denotes truth. The main property of $[
\mathsf {T}]$ is that it differs from $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$ for all variables $[
\mathsf{x}]$ and all terms $[
\mathsf{y}]$ (of course, we make the convention that $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$ represents falsehood for all variables $[
\mathsf{x}]$ and all terms $[
\mathsf{y}]$).

Since $[
\mathsf {T}]$ is no function, it does not make sense to apply it to an argument. For completeness, however, we make the convention that $[
\mathsf {T}]$ applied to anything equals $[
\mathsf {T}]$ itself: $[
\mathsf {T}
\mathbin {\mbox {'}}
\mathsf{x}
=
\mathsf {T}]$.

$
[
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)
\bowtie
\mbox{``}if
\mbox{''}
]$ is a conditional which allows to test whether $[
\mathsf{x}]$ equals $[
\mathsf {T}]$ or is a function:

\display{$\left[
\begin {array}{
l
l
l
}
\mathrm {if}(
\mathsf {T}
,\linebreak [0]
\mathsf {u}
,\linebreak [0]
\mathsf {v}
)
&

=

&
\mathsf {u}
\\ 
\mathrm {if}(
\lambda 
\mathsf{x}
.
\mathsf{y}
,\linebreak [0]
\mathsf {u}
,\linebreak [0]
\mathsf {v}
)
&

=

&
\mathsf {v}
\end {array}\right]$}



\subsubsection{Reduction system}

The Logiweb \indexintro{reduction system} is thus:

\display{$\left[
\begin {array}{
l
l
l
}
(
\lambda 
\mathsf{x}
.
\mathsf{y}
){}^{I} 
\mathbin {\mbox {'}}
\mathsf{z}
&

\stackrel {+}{\rightarrow }

&
\langle 
\mathsf{y}
\,{|}
\mathsf{x}
{:=}\,
\mathsf{z}
\rangle 
\\ 
\mathsf {T}
\mathbin {\mbox {'}}
\mathsf{z}
&

\stackrel {+}{\rightarrow }

&
\mathsf {T}
\\ 
\mathrm {if}(
\mathsf {T}
,\linebreak [0]
\mathsf {u}
,\linebreak [0]
\mathsf {v}
)
&

\stackrel {+}{\rightarrow }

&
\mathsf {u}
\\ 
\mathrm {if}(
\lambda 
\mathsf{x}
.
\mathsf{y}
,\linebreak [0]
\mathsf {u}
,\linebreak [0]
\mathsf {v}
)
&

\stackrel {+}{\rightarrow }

&
\mathsf {v}
\end {array}\right]$}

$
\langle 
\mathsf{y}
\,{|}
\mathsf{x}
{:=}\,
\mathsf{z}
\rangle $ denotes the result of replacing all free occurrences of the variable $[
\mathsf{x}]$ in the term $[
\mathsf{y}]$ by the term $[
\mathsf{z}]$, possibly renaming bound variables as needed.

We shall say that a term $[
\mathsf{z}]$ is on \index{normal form}\indexintro{truth normal form} if the term $[
\mathsf{z}]$ is identical to $[
\mathsf {T}]$.

We shall say that a term $[
\mathsf{z}]$ is on \indexintro{function normal form} if the term $[
\mathsf{z}]$ has form $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$ where $[
\mathsf{x}]$ is a variable and $[
\mathsf{y}]$ is a term.

We shall say that a term is on \indexintro{root normal form} if the term is on truth or function normal form.

When given a term, the Logiweb engine starts reducing the term using leftmost reduction. The Logiweb engine stops again if the term reaches root normal form.



\subsubsection{Root equivalence}

We shall say that a term is a \indexintro{true term} if the engine can reduce it to truth normal form and that it is a \indexintro{function term} if it can reduce it to function normal form. We shall say that a term is \indexintro{perpetual} if the engine reduces it forever without reaching a root normal form.

We shall say that two terms are \indexintro{root equivalent} if they are both true terms, both function terms, or both perpetual. Root equivalence is undecidable in general but is decidable on terms that have a root normal form.



\subsubsection{Mathematical equality}

The Logiweb computing engine does not support the parallel ``or'' operation $[
\mathsf{x}
\parallel 
\mathsf{y}]$, but the operation is interesting for theoretical reasons. The parallel ``or'' operation has the following properties:

\display{$\left[
\begin {array}{
l
l
l
}
\mathsf {T}
\parallel 
\mathsf{y}
&

=

&
\mathsf {T}
\\ 
\mathsf{x}
\parallel 
\mathsf {T}
&

=

&
\mathsf {T}
\\ 
(
\lambda 
\mathsf{x}
.
\mathsf{y}
){}^{I} 
\parallel 
(
\lambda 
\mathsf {u}
.
\mathsf {v}
){}^{I} 
&

=

&
\lambda 
\mathsf{x}
.
\mathsf {T}
\end {array}\right]$}

If the parallel ``or'' operation were added to the Logiweb computing engine, then the engine would be required to reduce both $[
\mathsf{x}]$ and $[
\mathsf{y}]$ in parallel whenever the engine had to reduce $[
\mathsf{x}
\parallel 
\mathsf{y}]$. If the engine managed to reduce $[
\mathsf{x}]$ to $[
\mathsf {T}]$ then it should stop reducing $[
\mathsf{y}]$ and vice versa.

We shall refer to the Logiweb engine extended with parallel ``or'' as the \index{engine, parallel}\indexintro{parallel engine}.

The notions of ``root normal form'' and ``root equivalence'' are defined for the parallel engine as they are for the Logiweb engine.

Two terms $[
\mathsf{x}]$ and $[
\mathsf{y}]$ are considered \indexintro{mathematically equal}, written $[
\mathsf{x}
=
\mathsf{y}]$, if $[
\mathsf{z}
\mathbin {\mbox {'}}
\mathsf{x}]$ is root equivalent to $[
\mathsf{z}
\mathbin {\mbox {'}}
\mathsf{y}]$ for all terms $[
\mathsf{z}]$ (where the term $[
\mathsf{z}]$ is allowed to include parallel ``or''). This defines equality of term $[
\mathsf{x}]$ and $[
\mathsf{y}]$ that may include parallel ``or'' and, in particular, defines equality of terms that do not include paralle ``or''. Mathematical equality is undecidable in general.

At this point, parallel ``or'' has played its role and we shall not refer to it anymore. But we shall use mathematical equality to state things like $[
(
\lambda 
\mathsf{x}
.
\mathsf{x}
){}^{I} 
\mathbin {\mbox {'}}
\mathsf{y}
=
\mathsf{y}]$. For an axiomatization of mathematical equality see \cite{grue92}.



\subsection{Definitions}

\subsubsection{The value aspect}

One may define many ``aspects'' of each construct. As an example, the ``tex'' aspect of a construct defines how the construct should be rendered using \TeX. Likewise, the ``pyk'' aspect of a construct defines what the construct looks like in a pyk source file from which a Logiweb page may be compiled.

An ordinary mathematical definition of a construct corresponds to a definition of the \indexintro{value aspect} of the construct in Logiweb. The value aspect is proclaimed thus: $
[
\mathrm {val}
\bowtie
\mbox{``}value
\mbox{''}
]$.

As an example of a value definition, consider the following:

\display{$
[
f(
\mathsf{x}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
f(
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf {T}
)
)
]$}

With the definition above we have $[
f(
\lambda 
\mathsf{x}
.
\lambda 
\mathsf{x}
.
\lambda 
\mathsf{x}
.
\mathsf {T}
)
=
f(
\lambda 
\mathsf{x}
.
\lambda 
\mathsf{x}
.
\mathsf {T}
)
=
f(
\lambda 
\mathsf{x}
.
\mathsf {T}
)
=
f(
\mathsf {T}
)
=
\mathsf {T}]$



\subsubsection{Parentheses}

It is best to macro define parentheses, i.e.\ to define them by defining the macro aspect of the parenthesis construct. To keep the present page simple and to the point, however, we shall not deal with macro definitions here. Instead, we value define parentheses:

\display{$
[
(
\mathsf{x}
){}^{I} 
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
]$}



\subsubsection{Bottom}

As mentioned, a term is perpetual if reduction of the term proceeds indefinitely without yielding a root normal form. As an example, $[
(
\lambda 
\mathsf{x}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{x}
){}^{I} 
\mathbin {\mbox {'}}
(
\lambda 
\mathsf{x}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{x}
){}^{I} ]$ is a perpetual term. Some authors prefer to use a capital omega for that term.

There are different opinions on whether or not all perpetual terms are equal. Intuitionists will typically say that there are perpetual terms that are not provably equal. Other blends of mathematicians go further and claim there are perpetual terms that are provably different. With the definition of mathematical equality stated earlier, however, all perpetual terms are equal.

Having decided that all perputual terms are equal or, equivalently, that they all have the same value, it is reasonable to introduce a name for that unique value. We shall follow tradition and call that value \indexintro{bottom} since it lurks at the bottom of kappa-Scott domains.

Furthermore, we shall follow tradition and use $[
\bot ]$ to denote bottom. We do so by making the following definition:

\display{$
[
\bot 
\stackrel {
\mathrm {val}
}{\Rightarrow }
(
\lambda 
\mathsf{x}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{x}
){}^{I} 
\mathbin {\mbox {'}}
(
\lambda 
\mathsf{x}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{x}
){}^{I} 
]$}

The equal sign in the definition deviates slightly from the equal sign used previously. Formally, that has no effect on the definition. See Section~\ref{optimization} for further details.

With the definition above we have that $[
\bot ]$ is perpetual, since evaluating it causes a computer to look indefinitely. For that reason, the value of $[
\bot ]$ is bottom.

Mathematics is referentially transparent, meaning that any term silently denotes the value of the term. For that reason, $[
\bot ]$ denotes bottom.

By abuse of the language, we shall say that an operator \index{return $[
\bot ]$}\intro{returns} $[
\bot ]$ when the operator does not return anything ever.




\subsection{Peano trees}

\hypertarget{RawPairs}{}\subsubsection{Raw pairs}

Define

\display{$
[
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\lambda 
\mathsf{x}
.
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)
]$}

\display{$
[
\mathsf {F}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf {T}
\mathrel { \dot { . \, . } }
\mathsf {T}
]$}

\display{$
[
\mathsf{x}
{}^H
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf {T}
]$}

\display{$
[
\mathsf{x}
{}^T
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf {F}
]$}

We shall use $[
\mathsf {T}]$ and $[
\mathsf {F}]$ to denote truth and falsehood, respectively.

Furthermore, we shall use $[
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}]$ as the most fundamental (most \indexintro{raw}) among several pair constructs. The components of a pair may be found using the head operation $[
\mathsf{x}
{}^H]$ and tail operation $[
\mathsf{x}
{}^T]$:

$[
(
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}
){}^{I} 
{}^H
=
\mathsf{y}]$

$[
(
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}
){}^{I} 
{}^T
=
\mathsf{z}]$

In principle, we may use any definition for $[
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}]$ as long as it is possible to compute $[
\mathsf{y}]$ and $[
\mathsf{z}]$ from $[
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}]$. The definition above differs from anything tenable in pure lambda calculus: The range of any function in pure lambda calculus has one or infinitely many elements whereas the range of $[
(
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}
){}^{I} 
\mathbin {\mbox {'}}
\mathsf{x}]$ comprises $[
\mathsf{y}]$, $[
\mathsf{z}]$, and $[
\bot ]$.



\subsubsection{Peano trees}

As is well known, Dedekind and Peano both managed to axiomatize the natural numbers. Dedekind was first, but Peano had best public relations, so we know the axioms as the Peano axioms today.

In short, the Peano axioms are axioms for the smallest set $[N]$ which contains $[0]$ and which contains the successor of $[
\mathsf{x}]$ whenever it contains $[
\mathsf{x}]$.

Now consider the smallest set $[P]$ which contains $[
\mathsf {T}]$ and which contains $[
\mathsf{x}
\mathrel { \dot { . \, . } }
\mathsf{y}]$ whenever it contains $[
\mathsf{x}]$ and $[
\mathsf{y}]$. We shall refer to the elements of $[P]$ as \index{Peano tree}\intro{Peano trees} due to the similarity to the structure of natural numbers.

Peano trees are good substitutes for natural numbers in elementary recursion theory because it is much easier to work with ``G\"{o}del trees'' than to work with ``G\"{o}del numbers''. Peano trees are early precursors of the maps used in Map Theory and Logiweb, and they constitute convenient stepping stones for building up more advanced data structures.

In early versions of Map Theory and Logiweb, Peano trees have been called ``Binary trees'', ``Finite trees'', and ``Bintrees'', but those names are inconvenient because it is convenient to reserve ``B'' for ``Boolean'' and ``F'' for ``False''. The ``P'' in ``Peano tree'' may be mistaken to denote ``Pair'', but that is acceptable since Peano trees are little more than a bunch of pairs.

As far as possible, we shall represent data structures by Peano trees. As an example, we represented truth values by Peano trees in the previous section.



\subsubsection{Canonical and liberal representations}

In Logiweb (as in most computational systems) one has to distinguish between \indexintro{canonical} and \indexintro{liberal} representations. By a canonical representation we shall mean a representation scheme that assigns one and only one representation to each concept to be represented. By a liberal one we shall mean a representation scheme that assigns at least one.

For each set of concepts to be represented, we shall assign a canonical as well as a liberal representation. And we shall make sure the representations are \indexintro{compatible} in the sense that the canonical representation of any concept is among the liberal representations of the concept.

We make the convention that $[
\mathsf {T}]$ liberally represents truth and that any lambda abstraction liberally represents falsehood. This convention is compatible with the convention that $[
\mathsf {T}]$ represents truth and $[
\mathsf {T}
\mathrel { \dot { . \, . } }
\mathsf {T}]$ represents falsehood.

$[
\mathsf {T}]$\footnote{It is generally considered to be bad style to start a sentence with a formula. But, in my opinion, the reasons for deprecating such opening formulas disappear when formulas are consistently surrounded by brackets.} of Map Theory and Logiweb corresponds to Nil in Lisp and Null in C. Hence, the convention to let $[
\mathsf {T}]$ represent truth and anything else falsehood is opposite to the choice made in Lisp and C. But the choice is in line with G\"{o}dels choice to let 0 denote truth. G\"{o}dels choice to make the simplest possible data structure represent truth and everything else denote falsehood is a smart one; it has the consequence that when programming primitive recursive functions, one tends to treat the simple case first and the recursive case afterwards which enhances the readability of the code. G\"{o}dels 1931 paper \cite{godel} is the best example I have ever seen of ``literate programming'', and the syntax of that particular paper has been a driving force in the development of Logiweb since 1984 where the first version of the ``Pyk'' compiler was implemented. The present implementation of Logiweb depends heavily on the existence of \TeX\ and the World Wide Web.



\subsubsection{Eager pairs}

We now introduce an eager version of $[
\mathsf{x}
\mathrel { \dot { . \, . } }
\mathsf{y}]$. In many situations, the eager version is more efficient to compute than the lazy one.

Define

\display{$
[
\mathsf{x}
:
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{y}
)
]$}

\display{$
[
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
:
\mathsf{y}
:
\mathsf{x}
\mathrel { \dot { . \, . } }
\mathsf{y}
]$}

The \indexintro{guard} construct $[
\mathsf{x}
:
\mathsf{y}]$ equals $[
\bot ]$ whenever $[
\mathsf{x}]$ equals $[
\bot ]$ and equals $[
\mathsf{y}]$ otherwise. In Logiweb, one may use guards when one needs the value of one construct $[
\mathsf{y}]$ but also wants to force another construct $[
\mathsf{x}]$ to be computed.

The guard construct is used in the definition of the \indexintro{eager} pair $[
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}]$ above. Computation of $[
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}]$ forces $[
\mathsf{x}]$ and $[
\mathsf{y}]$ to be computed. Whenever $[
\mathsf{x}]$ and $[
\mathsf{y}]$ differ from $[
\bot ]$, the eager pair equals the raw pair.

We shall say that $[
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}]$ is \indexintro{strict} in $[
\mathsf{x}]$ because $[
\bot 
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}
=
\bot ]$ for all maps $[
\mathsf{y}]$.

Similarly, we shall say that $[
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}]$ is \indexintro{strict} in $[
\mathsf{y}]$ because $[
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\bot 
=
\bot ]$ for all maps $[
\mathsf{x}]$.

Furthermore, we shall say that $[
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}]$ is ``strict'' (without mentioning a particular argument) because it is strict in all arguments.

We shall say that $[
\mathsf{x}
\mathrel { \dot { . \, . } }
\mathsf{y}]$ is \indexintro{lazy} in $[
\mathsf{x}]$ because it is not strict in $[
\mathsf{x}]$ and lazy in $[
\mathsf{y}]$ for similar reasons. We shall say that $[
\mathsf{x}
\mathrel { \dot { . \, . } }
\mathsf{y}]$ is ``lazy'' (without mentioning a particular argument) because it is lazy in at least one argument.



\subsection{Cardinals}

\subsubsection{Untagged cardinals}

\index{cardinal number}\intro{Cardinal numbers} are the numbers ``one'', ``two'', ``three'', and so on as opposed to the \index{ordinal number}\intro{ordinal numbers} ``first'', ``second'', ``third'', and so on.

In set theory, the words ``cardinal'' and ``ordinal'' are used in a somewhat technical sense in which cardinals and ordinals may be infinite. We shall not use the words in that sense here.

In programming context, the word ``cardinal'' is sometimes simply used as a synonym for ``natural number''. We shall use the word in that sense here.

We shall use $[b_0
\mathrel { \underline { \dot { . \, . } } }b_1
\mathrel { \underline { \dot { . \, . } } }\cdots
\mathrel { \underline { \dot { . \, . } } }b_{n-1}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {T}]$ to represent

\display{$\left[\sum_{i=0}^{n-1} 2^i
\mathrm {if}(b_i
,\linebreak [0]0
,\linebreak [0]1
)\right]$}

As an example, $[
\mathsf {T}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {F}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {F}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {T}]$ represents six. The rightmost $[
\mathsf {T}]$ marks the end of the structure. The other elements, $[
\mathsf {T}]$, $[
\mathsf {F}]$, and $[
\mathsf {F}]$, are the bits of $[ 6 = 110_2 ]$, stated with the least significant bit first.



\subsubsection{Operations on untagged cardinals}

Define

\display{$
[
\mathsf{x}
\mathrel { \underline { {+} 2 \ast } }
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathrm {if}(
\mathsf{y}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}
)
,\linebreak [0]
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}
)
]$}

If $[
\mathsf{y}]$ is an untagged cardinal, then $[
\mathsf {T}
\mathrel { \underline { {+} 2 \ast } }
\mathsf{y}]$ represents two times $[
\mathsf{y}]$ and $[
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\mathsf{y}]$ represents one plus two times $[
\mathsf{y}]$.

$[
\mathsf{x}
\mathrel { \underline { {+} 2 \ast } }
\mathsf{y}]$ is right associative so that e.g.\ $[
\mathsf {T}
\mathrel { \underline { {+} 2 \ast } }
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\mathsf {T}]$ equals $[
\mathsf {T}
\mathrel { \underline { {+} 2 \ast } }
(
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\mathsf {T}
){}^{I} ]$ which in turn equals two.

The set of untagged cardinals is the smallest set that contains $[
\mathsf {T}]$ (which represents zero) and which contains $[
\mathsf {T}
\mathrel { \underline { {+} 2 \ast } }
\mathsf{y}]$ and $[
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\mathsf{y}]$ whenever it contains $[
\mathsf{y}]$.

Now define

\display{$
[
\mathsf{x}
{}^C
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf{x}
{}^H
{}^B
\mathrel { \underline { {+} 2 \ast } }
\mathsf{x}
{}^T
{}^C
)
]$}

For all untagged cardinals $[
\mathsf{x}]$ we have $[
\mathsf{x}
{}^C
=
\mathsf{x}]$. Furthermore we have $[
\bot 
{}^C
=
\bot ]$.

We shall say that $[
\mathsf{x}]$ is a \indexintro{lifted, untagged cardinal} if $[
\mathsf{x}]$ is an untagged cardinal or equals $[
\bot ]$. $[
\mathsf{x}
{}^C
=
\mathsf{x}]$ if and only if $[
\mathsf{x}]$ is a lifted, untagged cardinal.

Moreover, $[
\mathsf{x}
{}^C]$ is a lifted, untagged cardinal for all maps $[
\mathsf{x}]$. Hence, $[
\mathsf{x}
{}^C]$ is a construct that leaves lifted, untagged cardinals alone and converts everything else to lifted, untagged cardinals.

From the remarks above it follows that $[
\mathsf{x}
{}^C]$ is \indexintro{idempotent} in the sense that $[
\mathsf{x}
{}^C
{}^C
=
\mathsf{x}
{}^C]$ for all maps $[
\mathsf{x}]$.

We shall say that an operation is a \indexintro{normalization construct} or \indexintro{retract} for a set $[S]$ if the operation is unary, strict, idempotent, and its range equals $[ S \cup \{ 
\bot  \} ]$. Hence, $[
\mathsf{x}
{}^C]$ is a retract for untagged cardinals.



\subsubsection{Retracts and representations}

Given a map $[
\mathsf{x}]$ one may use the liberal representation of Booleans to translate the map to a Boolean and then use the canonical representation to translate the Boolean back to a map. The operation thus defined is a retract of Booleans:

\display{$
[
\mathsf{x}
{}^B
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {F}
)
]$}

In general, any pair consisting of a liberal and a canonical representation defines a retract.



\subsubsection{The untagged cardinals from zero to nine}

Define $
[
\underline {0}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
]$, $
[
\underline {1}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\underline {0}
]$, $
[
\underline {2}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { \underline { {+} 2 \ast } }
\underline {1}
]$, $
[
\underline {3}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\underline {1}
]$, $
[
\underline {4}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { \underline { {+} 2 \ast } }
\underline {2}
]$, $
[
\underline {5}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\underline {2}
]$, $
[
\underline {6}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { \underline { {+} 2 \ast } }
\underline {3}
]$, $
[
\underline {7}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\underline {3}
]$, $
[
\underline {8}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { \underline { {+} 2 \ast } }
\underline {4}
]$, and $
[
\underline {9}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { \underline { {+} 2 \ast } }
\underline {4}
]$.



\subsubsection{Tagged cardinals}

For all untagged cardinals $[
\mathsf{y}]$ we shall refer to $[
\mathsf {T}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}]$ as the corresponding \indexintro{tagged cardinal}. $[
\mathsf {T}]$ in $[
\mathsf {T}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}]$ is a \indexintro{tag} which, in a moment, allows to distringuish tagged cardinals from other data structures.



\subsubsection{Operations on tagged cardinals}

For all tagged cardinals $[
\mathsf{x}]$,

\display{$
[
\mathsf{x}
{}^U
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {if}(
\mathsf{x}
{}^H
,\linebreak [0]
\mathsf{x}
{}^T
,\linebreak [0]
\mathsf {T}
)
]$}

is the corresponding untagged cardinal. The untag operation maps data other than tagged cardinals to untagged zero or bottom.

Now define

\display{$
[
\mathsf{x}
\mathrel { {+} 2 \ast }
\mathsf{y}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf {T}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{x}
{}^B
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}
{}^U
{}^C
]$}

If $[
\mathsf{y}]$ is a tagged cardinal, then $[
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{y}]$ represents two times $[
\mathsf{y}]$ and $[
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{y}]$ represents one plus two times $[
\mathsf{y}]$.

$
[
0
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf {T}
\mathrel { \dot { . \, . } }
\mathsf {T}
]$ is a tagged zero.

The set of tagged cardinals is the smallest set that contains $[
0]$ and which contains $[
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{y}]$ and $[
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{y}]$ whenever it contains $[
\mathsf{y}]$.



\subsubsection{The tagged cardinals from one to nine}

Define $
[
1
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { {+} 2 \ast }
0
]$, $
[
2
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { {+} 2 \ast }
1
]$, $
[
3
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { {+} 2 \ast }
1
]$, $
[
4
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { {+} 2 \ast }
2
]$, $
[
5
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { {+} 2 \ast }
2
]$, $
[
6
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { {+} 2 \ast }
3
]$, $
[
7
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { {+} 2 \ast }
3
]$, $
[
8
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { {+} 2 \ast }
4
]$, and $
[
9
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { {+} 2 \ast }
4
]$



\subsection{Tagged trees}

\subsubsection{Tagged pairs}

For all $[
\mathsf{x}]$ and $[
\mathsf{y}]$, we shall refer to

\display{$
[
\mathsf{x}
\mathrel { \underline { : \, : } }
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
(
\underline {0}
\mathrel { \underline { \dot { . \, . } } }
\underline {0}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {T}
){}^{I} 
\mathrel { \underline { \dot { . \, . } } }
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}
]$}

as the \indexintro{tagged pair} of $[
\mathsf{x}]$ and $[
\mathsf{y}]$. In $[
(
\underline {0}
\mathrel { \underline { \dot { . \, . } } }
\underline {0}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {T}
){}^{I} 
\mathrel { \underline { \dot { . \, . } } }
\mathsf{x}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}]$ we shall refer to $[
\mathsf{x}]$ and $[
\mathsf{y}]$ as the head and tail, respectively, of the tagged pair.

The set of \index{tagged Peano tree}\intro{tagged Peano trees} is the smallest set which contains $[
\mathsf {T}]$ and which contains $[
\mathsf{x}
\mathrel { \underline { : \, : } }
\mathsf{y}]$ whenever $[
\mathsf{x}]$ and $[
\mathsf{y}]$ are tagged Peano trees.



\subsubsection{Cardinal trees}

The set of \index{cardinal tree}\intro{cardinal trees} is the smallest set which contains $[
\mathsf {T}]$ and all tagged cardinals and which contains $[
\mathsf{x}
\mathrel { \underline { : \, : } }
\mathsf{y}]$ whenever $[
\mathsf{x}]$ and $[
\mathsf{y}]$ are cardinal trees.

Cardinal trees are even more suited to replace G\"{o}del numbers than Peano trees are. For that reason, Logiweb represents terms by Cardinal trees. In Logiweb, terms are represented by Cardinal trees as follows:

Every operation in Logiweb is identified by a \indexintro{reference cardinal} $[
\mathsf {r}]$ and an \indexintro{id} $[
\mathsf {i}]$, which is also a cardinal. The reference cardinal uniquely identifies the home page of the operation, which is the page that introduces the operation. The id is a cardinal which identifies the operation among all operations introduced by that page.

In Logiweb, an operation with reference cardinal $[
\mathsf {r}]$ and id $[
\mathsf {i}]$ applied to arguments is represented by the cardinal tree

$[
(
(
\mathsf {r}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {i}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{x}
){}^{I} 
\mathrel { \underline { \dot { . \, . } } }
\mathsf{y}
\mathrel { \underline { \dot { . \, . } } }\cdots
\mathrel { \underline { \dot { . \, . } } }
\mathsf{z}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {T}
){}^{I} ]$

where $[
\mathsf{y},\ldots,
\mathsf{z}]$ are representations of the arguments and $[
\mathsf{x}]$ is a structure which is ignored by Logiweb except when generating human readable error messages ($[
\mathsf{x}]$ indicates the location the operation in the body before macro expansion so that a browser can locate and highlight it).



\subsubsection{Tagged maps}

We shall refer to

\display{$
[
{\cal M}(
\mathsf{x}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
(
\underline {0}
\mathrel { \underline { \dot { . \, . } } }
\underline {1}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {T}
){}^{I} 
\mathrel { \dot { . \, . } }
\mathsf{x}
]$}

as a \indexintro{tagged map} where $[
\underline {0}
\mathrel { \underline { \dot { . \, . } } }
\underline {1}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {T}]$ is the tag and $[
\mathsf{x}]$ is the map itself.

The set of \index{tagged tree}\intro{tagged trees} is the smallest set which contains $[
\mathsf {T}]$ and all tagged cardinals, which contains $[
\mathsf{x}
\mathrel { \underline { : \, : } }
\mathsf{y}]$ whenever $[
\mathsf{x}]$ and $[
\mathsf{y}]$ are tagged trees, and which contains $[
(
\underline {0}
\mathrel { \underline { \dot { . \, . } } }
\underline {1}
\mathrel { \underline { \dot { . \, . } } }
\mathsf {T}
){}^{I} 
\mathrel { \dot { . \, . } }
\mathsf{x}]$ for all maps $[
\mathsf{x}]$.



\subsubsection{The retract for tagged trees}

We define the retract for tagged trees thus:

\display{$
[
\mathsf{x}
{}^M
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathrm {if}(
\mathsf{x}
{}^H
,\linebreak [0]
\mathsf {T}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{x}
{}^T
{}^C
,\linebreak [0]
\mathrm {if}(
\mathsf{x}
{}^H
{}^T
{}^H
,\linebreak [0]
\mathsf{x}
{}^T
{}^H
{}^M
\mathrel { \underline { : \, : } }
\mathsf{x}
{}^T
{}^T
{}^M
,\linebreak [0]
{\cal M}(
\mathsf{x}
{}^T
)
)
)
)
]$}

We define the constructor operation for tagged pairs such that it normalises its arguments and, hence, is guaranteed to return $[
\bot ]$ or a tagged tree:

\display{$
[
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf{x}
{}^M
\mathrel { \underline { : \, : } }
\mathsf{y}
{}^M
]$}

Operations that retract their arguments allow certain optimizations to occur behind the scene (c.f. Section \ref{optimization}).



\subsubsection{Predicates on tagged trees}

The following predicate tests for being data (as opposed to being a tagged map):

\display{$
[
\mathsf{x}
{}^d
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf{x}
{}^M
{}^H
{}^T
{}^H
{}^B
]$}

The following predicate tests for being a cardinal:

\display{$
[
\mathsf{x}
{}^c
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf{x}
{}^M
{}^H
{}^B
)
]$}

We shall say that $[
0]$ is \indexintro{singular} among tagged cardinals, that $[
\mathsf {T}]$ is singular among tagged peano trees, and that $[
{\cal M}(
\mathsf {T}
)]$ is singular among tagged maps. Non-singular entities are called \indexintro{regular}. The following predicate tests for singularity:

\display{$
[
\mathsf{x}
{}^s
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf{x}
{}^M
{}^T
{}^B
]$}



\subsubsection{Operations on tagged trees}

We define the head of a tagged cardinal $[
\mathsf{x}]$ to be $[
\mathsf {T}]$ if $[
\mathsf{x}]$ is even and $[
\mathsf {F}]$ otherwise. All operations on tagged trees are defined such that they retract their arguments before operating on them. The head operation is defined thus:

\display{$
[
\mathsf{x}
{}^h
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathrm {if}(
\mathsf{x}
{}^d
,\linebreak [0]
\mathsf{x}
{}^M
{}^T
{}^H
,\linebreak [0]
\mathsf {T}
)
]$}

We define the tail of a tagged cardinal $[
\mathsf{x}]$ to be $[
\mathsf{x}]$ integer divided by two (i.e.\ divided by two and rounded to the nearest cardinal in the direction of minus infinity). The tail of a tagged pair is the second component of the pair. The tail of a tagged map or $[
\mathsf {T}]$ equals $[
\mathsf {T}]$:

\display{$
[
\mathsf{x}
{}^t
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathrm {if}(
\mathsf{x}
{}^d
,\linebreak [0]
\mathrm {if}(
\mathsf{x}
{}^c
,\linebreak [0]
\mathsf {T}
\mathrel { \underline { \dot { . \, . } } }
\mathsf{x}
{}^M
{}^T
{}^T
,\linebreak [0]
\mathsf{x}
{}^M
{}^T
{}^T
)
,\linebreak [0]
\mathsf {T}
)
]$}

Accessors for the zeroth to ninth element of a list $[
\mathsf{x}]$ read
\tex{$
[
\mathsf{x}
{}^{0}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{0
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{0}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^h
]$,
%
\index{x first $[
\mathsf{x}
{}^{1}]$}%
\index{\alpha x first @\back $[
\mathsf{x}
{}^{1}]$ x first}%
\tex{$
[
\mathsf{x}
{}^{1}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{1
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{1}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{0}
]$,
%
\tex{$
[
\mathsf{x}
{}^{2}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{2
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{2}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{1}
]$,
%
\tex{$
[
\mathsf{x}
{}^{3}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{3
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{3}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{2}
]$,
%
\tex{$
[
\mathsf{x}
{}^{4}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{4
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{4}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{3}
]$,
%
\tex{$
[
\mathsf{x}
{}^{5}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{5
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{5}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{4}
]$,
%
\tex{$
[
\mathsf{x}
{}^{6}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{6
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{6}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{5}
]$,
%
\tex{$
[
\mathsf{x}
{}^{7}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{7
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{7}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{6}
]$,
%
\tex{$
[
\mathsf{x}
{}^{8}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{8
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{8}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{7}
]$, and
%
\tex{$
[
\mathsf{x}
{}^{9}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{9
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{9}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^t
{}^{8}
]$.



\subsubsection{Selection}

The following operation is a retracting if-then-else construct which plays an important role in connection with optimizations and fitness and strictness analysis that occur behind the scene:

\display{$
[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathrm {if}(
\mathsf{x}
{}^M
,\linebreak [0]
\mathsf{y}
{}^M
,\linebreak [0]
\mathsf{z}
{}^M
)
]$}

We shall use selection

\display{$
[
\mathsf{x}
\left\{\protect \begin {array}{l}
\mathsf{y}
\\
\mathsf{z}
\protect \end {array}\right.
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)
]$}

as an alternative for $[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$. It would be very natural to macro define selection, but macro definitions depend on the Logiweb self-interpretter which in turn depends on the definitions presented on the present page. To keep the present page simple and to the point, we omit introducing the notion of macro definitions and, hence, avoid macro defining selection.



\subsubsection{Semitagged maps}

We introduce a \indexintro{semitagged} representation of maps as follows:

\begin{enumerate}

\item The canonical representation of a map $[
\mathsf {m}]$ is $[
{\cal M}(
\mathsf {m}
)]$.

\item Any tagged tree $[
\mathsf{x}]$ liberally represents the map $[
\mathrm {If}(
\mathsf{x}
{}^d
,\linebreak [0]
\mathsf{x}
,\linebreak [0]
\mathsf{x}
{}^T
)]$.

\end{enumerate}

$[
{\cal U}(
\mathsf{x}
)]$ returns the map represented by the semitagged $[
\mathsf{x}]$. The untagger $[
{\cal U}(
\mathsf{x}
)]$ leaves tagged data untouched and untags tagged maps:

\display{$
[
\tilde {{\cal U}}(
\mathsf{x}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {if}(
\mathsf{x}
{}^d
,\linebreak [0]
\mathsf{x}
,\linebreak [0]
\mathsf{x}
{}^T
)
]$}

\display{$
[
{\cal U}(
\mathsf{x}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\tilde {{\cal U}}(
\mathsf{x}
{}^M
)
]$}

The construct $[
\mathbf {apply}(
\mathsf {f}
,
\mathsf{x}
)]$ applies a tagged map $[
\mathsf {f}]$ to a semitagged map $[
\mathsf{x}]$ and returns the result as a tagged map. If $[
\mathsf {f}]$ is tagged data then $[
\mathbf {apply}(
\mathsf {f}
,
\mathsf{x}
)]$ equals $[
\mathsf {f}]$:

\display{$
[
\mathbf {apply}(
\mathsf {f}
,
\mathsf{x}
)
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathbf {apply}_1(
\mathsf {f}
{}^M
,
\mathsf{x}
{}^M
)
]$}

\display{$
[
\mathbf {apply}_1(
\mathsf {f}
,
\mathsf{x}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {f}
{}^d
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{x}
{}^d
,\linebreak [0]
\mathsf {f}
,\linebreak [0]
\mathsf {f}
)
\\
\mathrm {If}(
\mathsf{x}
{}^d
,\linebreak [0]
{\cal M}(
\mathsf {f}
{}^T
\mathbin {\mbox {'}}
\mathsf{x}
)
,\linebreak [0]
{\cal M}(
\mathsf {f}
{}^T
\mathbin {\mbox {'}}
(
\mathsf{x}
{}^T
){}^{I} 
)
)
\protect \end {array}\right.
]$}

A short version of $[
\mathbf {apply}(
\mathsf {f}
,
\mathsf{x}
)]$ reads:

\display{$
[
\mathsf {f}
\mathbin {\mbox {`}}
\mathsf{x}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathbf {apply}(
\mathsf {f}
,
\mathsf{x}
)
]$}

We shall also introduce a tagged version of lambda abstraction. Logiweb, however, does not support value definitions of new binding constructs. This is convenient for designers of proof systems who can rely on lambda being the only binding construct in Logiweb.

In Logiweb it is the intension that new binding constructs should be macro defined so that binding constructs are expanded into lambdas before proof checking. At the present stage of the bootstrap of Logiweb, however, we do not yet have macro definitions.

For that reason we introduce a unary operator $[
\Lambda 
\mathsf{x}]$ and use $[
\Lambda 
\lambda 
\mathsf{x}
.
\mathsf{y}]$ to denote tagged lambda abstraction. At a later stage we introduce a construct that macro expands into $[
\Lambda 
\lambda 
\mathsf{x}
.
\mathsf{y}]$. We define $[
\Lambda 
\mathsf{x}]$ thus:

\display{$
[
\Lambda 
\mathsf{x}
\stackrel {
\mathrm {val}
}{\Rightarrow }
{\cal M}(
\lambda 
\mathsf {u}
.
{\cal U}(
\mathsf{x}
\mathbin {\mbox {'}}
{\cal M}(
\mathsf {u}
)
)
)
]$}

$[
{\cal U}^M(
\mathsf{x}
)]$ is a version of $[
{\cal U}(
\mathsf{x}
)]$ which untags and then normalizes a semitagged map.

\display{$
[
{\cal U}^M(
\mathsf{x}
)
\stackrel {
\mathrm {val}
}{\Rightarrow }
{\cal U}(
\mathsf{x}
)
{}^M
]$}



\subsection{Optimization}\label{optimization}

\subsubsection{On-stage and off-stage semantics}

The Logiweb computing engine maintains an \indexintro{on-stage semantics} and \indexintro{off-stage semantics}. The on-stage semantics concerns the input-output relation of operations. The off-stage semantics concerns the run time and memory usage of operations.

One needs to know the on-stage semantics to make correct programs and one needs to know the off-stage semantics to make efficient programs.

The on-stage semantics of operations must be the same on all implementations of Logiweb. The off-stage semantics may vary considerably. For that reason, it is only possible to say something definite about the on-stage semantics. The remarks on off-stage semantics below concern one, particular implementation of the Logiweb computing engine which we shall refer to as the \indexintro{first edition engine}.

The on-stage semantics of $[
\mathsf{x}
{}^h]$ is that the Logiweb computing engine reduces $[
\mathsf{x}
{}^h]$ to $[
\mathsf{x}
{}^M
{}^T
{}^H]$ because of the definition $
[
\mathsf{x}
{}^h
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf{x}
{}^M
{}^T
{}^H
]$.

Logiweb has three kinds of \indexintro{revelation} constructs that connect syntactic constructs with semantic concepts. The three kinds of revelations are called proclamations, definititions, and introductions. The revelation of $[
\mathsf{x}
{}^h]$ above is an introduction rather than a definition. One can see that by looking at the equal sign which deviates from a normal equal sign.

The first edition engine maintains a list of constructs that it can compute using hardcoded functions. Whenever the first edition engine sees an introduction, it runs through its list of known constructs to see, if it can recognize the construct being introduced. When doing so, the first edition engine is insensitive to names of bound variables, names of parameters, and names of auxiliary functions, but apart from that the engine merely recognises an introduction if its right hand side is identical to something the engine knows. If the first edition engine cannot recognize an introduction, it prints a warning and treats the introduction as if it were a definition.

The notion of introduction is proclaimed: $
[
[
\mathsf{y}
\stackrel {
\mathsf{x}
}{\Rightarrow }
\mathsf{z}
]
\bowtie
\mbox{``}introduce
\mbox{''}
]$.

On the first-edition engine, the off-stage semantics of $[
\mathsf{x}
{}^h]$ is that, behind the scenes, the engine converts the argument of $[
\mathsf{x}
{}^h]$ to an internal, efficient representation, then manipulates that internal representation, and then converts the internal representation back to maps.

The conversion back and forth takes time, but the manipulation of the internal representation is fast. When computing a single head operation, it does not pay off to round the internal representation. But when performing a long sequence of head and other, hardcoded operations, the engine merely has to convert back and forth once at the beginning and end of the computation.



\subsubsection{Optimized bottom}

The revelation $
[
\bot 
\stackrel {
\mathrm {val}
}{\Rightarrow }
(
\lambda 
\mathsf{x}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{x}
){}^{I} 
\mathbin {\mbox {'}}
(
\lambda 
\mathsf{x}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{x}
){}^{I} 
]$ of bottom is an introduction

Bottom has the property that evaluation of it never returns a value. Genuine bottom $[
(
\lambda 
\mathsf{x}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{x}
){}^{I} 
\mathbin {\mbox {'}}
(
\lambda 
\mathsf{x}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{x}
){}^{I} ]$ never returns a value because it makes the computer run forever.

As any other optimized construct, optimized bottom must have exactly the same behavior as genuine bottom and, hence, optimized bottom must avoid returning a value. When evaluated on the first edition engine, optimized bottom signals an irrecoverable error and, hence, satisfies the requirements.

Another valid implementation of optimized bottom would be to let it decrease the priority of the current operating system process so much that the process received no more cpu-time.

The Logiweb machine described later is multitasking, so the latter implementation of optimized bottom would be reasonable there.

Please never do ``bessermachen'' by introducing a construct that can test for optimized bottomness. That would ruin the applicative behaviour of the Logiweb reduction system. If a bottomness test seems desirable to have in some situation, consider using exceptions and exception handling instead; and don't try to solve Turings halting problem.



\subsubsection{Strictness}

Define

\display{$
[
\mathsf{x}
\wedge 
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {F}
)
\\
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf {F}
)
\protect \end {array}\right.
]$}

We shall say that $[
\mathsf{x}
\wedge 
\mathsf{y}]$ is \indexintro{strict} in its first argument because

\display{$\left[
\bot 
\wedge 
\mathsf{y}
=
\bot \right]$}

When an equation contains a free variable, it is understood that the equation holds for all values of the free variable. Hence, above, it is understood that the equation holds for all $[
\mathsf{y}]$.

We shall say that $[
\mathsf{x}
\wedge 
\mathsf{y}]$ is strict in its second argument because

\display{$\left[
\mathsf{x}
\wedge 
\bot 
=
\bot \right]$}

We shall say that $[
\mathsf{x}
\wedge 
\mathsf{y}]$ is strict because it is strict in all its arguments.



\subsubsection{Types}

We shall say that that the return value of $[
\mathsf{x}
\wedge 
\mathsf{y}]$ is of \indexintro{type} tagged tree because

$[
(
\mathsf{x}
\wedge 
\mathsf{y}
){}^{I} 
{}^M
=
\mathsf{x}
\wedge 
\mathsf{y}]$

We shall say that the first argument of $[
\mathsf{x}
\wedge 
\mathsf{y}]$ is of type tagged tree because

$[
\mathsf{x}
{}^M
\wedge 
\mathsf{y}
=
\mathsf{x}
\wedge 
\mathsf{y}]$

Likewise, we shall say that the second argument of $[
\mathsf{x}
\wedge 
\mathsf{y}]$ is of type tagged tree because

$[
\mathsf{x}
\wedge 
\mathsf{y}
{}^M
=
\mathsf{x}
\wedge 
\mathsf{y}]$

Summing up, we shall say that $[
\mathsf{x}
\wedge 
\mathsf{y}]$ is an \indexintro{operation over} tagged trees because its return value and all its arguments are of type tagged tree.

Being an operation over tagged trees does not exclude being an operation over other types as well.



\subsubsection{User defined strict operations}

We shall say that an operation is \indexintro{fit for optimization} if the first edition engine can prove that the operation is a strict operation over tagged trees. The first edition engine translates operations that are fit for optimization in a particularly efficient way.

Users of the first edition engine need some understanding of fitness for optimization in order to make definitions that the first edition engine can compute efficiently.

We shall refer to $[
\mathsf {T}]$, $[
0]$, $[
\mathsf{x}
{}^M]$, $[
\mathsf{x}
\mathrel { {+} 2 \ast }
\mathsf{y}]$, $[
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}]$, $[
\mathsf{x}
{}^h]$, $[
\mathsf{x}
{}^t]$, $[
\mathsf{x}
{}^s]$, $[
\mathsf{x}
{}^c]$, and $[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$ as the \indexintro{basic tagged tree operations}.

The first edition engine knows that the basic tagged tree operations are operations over tagged trees and that all but $[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$ are strict.

From this the first edition engine can deduce that all operations defined from these constructs are operations over tagged trees. This includes operations that are defined by recursion or mutual recursion. There is one pathological exception, though. A projection operation like $[f(
\mathsf{x},
\mathsf{y})
=
\mathsf{x}]$ may be defined using the functions above zero times but is not an operation over tagged trees.



\subsubsection{Fitness analysis}

Operations defined from the basic tagged tree operations need not be strict because $[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$ is non-strict. But the first edition engine performs fitness analysis as follows:

The engine classifies all operations as ``fit'', ``unfit'', or ``possibly fit'' for optimization. As a fourth classification, the engine classifies $[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$ as a ``conditional''.

Among the four elementary, computable constructs, the engine classifies $[
\mathsf {T}]$ as fit and $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$, $[
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf{y}]$, and $[
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$ as unfit.

Among the basic tagged tree operations the engine classifies $[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$ as a conditional and the other ones as fit.

The engine classifies all other operations as possibly fit, except that it classifies projection operations as unfit. Then the engine reclassifies possibly fit operations as unfit according to certain rules described in the following. And when no further operations can be reclassified as unfit, all remaining possibly fit operations are reclassified as fit.

In other words, operations are considered fit unless they are provably unfit. This happens to be completely safe.

Possibly fit operations are reclassified as unfit according to two rules:

A possibly fit operation is reclassified as unfit if its definition contains an unfit operation.

A possibly fit operation if reclassified as unfit if some variable one the left hand side of the definition does not occur strict in the right hand side where ``occurs strict'' is defined in the next section.



\subsubsection{Strict variables}

Possibly fit operations are reclassified as unfit according to two rules. The first is rather simple:

A possibly fit operation is reclassified as unfit if its definition contains an unfit operation.

The other rule is more complex and makes reference to the notion of a \indexintro{strict variable}. The notion of a strict variable is similar to the notion of a free variable. In fact, the strict variables of a term comprise a subset of the free variables of the term.

The notion of strict variables of a term $[{\cal A}]$ is defined by structural induction in $[{\cal A}]$ by the following three cases:

If the term $[{\cal A}]$ is the variable $[
\mathsf{x}]$, then the strict variables of $[{\cal A}]$ comprises $[
\mathsf{x}]$.

If the term $[{\cal A}]$ is an operation applied to subtrees and the operation is not classified as conditional, then the free variables of $[{\cal A}]$ comprises the strict variables of the subtrees.

If the term $[{\cal A}]$ is a conditional operation applied to three subtrees like $[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$, then the strict variables of $[{\cal A}]$ comprises the strict variables of $[
\mathsf{x}]$ plus all variables that occur strict in both $[
\mathsf{y}]$ and $[
\mathsf{z}]$.

As an example, $[
\mathsf{x}]$ and $[
\mathsf{y}]$ are the strict variables of $[
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf{z}
,\linebreak [0]
\mathsf{y}
)
)]$.



\subsubsection{Fitness of conjunction}

The first edition engine classifies

\display{$
[
\mathsf{x}
\wedge 
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {F}
)
\\
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf {F}
)
\protect \end {array}\right.
]$}

as fit for optimization because conjunction is not the conditional construct and because the engine does not classify conjunction as unfit. The engine does not classify conjunction as unfit because the right hand side of the definition above contains no unfit operations and because both variables, $[
\mathsf{x}]$ and $[
\mathsf{y}]$, occur strict in the right hand side.



\subsubsection{Logical connectives}

Define

\display{$
[
{\neg }
\mathsf{x}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf {T}
)
]$}

\display{$
[
\mathsf{x}
\vee 
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {T}
)
\\
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {F}
)
\protect \end {array}\right.
]$}

The operations above are fit for optimization.

Sometimes, when programming, it is useful to have lazy versions of the connectives that compute the first argument before they decide whether or not to compute the second, but we shall not need them here.

If such lazy connectives are needed, one should consider to macro define them rather than value defining them. If lazy connectives are value defined, they will be classified as unfit for optimization. On the contrary, if they are macro defined they will be macro expanded away before fitness analysis and, hence, they can be used for defining operations that are fit for optimization.



\subsubsection{Auxiliary operations}

Parentheses cannot occur in definitions that are fit for optimization since $[
(
\mathsf{x}
){}^{I} ]$ does not normalize its argument.

Later, we macro define parentheses. Once parentheses are macro defined, they disappear from terms before fitness analysis. Hence, once parentheses are macro defined, they can be used in optimizable definitions. Until we macro define parentheses, we shall use a normalizing version of parentheses:

\display{$
[
(
\mathsf{x}
)^M
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^M
]$}

The following normalizing guard operation can be used in definitions for making the defined function strict:

\display{$
[
\mathsf{x}
!
\mathsf{y}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{y}
)
]$}



\subsubsection{Equality}

Define

\display{$
[
\mathsf{x}
\approx 
\mathsf{y}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf{x}
{}^d
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
{}^d
,\linebreak [0]
\mathsf{x}
\stackrel {D}{\approx }
\mathsf{y}
,\linebreak [0]
\mathsf {F}
)
\\
\mathrm {If}(
\mathsf{y}
{}^d
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf {T}
)
\protect \end {array}\right.
]$}

\display{$
[
\mathsf{x}
\stackrel {D}{\approx }
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^c
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
{}^c
,\linebreak [0]
\mathsf{x}
\stackrel {C}{\approx }
\mathsf{y}
,\linebreak [0]
\mathsf {F}
)
\\
\mathrm {If}(
\mathsf{y}
{}^c
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf{x}
\stackrel {P}{\approx }
\mathsf{y}
)
\protect \end {array}\right.
]$}

\display{$
[
\mathsf{x}
\stackrel {C}{\approx }
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^s
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
{}^s
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {F}
)
\\
\mathrm {If}(
\mathsf{y}
{}^s
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf{x}
{}^h
\stackrel {B}{\approx }
\mathsf{y}
{}^h
\wedge 
\mathsf{x}
{}^t
\stackrel {C}{\approx }
\mathsf{y}
{}^t
)
\protect \end {array}\right.
]$}

\display{$
[
\mathsf{x}
\stackrel {B}{\approx }
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {F}
)
\\
\mathrm {If}(
\mathsf{y}
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf {T}
)
\protect \end {array}\right.
]$}

\display{$
[
\mathsf{x}
\stackrel {P}{\approx }
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^s
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
{}^s
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {F}
)
\\
\mathrm {If}(
\mathsf{y}
{}^s
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf{x}
{}^h
\approx 
\mathsf{y}
{}^h
\wedge 
\mathsf{x}
{}^t
\approx 
\mathsf{y}
{}^t
)
\protect \end {array}\right.
]$}

$[
\mathsf{x}
\approx 
\mathsf{y}]$ is an example of an operation defined by mutual recursion which is fit for optimization.



\subsection{Arithmetic}

\subsubsection{Addition}

Addition of cardinals is defined thus:

%
\index{\alpha x plus y @\back $[
\mathsf{x}
+ 
\mathsf{y}]$ x plus y}%
%
\index{x plus y $[
\mathsf{x}
+ 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
+ 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
{+}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
+ 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^c
\wedge 
\mathsf{y}
{}^c
,\linebreak [0]
\mathsf{x}
\mathop{+_0} 
\mathsf{y}
,\linebreak [0]
\mathsf {T}
)
]$%
%
}
%

%
\index{\alpha x plus zero y @\back $[
\mathsf{x}
\mathop{+_0} 
\mathsf{y}]$ x plus zero y}%
%
\index{x plus zero y $[
\mathsf{x}
\mathop{+_0} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathop{+_0} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathop
\{
{+}
\_0
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathop{+_0} 
\mathsf{y}
\mathrel {\dot {=}}
\mathsf{x}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{y}
\\
\mathsf{y}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{x}
\\
\mathsf{x}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{+_0} 
\mathsf{y}
{}^t
\\
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{+_0} 
\mathsf{y}
{}^t
\protect \end {array}\right.
\\
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{+_0} 
\mathsf{y}
{}^t
\\
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{+_1} 
\mathsf{y}
{}^t
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

%
\index{\alpha x plus one y @\back $[
\mathsf{x}
\mathop{+_1} 
\mathsf{y}]$ x plus one y}%
%
\index{x plus one y $[
\mathsf{x}
\mathop{+_1} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathop{+_1} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathop
\{
{+}
\_1
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathop{+_1} 
\mathsf{y}
\mathrel {\dot {=}}
\mathsf{x}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{y}
\mathop{+_0} 
1
\\
\mathsf{y}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{x}
\mathop{+_0} 
1
\\
\mathsf{x}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{+_0} 
\mathsf{y}
{}^t
\\
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{+_1} 
\mathsf{y}
{}^t
\protect \end {array}\right.
\\
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{+_1} 
\mathsf{y}
{}^t
\\
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{+_1} 
\mathsf{y}
{}^t
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

\test{$
\relax [ 
\mathsf {T}
+ 
0
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
+ 
\mathsf {T}
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
+ 
\mathsf {T}
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
+ 
0
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
+ 
1
\approx 
1
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
+ 
2
\approx 
2
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
+ 
3
\approx 
3
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
+ 
0
\approx 
1
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
+ 
1
\approx 
2
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
+ 
2
\approx 
3
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
+ 
3
\approx 
4
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
+ 
0
\approx 
2
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
+ 
1
\approx 
3
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
+ 
2
\approx 
4
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
+ 
3
\approx 
5
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
+ 
0
\approx 
3
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
+ 
1
\approx 
4
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
+ 
2
\approx 
5
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
+ 
3
\approx 
6
\relax ]^{\cdot} $}



\subsubsection{Comparison}

Comparison of cardinals is defined thus:

%
\index{\alpha x less y @\back $[
\mathsf{x}
< 
\mathsf{y}]$ x less y}%
%
\index{x less y $[
\mathsf{x}
< 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
< 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
{<}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
< 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^c
\wedge 
\mathsf{y}
{}^c
,\linebreak [0]
\mathsf{x}
<' 
\mathsf{y}
,\linebreak [0]
\mathsf {F}
)
]$%
%
}
%

%
\index{\alpha x less zero y @\back $[
\mathsf{x}
<' 
\mathsf{y}]$ x less zero y}%
%
\index{x less zero y $[
\mathsf{x}
<' 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
<' 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
{<}
\mbox {'}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
<' 
\mathsf{y}
\mathrel {\dot {=}}
\mathsf{y}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{x}
!
\mathsf {F}
\\
\mathsf{x}
{}^s
\left\{\protect \begin {array}{l}
\mathsf {T}
\\
\mathsf{x}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{x}
{}^t
<' 
\mathsf{y}
{}^t
\\
\mathsf{x}
{}^t
\le' 
\mathsf{y}
{}^t
\protect \end {array}\right.
\\
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{x}
{}^t
<' 
\mathsf{y}
{}^t
\\
\mathsf{x}
{}^t
<' 
\mathsf{y}
{}^t
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

%
\index{\alpha x less one y @\back $[
\mathsf{x}
\le' 
\mathsf{y}]$ x less one y}%
%
\index{x less one y $[
\mathsf{x}
\le' 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\le' 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}le
\mbox {'}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\le' 
\mathsf{y}
\mathrel {\dot {=}}
\mathsf{x}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{y}
!
\mathsf {T}
\\
\mathsf{y}
{}^s
\left\{\protect \begin {array}{l}
\mathsf {F}
\\
\mathsf{x}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{x}
{}^t
\le' 
\mathsf{y}
{}^t
\\
\mathsf{x}
{}^t
\le' 
\mathsf{y}
{}^t
\protect \end {array}\right.
\\
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{x}
{}^t
<' 
\mathsf{y}
{}^t
\\
\mathsf{x}
{}^t
\le' 
\mathsf{y}
{}^t
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

\test{$
\relax [ 
\mathsf {T}
< 
0
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
< 
\mathsf {T}
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
< 
\mathsf {T}
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
< 
0
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
< 
1
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
< 
2
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
< 
3
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
< 
0
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
< 
1
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
< 
2
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
< 
3
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
< 
0
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
< 
1
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
< 
2
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
< 
3
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
< 
0
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
< 
1
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
< 
2
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
< 
3
\approx 
\mathsf {F}
\relax ]^{\cdot} $}



\subsubsection{Subtraction}

Subtraction of cardinals is defined below. Subtraction yields zero when a large number is subtracted from a small.

%
\index{\alpha x minus y @\back $[
\mathsf{x}
- 
\mathsf{y}]$ x minus y}%
%
\index{x minus y $[
\mathsf{x}
- 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
- 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox{-}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
- 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^c
\wedge 
\mathsf{y}
{}^c
,\linebreak [0]
\mathrm {If}(
\mathsf{x}
< 
\mathsf{y}
,\linebreak [0]
0
,\linebreak [0]
\mathsf{x}
\mathop{-_0} 
\mathsf{y}
)
,\linebreak [0]
\mathsf {T}
)
]$%
%
}
%

%
\index{\alpha x minus zero y @\back $[
\mathsf{x}
\mathop{-_0} 
\mathsf{y}]$ x minus zero y}%
%
\index{x minus zero y $[
\mathsf{x}
\mathop{-_0} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathop{-_0} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathop
\{
\mbox{-}
\_0
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathop{-_0} 
\mathsf{y}
\mathrel {\dot {=}}
\mathsf{y}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{x}
\\
\mathsf{x}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{-_0} 
\mathsf{y}
{}^t
\\
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{-_1} 
\mathsf{y}
{}^t
\protect \end {array}\right.
\\
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{-_0} 
\mathsf{y}
{}^t
\\
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{-_0} 
\mathsf{y}
{}^t
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

%
\index{\alpha x minus one y @\back $[
\mathsf{x}
\mathop{-_1} 
\mathsf{y}]$ x minus one y}%
%
\index{x minus one y $[
\mathsf{x}
\mathop{-_1} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathop{-_1} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathop
\{
\mbox{-}
\_1
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathop{-_1} 
\mathsf{y}
\mathrel {\dot {=}}
\mathsf{y}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{x}
\mathop{-_0} 
1
\\
\mathsf{x}
{}^h
\left\{\protect \begin {array}{l}
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{-_1} 
\mathsf{y}
{}^t
\\
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{-_1} 
\mathsf{y}
{}^t
\protect \end {array}\right.
\\
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{-_0} 
\mathsf{y}
{}^t
\\
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^t
\mathop{-_1} 
\mathsf{y}
{}^t
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

\test{$
\relax [ 
\mathsf {T}
- 
0
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
- 
\mathsf {T}
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
- 
\mathsf {T}
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
- 
0
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
- 
1
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
- 
2
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
- 
3
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
- 
0
\approx 
1
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
- 
1
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
- 
2
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
- 
3
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
- 
0
\approx 
2
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
- 
1
\approx 
1
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
- 
2
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
- 
3
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
- 
0
\approx 
3
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
- 
1
\approx 
2
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
- 
2
\approx 
1
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
- 
3
\approx 
0
\relax ]^{\cdot} $}



\subsubsection{Multiplication}

Multiplication of cardinals is defined thus:

%
\index{\alpha x times y @\back $[
\mathsf{x}
\cdot 
\mathsf{y}]$ x times y}%
%
\index{x times y $[
\mathsf{x}
\cdot 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\cdot 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}cdot
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\cdot 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^c
\wedge 
\mathsf{y}
{}^c
,\linebreak [0]
\mathsf{x}
\cdot_0 
\mathsf{y}
,\linebreak [0]
\mathsf {T}
)
]$%
%
}
%

%
\index{\alpha x times zero y @\back $[
\mathsf{x}
\cdot_0 
\mathsf{y}]$ x times zero y}%
%
\index{x times zero y $[
\mathsf{x}
\cdot_0 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\cdot_0 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}cdot
\_0
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\cdot_0 
\mathsf{y}
\mathrel {\dot {=}}
\mathsf{y}
{}^s
\left\{\protect \begin {array}{l}
\mathsf{x}
!
0
\\
\mathsf{y}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
\cdot_0 
\mathsf{y}
{}^t
\\
(
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
\cdot_0 
\mathsf{y}
{}^t
)^M
\mathop{+_0} 
\mathsf{x}
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

\test{$
\relax [ 
\mathsf {T}
\cdot 
0
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
\cdot 
\mathsf {T}
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
\cdot 
\mathsf {T}
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
\cdot 
0
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
\cdot 
1
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
\cdot 
2
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
0
\cdot 
3
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
\cdot 
0
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
\cdot 
1
\approx 
1
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
\cdot 
2
\approx 
2
\relax ]^{\cdot} $}
\test{$
\relax [ 
1
\cdot 
3
\approx 
3
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
\cdot 
0
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
\cdot 
1
\approx 
2
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
\cdot 
2
\approx 
4
\relax ]^{\cdot} $}
\test{$
\relax [ 
2
\cdot 
3
\approx 
6
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
\cdot 
0
\approx 
0
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
\cdot 
1
\approx 
3
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
\cdot 
2
\approx 
6
\relax ]^{\cdot} $}
\test{$
\relax [ 
3
\cdot 
3
\approx 
9
\relax ]^{\cdot} $}



\subsubsection{Bit access}

$[
bit( 
\mathsf{x}
, 
\mathsf{y}
)]$ is true if bit number $[
\mathsf{x}]$ of the cardinal $[
\mathsf{y}]$ is zero. The least significant bit is bit number zero.

%
\index{bit @\back $[
bit( 
\mathsf{x}
, 
\mathsf{y}
)]$ bit x of y end bit}%
%
\tex{$
[
bit( 
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline bit(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
bit( 
\mathsf{x}
, 
\mathsf{y}
)
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^c
\wedge 
\mathsf{y}
{}^c
,\linebreak [0]
bit_1( 
\mathsf{x}
, 
\mathsf{y}
)
,\linebreak [0]
\mathsf {T}
)
]$%
%
}
%

%
\index{bit 1 @\back $[
bit_1( 
\mathsf{x}
, 
\mathsf{y}
)]$ bit one x of y end bit}%
%
\tex{$
[
bit_1( 
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline bit
\_1(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
bit_1( 
\mathsf{x}
, 
\mathsf{y}
)
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^s
,\linebreak [0]
\mathsf{y}
{}^h
,\linebreak [0]
bit( 
\mathsf{x}
- 
1
, 
\mathsf{y}
{}^t
)
)
]$%
%
}
%

\test{$
\relax [ 
bit( 
\mathsf {T}
, 
0
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
0
, 
\mathsf {T}
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
\mathsf {T}
, 
\mathsf {T}
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
0
, 
0
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
0
, 
1
)
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
0
, 
2
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
0
, 
3
)
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
1
, 
0
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
1
, 
1
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
1
, 
2
)
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
1
, 
3
)
\approx 
\mathsf {F}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
2
, 
0
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
2
, 
1
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
2
, 
2
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
2
, 
3
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
3
, 
0
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
3
, 
1
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
3
, 
2
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
bit( 
3
, 
3
)
\approx 
\mathsf {T}
\relax ]^{\cdot} $}



\subsection{Quoting}

\subsubsection{Terms}

Terms have form $[
(
\mathsf {r}
\mathrel { : \, : }
\mathsf {i}
\mathrel { : \, : }
\mathsf {d}
){}^{I} 
\mathrel { : \, : }
\mathsf {a}]$ where $[
\mathsf {r}]$ and $[
\mathsf {i}]$ are the reference and identifier, respectively, of the root symbol of the term and the argument list $[
\mathsf {a}]$ is a list of terms. The debugging information $[
\mathsf {d}]$ indicates the location of the root symbol on the page and allows a browser to highlight the root symbol even if the root symbol has been moved around by such processes as macro expansion.

Accessors for the reference, identifier, and debug information of a term $[
\mathsf{x}]$ read
%
\index{x ref $[
\mathsf{x}
{}^{r}]$}%
\index{r: $[
\mathsf{x}
{}^{r}]$ x ref}%
\tex{$
[
\mathsf{x}
{}^{r}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{r
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{r}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^h
{}^h
]$,
%
\index{x id $[
\mathsf{x}
{}^{i}]$}%
\index{i: $[
\mathsf{x}
{}^{i}]$ x id}%
\tex{$
[
\mathsf{x}
{}^{i}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{i
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{i}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^h
{}^t
{}^h
]$, and
%
\index{x debug $[
\mathsf{x}
{}^{d}]$}%
\index{d: $[
\mathsf{x}
{}^{d}]$ x debug}%
\tex{$
[
\mathsf{x}
{}^{d}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{d
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{d}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^h
{}^t
{}^t
]$,
%
respectively.

\index{x root $[
\mathsf{x}
{}^{R}]$}%
\index{R: $[
\mathsf{x}
{}^{R}]$ x root}%
\tex{$
[
\mathsf{x}
{}^{R}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}
\{R
\}
\mbox{''}
]$}$
[
\mathsf{x}
{}^{R}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^{r}
\mathrel { : \, : }
\mathsf{x}
{}^{i}
\mathrel { : \, : }
\mathsf {T}
]$
%
returns the root of the term $[
\mathsf{x}]$ without debugging information.

%
\index{x term root equal y $[
\mathsf{x}
\stackrel{r}{=} 
\mathsf{y}]$}%
%
\index{r: $[
\mathsf{x}
\stackrel{r}{=} 
\mathsf{y}]$ x term root equal y}%
%
\index{\alpha x term root equal y@\back $[
\mathsf{x}
\stackrel{r}{=} 
\mathsf{y}]$ x term root equal y}%
%
\tex{$
[
\mathsf{x}
\stackrel{r}{=} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\{r
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\stackrel{r}{=} 
\mathsf{y}]$%
%
is true if the roots of the terms $[
\mathsf{x}]$ and $[
\mathsf{y}]$ are equal except for debugging information:

\display{$
[
\mathsf{x}
\stackrel{r}{=} 
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {If}(
\mathsf{x}
{}^{r}
\approx 
\mathsf{y}
{}^{r}
,\linebreak [0]
\mathsf{x}
{}^{i}
\approx 
\mathsf{y}
{}^{i}
,\linebreak [0]
\mathsf {F}
)
]$}

When testing two terms for identity, one should disregard debugging information. $[
\mathsf{x}
\stackrel {t}{=}
\mathsf{y}]$ tests two terms $[
\mathsf{x}]$ and $[
\mathsf{y}]$ for identity disregarding debugging information:

\display{$
[
\mathsf{x}
\stackrel {t}{=}
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {If}(
\mathsf{x}
\stackrel{r}{=} 
\mathsf{y}
,\linebreak [0]
\mathsf{x}
{}^t
\stackrel {t^*}{=}
\mathsf{y}
{}^t
,\linebreak [0]
\mathsf {F}
)
]$}

$[
\mathsf{x}
\stackrel {t^*}{=}
\mathsf{y}]$ tests two lists $[
\mathsf{x}]$ and $[
\mathsf{y}]$ of terms for identity disregarding debugging information:

\display{$
[
\mathsf{x}
\stackrel {t^*}{=}
\mathsf{y}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
{}^a
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{y}
{}^a
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {F}
)
\\
\mathrm {If}(
\mathsf{y}
{}^a
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathrm {If}(
\mathsf{x}
{}^h
\stackrel {t}{=}
\mathsf{y}
{}^h
,\linebreak [0]
\mathsf{x}
{}^t
\stackrel {t^*}{=}
\mathsf{y}
{}^t
,\linebreak [0]
\mathsf {F}
)
)
\protect \end {array}\right.
]$}



\subsubsection{G{\"o}del trees}\label{section:GodelTrees}

In addition to the fundamental, computable constructs $[
\mathsf {T}]$, $[
\lambda 
\mathsf{x}
.
\mathsf{y}]$, $[
\mathsf {f}
\mathbin {\mbox {'}}
\mathsf{x}]$, and $[
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)]$ we introduce the \indexintro{quote} construct $[
\lceil {\cal A}
\rceil ]$ for pragmatic reasons.

The quote construct is computable but does not add to the computational power of the Logiweb engine. If it were omitted from Logiweb, one could replace it with a macro defined construct.

The quote construct resembles ``quote'' in Lisp \cite{mccarthy60} and G{\"o}del numbers as introduced in \cite{godel}.

The reason for introducing quoting as a fundamental construct rather than macro defining it is that a macro defined quote would expand into rather large terms. In other words, quotes are introduced to enhance the efficiency of the macro facility. End users will probably prefer ``backquote'' like macros that are based on the quote construct rather than using quote raw.

The quote construct is proclaimed thus:

\display{$
[
\lceil 
\mathsf{x}
\rceil 
\bowtie
\mbox{``}quote
\mbox{''}
]$}

For a term $[{\cal A}]$, $[
\lceil {\cal A}
\rceil ]$ denotes the tagged tree that represents $[{\cal A}]$. As an example,

\display{$\left[
\lceil 
\mathsf{x}
\approx 
\mathsf{y}
\rceil \right]$}

is the tagged tree that represents the term $[
\mathsf{x}
\approx 
\mathsf{y}]$. We have

\display{$\left[
\lceil 
\mathsf{x}
\approx 
\mathsf{y}
\rceil 
=
(
\mathsf {r}
\mathrel { : \, : }
\mathsf {i}
\mathrel { : \, : }
\mathsf {d}
\mathrel { : \, : }
\mathsf {T}
){}^{I} 
\mathrel { : \, : }
\lceil 
\mathsf{x}
\rceil 
\mathrel { : \, : }
\lceil 
\mathsf{y}
\rceil 
\mathrel { : \, : }
\mathsf {T}\right]$}

except for debugging information present in each occurrence of $[
\mathsf{x}]$ and $[
\mathsf{y}]$.

The $[
\mathsf {r}]$ and $[
\mathsf {i}]$ above are the reference and identifier, respectively, of the $[
\ast 
\approx 
\ast ]$ symbol. The reference $[
\mathsf {r}]$ is a large cardinal (around 200 bits long) which identifies the home page of the $[
\ast 
\approx 
\ast ]$ symbol, i.e.\ the page on which the $[
\ast 
\approx 
\ast ]$ symbol is introduced. The identifier $[
\mathsf {i}]$ identifies the $[
\ast 
\approx 
\ast ]$ symbol among all symbols introduced on that page.

The $[
\mathsf {d}]$ above is debugging information that indicates the location of the particular instance of the $[
\ast 
\approx 
\ast ]$ symbol. The value of $[
\mathsf {d}]$ has form $[
\mathsf {p}
_{
1
}
\mathrel { : \, : }
\mathsf {p}
_{
2
}
\mathrel { : \, : }\cdots
\mathrel { : \, : }
\mathsf {p}
_{
\mathsf {n}
}
\mathrel { : \, : }
\mathsf {q}
\mathrel { : \, : }
\mathsf {T}]$ which indicates that the particular instance of the $[
\ast 
\approx 
\ast ]$ symbol occurs as the $
\mathsf {p}
_{
1
}$'s subtree of the $
\mathsf {p}
_{
2
}$'s subtree of the $
\mathsf {p}
_{
3
}$'s subtree etc.\ of page $[
\mathsf {q}]$. Since the particular instance of the $[
\ast 
\approx 
\ast ]$ symbol occurs on the present page we have that $[
\mathsf {q}]$ equals the reference of the present page.

In general, $[
\lceil {\cal A}
\rceil 
{}^t]$ is the list of subterms of the term $[{\cal A}]$ and $[
\lceil {\cal A}
\rceil 
{}^h]$ represents the identity and location of the root symbol of the term. As an example,

\display{$\left[
\lceil 
\mathsf{x}
\approx 
\mathsf{y}
\rceil 
{}^{r}\right]$}

and

\display{$\left[
\lceil 
\mathsf{x}
\approx 
\mathsf{y}
\rceil 
{}^{i}\right]$}

are the reference and identifier, respectively, of the equality construct. As another example, we have

\display{$\left[
\lceil 
\mbox{base}
\rceil 
{}^{i}
=
0\right]$}

because the identifier of the page symbol $[
\mbox{base}]$ is zero.



\section{The macro expansion facility}

This section describes the macro expansion facility of Logiweb\cite{Logiweb}. The macro facility allows expressions that are easy to read for humans to expand into more machine readable formats before computer consumption.



\subsection{Logiweb identifiers}

\subsubsection{Representation scheme}\label{section:RepresentationScheme}

Occasionally, we shall represent strings of characters by cardinals. To translate a string

\[ [ c_1 c_2 \cdots c_m ] \]

of characters to a cardinal, we proceed as follows. First, we mirror the string to get:

\[ [ c_m \cdots c_2 c_1 ] \]

Then we translate each character $[c_i]$ into its Unicode representation $[u_i]$, yielding a list of cardinals:

\[ [ u_m \cdots u_2 u_1 ] \]

Then we express each cardinal $ [ u _ i ] $ as a sequence of digits

\[ [ d _ { i n _ i } \cdots d _ { i 1 } d _ { i 0 } ] \]

in radix $ [ 128 ] $ such that $ [ 0 \le d _ { i j } < 128 ] $ and such that

\[ u _ i = \left[ \sum _ { j = 0 } ^ { n _ i } d _ { i j } 128 ^ j \right] \]

In addition, we require $ [ d _ { i n _ i } \neq 0 ] $ except when $ [ u _ i = 0 ] $ in which case we require $ [ n _ i = 1 ] $ instead.

Next, we add 128 do all digits except leading ones, i.e. we define

\[ \left[ d' _ { i j } = \left\{ \begin{array}{ll}

d _ { i j } + 128 & \mbox{if $ 0 \le j < n _ i $} \\

d _ { i j } & \mbox{if $ j = n _ i $} \\

\end{array} \right. \right] \]

This gives rise to a sequence

\[ \begin{array}{llllr}

[ & d' _ { m n _ m } & \cdots & d' _ { m 0 } \\

  & \cdots \\

  & d' _ { 2 n _ 2 } & \cdots & d' _ { 2 0 } \\

  & d' _ { 1 n _ 1 } & \cdots & d' _ { 1 0 } & ] \\

\end{array} \]

of cardinals in the range from $[0]$ to $[255]$. Renumbering the sequence above gives the sequence

\[ [ d''_p \cdots d''_1 d''_0 ] \]

which we then interpret as a sequence of digits in radix 256, so that we represent the string

\[ [ c_1 c_2 \cdots c_m ] \]

by the cardinal

\[ c = \left[ \sum _ { k = 0 } ^ p d'' _ k 256 ^ k \right] \]



\subsubsection{Representation of ASCII strings}

Logiweb ASCII is a character encoding that is very close to the American Standard Code for Information Interchange (ASCII). The differences are:

In Logiweb ASCII, character codes in the ranges $[0.\,.9]$ and $[11.\,.31]$ as well as character code $[127]$ are \index{dead character code}\intro{dead} character codes in the sense that if they occur in input, they should be discarded before they make their way into strings.

In Logiweb ASCII, character code $[10]$, nothing but character code $[10]$, and always character code $[10]$, represents the newline character.

Logiweb ASCII is similar to ASCII in that no characters have codes outside $[0.\,.127]$.

Logiweb ASCII has two formatting character: newline (code $[10]$) and space (code $[32]$). All characters in the range $[33.\,.126]$ are printable glyphs.

When running Logiweb under some host operating system, the convention that character $[10]$ is the newline character may equate or differ from the convention of the host operating system. In the very few cases where strings are exchanged between Logiweb and surrounding systems, one should translate between the newline conventions of Logiweb and the surroundings during the exchange.

Translation from ASCII strings to cardinals and vice versa is particularly simple. To translate e.g. the string ``abc'', do as follows. First, write the string backwards: ``cba''. Then convert each character to an eight bit byte:

\[ [ 0110 \ 0011 \quad 0110 \ 0010 \quad 0110 \ 0001 ] \]

Finally, interpret the result as a binary number.

Needless to say (so we say it for safety's sake), the above representation of ASCII strings by cardinals is quite memory efficient.



\subsubsection{Constructors for binary numbers}

To express binary numbers easily, we introduce the following three constructs:

\display{$
[
\mathsf{x}
0
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{x}
]$}

\display{$
[
\mathsf{x}
1
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf{x}
]$}

\display{$
[
0 \mathrm {b}
\stackrel{
\mathrm {val}
}{\rightarrow}
0
]$}



\subsubsection{Representation of Logiweb identifiers}\label{section:RepresentationOfLogiwebIdentifiers}

We shall refer to a particular, short, finite list of strings as \index{identifier, Logiweb}\index{Logiweb identifier}\intro{Logiweb indentifiers}. The list of identifiers, and the semantics of each identifier, is at the heart of the Logiweb standard. At the time of writing I, the author of the present paper, control that list.

Each Logiweb indentifier has the property that it only includes Unicode characters from 97 to 122 (small letter a to small letter z). Now define

%
\index{identifier @\back $[
identifier( 
\mathsf{x}
)]$ identifier x end identifier}%
%
\tex{$
[
identifier( 
\mathsf{x}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline identifier(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline )
\mbox{''}
]$}%
%
\display{$
[
identifier( 
\mathsf{x}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {If}(
\mathsf{x}
{}^t
,\linebreak [0]
0
,\linebreak [0]
identifier_{1}( 
\mathsf{x}
{}^{i}
, 
identifier( 
\mathsf{x}
{}^{1}
)
)
)
]$}%
%

%
\index{identifier 1 @\back $[
identifier_{1}( 
\mathsf{x}
, 
\mathsf{y}
)]$ identifier one x plus id y end identifier}%
%
\tex{$
[
identifier_{1}( 
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline identifier
\_
\{1
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
identifier_{1}( 
\mathsf{x}
, 
\mathsf{y}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {If}(
\mathsf{x}
{}^{6}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{x}
{}^{0}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^{1}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^{2}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^{3}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^{4}
\mathrel { {+} 2 \ast }
\mathsf{x}
{}^{5}
\mathrel { {+} 2 \ast }
\mathsf {F}
\mathrel { {+} 2 \ast }
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf{y}
)
]$}%
%

We have that e.g. $[
identifier( 
\lceil 
\mbox{``}code
\mbox{''}
\rceil 
)]$ is the string $[
\mbox{``}code
\mbox{''}]$ translated to the cardinal specified in Section \ref{section:RepresentationScheme}:

\display{$
\relax [ 
identifier( 
\lceil 
\mbox{``}code
\mbox{''}
\rceil 
)
\approx 
0 \mathrm {b}
1
1
0
0
1
0
1
0
1
1
0
0
1
0
0
0
1
1
0
1
1
1
1
0
1
1
0
0
0
1
1
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
identifier( 
\lceil 
\mbox{``}code
\mbox{''}
\rceil 
)
\approx 
0 \mathrm {b}
1
1
0
0
1
0
1
0
1
1
0
0
1
0
0
0
1
1
0
1
1
1
1
0
1
1
0
0
0
1
1
\relax ]^{\cdot} $}

In general, $[
identifier( 
\lceil {\cal A}
\rceil 
)]$ converts the string $[{\cal A}]$ correctly under the following conditions:

\begin{itemize}

\item All non-blind characters of the string are between 64 and 126

\item All blind characters of the string are between 0 and 9 or between 11 and 31.

\item All characters are represented by unary operators except the end-of-text character, which must be nulary and blind.

\end{itemize}



\subsection{Associative structures}

\subsubsection{Associations trees}

We define the set of \index{association}\intro{associations} as the set of pairs $[
\mathsf {k}
\mathrel { : \, : }
\mathsf {v}]$ where $[
\mathsf {k}]$ is a cardinal and $[
\mathsf {v}]$ is a tagged tree. For an association $[
\mathsf {k}
\mathrel { : \, : }
\mathsf {v}]$ we shall refer to $[
\mathsf {k}]$ and $[
\mathsf {v}]$ as the \indexintro{key} and \indexintro{value} of the association, respectively.

We define the set of \index{association tree}\intro{association trees} as the smallest set which contains $[
\mathsf {T}]$, which contains all associations, and which contains $[
\mathsf {a}
\mathrel { : \, : }
\mathsf {b}]$ for all association trees $[
\mathsf {a}]$ and $[
\mathsf {b}]$. Each association tree represents a finite set of associations.

If all keys of an association tree $[
\mathsf {a}]$ are distinct, then $[
\mathsf {a}]$ represents the function that maps $[
\mathsf {k}]$ to $[
\mathsf {v}]$ whenever $[
\mathsf {k}
\mathrel { : \, : }
\mathsf {v}]$ belongs to $[
\mathsf {a}]$ and maps $[
\mathsf {k}]$ to $[
\mathsf {T}]$ whenever $[
\mathsf {k}]$ is a cardinal which does not occur as a key in $[
\mathsf {a}]$.

In particular, the association tree $[
\mathsf {T}]$ represents the function that maps all cardinals to $[
\mathsf {T}]$.



\subsubsection{Finite functions}

We shall say that a function $[
\mathsf {f}]$ is a \indexintro{finite function} if it maps cardinals to tagged trees and, furthermore, maps at most finitely many cardinals to tagged trees different from $[
\mathsf {T}]$.

One may represent finite functions by association trees.



\subsubsection{Addresses}

Each association in an association tree $[
\mathsf {a}]$ can be accessed using a sequence of head and tail operations. As an example, if $[
\mathsf {a}]$ is an association tree and $[
\mathsf {a}
{}^h
{}^t
{}^h
{}^h]$ is an association, then the association can be addressed by a head-tail-head-head sequence.

We now represent ``head'' by binary zero and ``tail'' by binary one. As an example, if $[
\mathsf {a}]$ is an association tree and $[
\mathsf {a}
{}^h
{}^t
{}^h
{}^h]$ is an association then we say that the association occurs at address $ [ 0 , 1 , 0 , 0 ] $.



\subsubsection{Arrays}

A cardinal $[
\mathsf {k}]$ may be written on form

\[ \left[ \sum_{n=0}^{\infty} b_n 2^n \right] \]

where $ [ b_0 , b_1 , b_2 , \ldots ] $ are bits (i.e.\ ``binary terms'', i.e.\ zero or one). We shall refer to $ [ b_0 , b_1 , b_2 , \ldots ] $ as the little endian, infinite binary representation of $[
\mathsf {k}]$.

We shall say that an association tree $[
\mathsf {a}]$ is an \indexintro{array} if it satisfies the following two conditions:

\begin{enumerate}

\item For every association $[
\mathsf {k}
\mathrel { : \, : }
\mathsf {v}]$ in $[
\mathsf {a}]$, the address of the association is a prefix of the little endian, infinite binary representation of $[
\mathsf {k}]$.

\item No substructure of $[
\mathsf {a}]$ has form $[
\mathsf {T}
\mathrel { : \, : }
\mathsf {p}]$ or $[
\mathsf {p}
\mathrel { : \, : }
\mathsf {T}]$ where $[
\mathsf {p}]$ is an association.

\end{enumerate}

The first condition makes it fast and easy to look up a key $[
\mathsf {k}]$ in an array. The second condition together with the first ensures that each finite function is represented by exactly one array.



\subsubsection{Array access}

We shall say that a data structure is \indexintro{atomic} if it is not a pair. $[
\mathsf{x}
{}^a]$ is true if $[
\mathsf{x}]$ is atomic:

\display{$
[
\mathsf{x}
{}^a
\stackrel{
\mathrm {val}
}{\rightarrow}
{\neg }
\mathsf{x}
{}^d
\vee 
\mathsf{x}
{}^c
\vee 
\mathsf{x}
{}^s
]$}

$[
\mathsf {a}
{[}
\mathsf {k}
{]}]$ looks up the value associated to the key $[
\mathsf {k}]$ in the array $[
\mathsf {a}]$:

\display{$
[
\mathsf {a}
{[}
\mathsf {k}
{]}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathbf {assoc}_1(
\mathsf {a}
,
\mathsf {k}
,
\mathsf {k}
)
]$}

\display{$
[
\mathbf {assoc}_1(
\mathsf {a}
,
\mathsf {d}
,
\mathsf {i}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {a}
{}^a
\left\{\protect \begin {array}{l}
\mathsf {d}
!
\mathsf {i}
!
\mathsf {T}
\\
\mathsf {a}
{}^h
{}^c
\left\{\protect \begin {array}{l}
\mathsf {i}
\approx 
\mathsf {a}
{}^h
\left\{\protect \begin {array}{l}
\mathsf {d}
!
\mathsf {a}
{}^t
\\
\mathsf {d}
!
\mathsf {T}
\protect \end {array}\right.
\\
\mathsf {d}
{}^h
\left\{\protect \begin {array}{l}
\mathbf {assoc}_1(
\mathsf {a}
{}^h
,
\mathsf {d}
{}^t
,
\mathsf {i}
)
\\
\mathbf {assoc}_1(
\mathsf {a}
{}^t
,
\mathsf {d}
{}^t
,
\mathsf {i}
)
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$}

The above representation of arrays allows array access and update to occur reasonably efficiently. If even greater efficiency is needed, one may implement arrays as hash tables behind the scenes. The first edition engine (the only Logiweb engine in existence at the time of writing) does not treat arrays specially behind the scenes. But arrays are still defined the way they are in order to allow improvements in the future.

As a matter of terminology, we shall refer to keys of arrays as \index{array index}\index{index (of array)}\intro{incices}. So an array maps indices to values.



\subsubsection{Racks}

Formally, we shall use ``\indexintro{rack}'' as a synonym for ``array''. Informally, we shall use ``array'' and ``rack'' for homogeneous and heterogeneous structures, respectively. So an array is an association list whose values are of homogeneous format and a rack is an association list with heterogeneous values.

As a matter of terminology, we shall refer to keys of racks as \index{hook}\intro{hooks}. So a rack maps hooks to values.



\subsubsection{Multidimensional arrays}

We shall refer to arbitrary values as \index{zero dimensional array}\intro{zero dimensional arrays} and to arrays of $[n]$-dimensional arrays as $[n+1]$-dimensional arrays. As an example, if $[
\mathsf {a}]$ is a three-dimensional array and $[
\mathsf {u}]$, $[
\mathsf {v}]$, and $[
\mathsf {w}]$ are cardinals, then

\display{$\left[
\mathsf {a}
{[}
\mathsf {u}
{]}
{[}
\mathsf {v}
{]}
{[}
\mathsf {w}
{]}\right]$}

is the value indexed by $[
\mathsf {u}]$, $[
\mathsf {v}]$, and $[
\mathsf {w}]$.



\subsubsection{Array assignment}

$[
\mathsf {a}
[ 
\mathsf {i}
{\rightarrow} 
\mathsf {v}
]]$ equals the array $[
\mathsf {a}]$ except that $[
\mathsf {a}
[ 
\mathsf {i}
{\rightarrow} 
\mathsf {v}
]]$ maps the index $[
\mathsf {i}]$ to the value $[
\mathsf {v}]$.

%
\index{\alpha x set y to z end set @\back $[
\mathsf{x}
[ 
\mathsf{y}
{\rightarrow} 
\mathsf{z}
]]$ x set y to z end set}%
%
\index{x set y to z end set $[
\mathsf{x}
[ 
\mathsf{y}
{\rightarrow} 
\mathsf{z}
]]$t}%
%
\tex{$
[
\mathsf {a}
[ 
\mathsf {i}
{\rightarrow} 
\mathsf {v}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\{
\mbox {$\backslash $}rightarrow
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ]
\mbox{''}
]$}%
%
\display{$
[
\mathsf {a}
[ 
\mathsf {i}
{\rightarrow} 
\mathsf {v}
]
\mathrel {\dot {=}}
\mathsf {i}
{}^c
\left\{\protect \begin {array}{l}
\mathsf {v}
\left\{\protect \begin {array}{l}
array\mbox{-}\linebreak[0]remove( 
\mathsf {i}
, 
\mathsf {a}
, 
0
)
\\
array\mbox{-}\linebreak[0]put( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {a}
, 
0
)
\protect \end {array}\right.
\\
\mathsf {v}
!
\mathsf {a}
\protect \end {array}\right.
]$%
%
}
%

%
\index{array plus @\back $[
array\mbox{-}\linebreak[0]plus( 
\mathsf{x}
, 
\mathsf{y}
)]$ array plus x and y end plus}%
%
\tex{$
[
array\mbox{-}\linebreak[0]plus( 
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline array
\mbox {$\backslash $}mbox
\{
\mbox{-}
\}
\mbox {$\backslash $}linebreak[0]plus(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
array\mbox{-}\linebreak[0]plus( 
\mathsf{x}
, 
\mathsf{y}
)
\mathrel {\dot {=}}
\mathsf{x}
{}^a
\left\{\protect \begin {array}{l}
\mathsf{y}
{}^a
\left\{\protect \begin {array}{l}
\mathsf {T}
\\
\mathsf{y}
{}^h
{}^c
\left\{\protect \begin {array}{l}
\mathsf{y}
\\
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\protect \end {array}\right.
\protect \end {array}\right.
\\
\mathsf{y}
{}^a
\left\{\protect \begin {array}{l}
\mathsf{x}
{}^h
{}^c
\left\{\protect \begin {array}{l}
\mathsf{x}
\\
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\protect \end {array}\right.
\\
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

%
\index{array remove @\back $[
array\mbox{-}\linebreak[0]remove( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ array remove x array y level z end remove}%
%
\tex{$
[
array\mbox{-}\linebreak[0]remove( 
\mathsf {i}
, 
\mathsf {a}
, 
\mathsf {l}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline array
\mbox {$\backslash $}mbox
\{
\mbox{-}
\}
\mbox {$\backslash $}linebreak[0]remove(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
array\mbox{-}\linebreak[0]remove( 
\mathsf {i}
, 
\mathsf {a}
, 
\mathsf {l}
)
\mathrel {\dot {=}}
\newline 
\mathsf {i}
!
\mathsf {l}
!
\mathsf {a}
{}^a
\left\{\protect \begin {array}{l}
\mathsf {T}
\\
\mathsf {a}
{}^h
{}^c
\left\{\protect \begin {array}{l}
\mathsf {a}
{}^h
\approx 
\mathsf {i}
\left\{\protect \begin {array}{l}
\mathsf {T}
\\
\mathsf {a}
\protect \end {array}\right.
\\
bit( 
\mathsf {l}
, 
\mathsf {i}
)
\left\{\protect \begin {array}{l}
array\mbox{-}\linebreak[0]plus( 
array\mbox{-}\linebreak[0]remove( 
\mathsf {i}
, 
\mathsf {a}
{}^h
, 
\mathsf {l}
+ 
1
)
, 
\mathsf {a}
{}^t
)
\\
array\mbox{-}\linebreak[0]plus( 
\mathsf {a}
{}^h
, 
array\mbox{-}\linebreak[0]remove( 
\mathsf {i}
, 
\mathsf {a}
{}^t
, 
\mathsf {l}
+ 
1
)
)
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

%
\index{array put @\back $[
array\mbox{-}\linebreak[0]put( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {a}
)]$ array put x value y array z level a end put}%
%
\tex{$
[
array\mbox{-}\linebreak[0]put( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {a}
, 
\mathsf {l}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline array
\mbox {$\backslash $}mbox
\{
\mbox{-}
\}
\mbox {$\backslash $}linebreak[0]put(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
array\mbox{-}\linebreak[0]put( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {a}
, 
\mathsf {l}
)
\mathrel {\dot {=}}
\newline 
\mathsf {l}
!
\mathsf {a}
{}^a
\left\{\protect \begin {array}{l}
\mathsf {i}
\mathrel { : \, : }
\mathsf {v}
\\
\mathsf {a}
{}^h
{}^c
\left\{\protect \begin {array}{l}
\mathsf {a}
{}^h
\approx 
\mathsf {i}
\left\{\protect \begin {array}{l}
\mathsf {i}
\mathrel { : \, : }
\mathsf {v}
\\
array\mbox{-}\linebreak[0]add( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {a}
{}^h
, 
\mathsf {a}
{}^t
, 
\mathsf {l}
)
\protect \end {array}\right.
\\
bit( 
\mathsf {l}
, 
\mathsf {i}
)
\left\{\protect \begin {array}{l}
array\mbox{-}\linebreak[0]put( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {a}
{}^h
, 
\mathsf {l}
+ 
1
)
\mathrel { : \, : }
\mathsf {a}
{}^t
\\
\mathsf {a}
{}^h
\mathrel { : \, : }
array\mbox{-}\linebreak[0]put( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {a}
{}^t
, 
\mathsf {l}
+ 
1
)
\protect \end {array}\right.
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

%
\index{array add @\back $[
array\mbox{-}\linebreak[0]add( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {a}
, 
\mathsf {b}
)]$ array add x value y index z value a level b end add}%
%
\tex{$
[
array\mbox{-}\linebreak[0]add( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {i}'
, 
\mathsf {v}'
, 
\mathsf {l}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline array
\mbox {$\backslash $}mbox
\{
\mbox{-}
\}
\mbox {$\backslash $}linebreak[0]add(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#5.
\newline )
\mbox{''}
]$}%
%
\display{$
[
array\mbox{-}\linebreak[0]add( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {i}'
, 
\mathsf {v}'
, 
\mathsf {l}
)
\mathrel {\dot {=}}
\newline 
bit( 
\mathsf {l}
, 
\mathsf {i}
)
\left\{\protect \begin {array}{l}
bit( 
\mathsf {l}
, 
\mathsf {i}'
)
\left\{\protect \begin {array}{l}
array\mbox{-}\linebreak[0]add( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {i}'
, 
\mathsf {v}'
, 
\mathsf {l}
+ 
1
)
\mathrel { : \, : }
\mathsf {T}
\\
(
\mathsf {i}
\mathrel { : \, : }
\mathsf {v}
)^M
\mathrel { : \, : }
(
\mathsf {i}'
\mathrel { : \, : }
\mathsf {v}'
)^M
\protect \end {array}\right.
\\
bit( 
\mathsf {l}
, 
\mathsf {i}'
)
\left\{\protect \begin {array}{l}
(
\mathsf {i}'
\mathrel { : \, : }
\mathsf {v}'
)^M
\mathrel { : \, : }
(
\mathsf {i}
\mathrel { : \, : }
\mathsf {v}
)^M
\\
\mathsf {T}
\mathrel { : \, : }
array\mbox{-}\linebreak[0]add( 
\mathsf {i}
, 
\mathsf {v}
, 
\mathsf {i}'
, 
\mathsf {v}'
, 
\mathsf {l}
+ 
1
)
\protect \end {array}\right.
\protect \end {array}\right.
]$%
%
}
%

\test{$
\relax [ 
\mathsf {T}
[ 
0
{\rightarrow} 
1
]
\approx 
0
\mathrel { : \, : }
1
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
0
{\rightarrow} 
1
]
[ 
1
{\rightarrow} 
2
]
\approx 
(
0
\mathrel { : \, : }
1
)
\mathrel { : \, : }
(
1
\mathrel { : \, : }
2
)
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
0
{\rightarrow} 
1
]
[ 
2
{\rightarrow} 
4
]
\approx 
(
(
0
\mathrel { : \, : }
1
)
\mathrel { : \, : }
(
2
\mathrel { : \, : }
4
)
)
\mathrel { : \, : }
\mathsf {T}
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
1
{\rightarrow} 
2
]
[ 
3
{\rightarrow} 
6
]
\approx 
\mathsf {T}
\mathrel { : \, : }
(
(
1
\mathrel { : \, : }
2
)
\mathrel { : \, : }
(
3
\mathrel { : \, : }
6
)
)
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
0
{\rightarrow} 
1
]
[ 
2
{\rightarrow} 
4
]
[ 
0
{\rightarrow} 
\mathsf {T}
]
\approx 
\mathsf {T}
[ 
2
{\rightarrow} 
4
]
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
0
{\rightarrow} 
1
]
[ 
2
{\rightarrow} 
4
]
[ 
2
{\rightarrow} 
\mathsf {T}
]
\approx 
\mathsf {T}
[ 
0
{\rightarrow} 
1
]
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
1
{\rightarrow} 
2
]
[ 
3
{\rightarrow} 
6
]
[ 
1
{\rightarrow} 
\mathsf {T}
]
\approx 
\mathsf {T}
[ 
3
{\rightarrow} 
6
]
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
1
{\rightarrow} 
2
]
[ 
3
{\rightarrow} 
6
]
[ 
3
{\rightarrow} 
\mathsf {T}
]
\approx 
\mathsf {T}
[ 
1
{\rightarrow} 
2
]
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
1
{\rightarrow} 
7
]
[ 
2
{\rightarrow} 
8
]
[ 
4
{\rightarrow} 
9
]
{[}
1
{]}
\approx 
7
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
1
{\rightarrow} 
7
]
[ 
2
{\rightarrow} 
8
]
[ 
4
{\rightarrow} 
9
]
{[}
2
{]}
\approx 
8
\relax ]^{\cdot} $}
\test{$
\relax [ 
\mathsf {T}
[ 
1
{\rightarrow} 
7
]
[ 
2
{\rightarrow} 
8
]
[ 
4
{\rightarrow} 
9
]
{[}
4
{]}
\approx 
9
\relax ]^{\cdot} $}



\subsubsection{Multidimensional assignment}

$[
\mathsf {a}
[ 
\mathsf {i}
{\Rightarrow} 
\mathsf {v}
]]$ equals the multidimensional array $[
\mathsf {a}]$ except that $[
\mathsf {a}
[ 
\mathsf {i}
{\Rightarrow} 
\mathsf {v}
]]$ maps the list $[
\mathsf {i}]$ of indices to the value $[
\mathsf {v}]$. As an example, $[
\mathsf {T}
[ 
1
\mathrel { : \, : }
2
\mathrel { : \, : }
3
\mathrel { : \, : }
\mathsf {T}
{\Rightarrow} 
4
]
{[}
1
{]}
{[}
2
{]}
{[}
3
{]}]$ equals $[
4]$.

%
\index{\alpha x set multi y to z end set @\back $[
\mathsf{x}
[ 
\mathsf{y}
{\Rightarrow} 
\mathsf{z}
]]$ x set multi y to z end set}%
%
\index{x set multi y to z end set $[
\mathsf{x}
[ 
\mathsf{y}
{\Rightarrow} 
\mathsf{z}
]]$t}%
%
\tex{$
[
\mathsf {a}
[ 
\mathsf {i}
{\Rightarrow} 
\mathsf {v}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\{
\mbox {$\backslash $}Rightarrow
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ]
\mbox{''}
]$}%
%
\display{$
[
\mathsf {a}
[ 
\mathsf {i}
{\Rightarrow} 
\mathsf {v}
]
\mathrel {\dot {=}}
\mathsf {i}
{}^a
\left\{\protect \begin {array}{l}
\mathsf {a}
!
\mathsf {v}
\\
\mathsf {a}
[ 
\mathsf {i}
{}^h
{\rightarrow} 
\mathsf {a}
{[}
\mathsf {i}
{}^h
{]}
[ 
\mathsf {i}
{}^t
{\Rightarrow} 
\mathsf {v}
]
]
\protect \end {array}\right.
]$%
%
}
%

\test{$
\relax [ 
\mathsf {T}
[ 
\langle 
1
,\linebreak [0] 
2
,\linebreak [0] 
3
\rangle 
{\Rightarrow} 
1
]
[ 
\langle 
2
\rangle 
{\Rightarrow} 
2
]
[ 
\langle 
1
,\linebreak [0] 
1
\rangle 
{\Rightarrow} 
3
]
[ 
\langle 
1
,\linebreak [0] 
2
,\linebreak [0] 
4
\rangle 
{\Rightarrow} 
4
]
{[}
1
{]}
{[}
2
{]}
{[}
3
{]}
\approx 
1
\relax ]^{\cdot} $}



\subsubsection{Variables}

The term $[
\lambda 
\mathsf{x}
.
\mathsf{x}]$ contains the variable $[
\mathsf{x}]$.

In Logiweb, any term may serve as a variable. Whether or not a given term is interpreted as a variable depends on context.

A lambda construct forces its first argument to be a variable. This forces the first occurrence of $[
\mathsf{x}]$ in $[
\lambda 
\mathsf{x}
.
\mathsf{x}]$ to be a variable.

The lambda does not force the second occurrence of $[
\mathsf{x}]$ in $[
\lambda 
\mathsf{x}
.
\mathsf{x}]$ to be a variable. But the second occurrence is a variable anyway because of another rule which says that any term whose root symbol has no value definition is a variable.

As a more bizarre example,

\display{$\left[
\lambda 
2
.
2\right]$}

is a valid term. The lambda forces the first occurrence of $[
2]$ to be a variable. The second occurrence of $[
2]$ is no variable, however, since nothing forces the second $[
2]$ to be a variable and $[
2]$ has a value definition. Renaming of the bound variable $[
2]$ to $[
\mathsf{x}]$ shows that $[
\lambda 
2
.
2]$ equals $[
\lambda 
\mathsf{x}
.
2]$:

\display{$\left[
\lambda 
2
.
2
=
\lambda 
\mathsf{x}
.
2\right]$}

We now introduce the binary construct $[
\mathsf{x}
_{
\mathsf{y}
}]$, but we assign no value to it. For that reason, any term with the $[
\mathsf{x}
_{
\mathsf{y}
}]$ construct in the root will be a variable. As an example of use,

\display{$\left[
\lambda 
\mathsf{x}
_{
1
}
.
\lambda 
\mathsf{x}
_{
2
}
.
\mathsf{x}
_{
1
}
\mathrel { : \, : }
\mathsf{x}
_{
2
}\right]$}

equals

\display{$\left[
\lambda 
\mathsf {u}
.
\lambda 
\mathsf {v}
.
\mathsf {u}
\mathrel { : \, : }
\mathsf {v}\right]$}

To boost the number of available variables even further, we introduce a unary prime operator
%
\index{\alpha x prime @\back $[
\mathsf{x}']$ x prime}%
%
\index{x prime $[
\mathsf{x}']$}%
%
\tex{$
[
\mathsf{x}'
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\mbox {'}
\mbox{''}
]$}%
%
$[
\mathsf{x}']$%
%
which allows to use $[
\mathsf{x}']$, $[
\mathsf{y}']$, $[
\mathsf{z}''']$, and so on as variables.

Two variables are equal if they are identical terms (disregarding debugging information). For that reason, even if we defined $[
\mathsf{x}+
\mathsf{y}]$ such that $[2+2]$ equaled $[4]$, $[
\mathsf{x}
_{
2+
2
}]$ and $[
\mathsf{x}
_{
4
}]$ would still be distinct variables.



\subsubsection{Stacks}

We shall refer to dynamic environments as \index{stack}\intro{stacks}. A stack is an association list from variables to values.

We cannot use $[
\mathsf {s}
{[}
\mathsf {v}
{]}]$ to look up the variable $[
\mathsf {v}]$ in the stack $[
\mathsf {s}]$ because we should disregard debugging information present in $[
\mathsf {v}]$. For that reason, we use the following construct instead:

\display{$
[
\mathbf {lookup}(
\mathsf {v}
,
\mathsf {s}
,
\mathsf {d}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {v}
!
\mathsf {d}
!
\mathrm {If}(
\mathsf {s}
,\linebreak [0]
\mathsf {d}
,\linebreak [0]
\mathrm {If}(
\mathsf {v}
\stackrel {t}{=}
\mathsf {s}
{}^h
{}^h
,\linebreak [0]
\mathsf {s}
{}^h
{}^t
,\linebreak [0]
\mathbf {lookup}(
\mathsf {v}
,
\mathsf {s}
{}^t
,
\mathsf {d}
)
)
)
]$}

$[
\mathbf {lookup}(
\mathsf {v}
,
\mathsf {s}
,
\mathsf {d}
)]$ looks up the variable $[
\mathsf {v}]$ in the stack $[
\mathsf {s}]$. If the variable is not found, $[
\mathbf {lookup}(
\mathsf {v}
,
\mathsf {s}
,
\mathsf {d}
)]$ returns the default value $[
\mathsf {d}]$ instead.

The $[
\mathbf {zip}(
\mathsf {p}
,
\mathsf {a}
)]$ construct zips two lists into a list of pairs and is suited for forming stacks:

\display{$
[
\mathbf {zip}(
\mathsf {p}
,
\mathsf {a}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {a}
!
\mathrm {If}(
\mathsf {p}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
(
\mathsf {p}
{}^h
\mathrel { : \, : }
\mathsf {a}
{}^h
)^M
\mathrel { : \, : }
\mathbf {zip}(
\mathsf {p}
{}^t
,
\mathsf {a}
{}^t
)
)
]$}



\subsection{Static semantics}

\subsubsection{The structure of Logiweb pages}

As far as Logiweb is concerned, a Logiweb page consists of a \indexintro{bibliography}, a \indexintro{dictionary}, and a \indexintro{body}. What you read right now is a rendering of the body of a Logiweb page.

The Logiweb bibliography of a page is a list of Logiweb references. The first reference (reference number zero) is the reference of the page itself, and the other references are references of other Logiweb pages.

The bibliography at the end of the present page is a \textsc{Bib}\TeX\ bibliography which is part of the body of the page. The \textsc{Bib}\TeX\ bibliography is completely unrelated to the Logiweb bibliography.

The Logiweb dictionary of a page is an array which maps identifiers to arities. If the dictionary of the page with reference $[
\mathsf {r}]$ maps the cardinal $[
\mathsf {i}]$ to $[
\mathsf {a}]$ then, by definition, there exists a Logiweb symbol with reference $[
\mathsf {r}]$ and identifier $[
\mathsf {i}]$, and that symbol has arity $[
\mathsf {a}]$.

The Logiweb body of a page is one, big term.



\subsubsection{Transitive bibliographies}

As mentioned, the first entry of the Logiweb bibliography of any page is the reference of the page itself. Apart from this, the bibliographic references of Logiweb form a non-cyclic graph.

Given a Logiweb page $[
\mathsf {p}]$, we shall define the \indexintro{transitive bibliography} of $[
\mathsf {p}]$ as the set of references of all pages reachable following bibliographic links starting at $[
\mathsf {p}]$. The transitive bibliography of a page includes the reference of the page itself.

We define the transitive, irreflexive bibliography of a Logiweb page as the transitive bibliography with the reference of the page itself removed.



\subsubsection{Loading, referencing, and verbatim copying}

Logiweb is able to \indexintro{load} Logiweb pages. Loading a Logiweb page involves a number of activities such as locating, retrieving, unpacking, and codifying the page. To display a page the system has to load and then render the page.

Loading a page is cascading in that loading a page requires loading of all pages in the transitive bibliography of the page.

A page cannot be loaded unless all pages in the transitive bibliography can be found. Hence, deleting a page from Logiweb is a serious thing since it ruins all pages that refer, directly or indirectly, to the deleted page. Fortunately, Logiweb allows duplication of pages so that a single Logiweb page may reside several places in the world. The author of a Logiweb page should secure a local copy of all pages in the transitive bibliography of the page unless the author trusts other people very much.

Referencing, indexing, and verbatim copying are core activities of Logiweb; if one does not allow referencing, indexing, and verbatim copying of a page, one should not submit it to Logiweb. In other words, the author of a page silently permits referencing, indexing, and verbatim copying by submitting it.

Authors may of course still claim copyright to a Logiweb page. That copyright may prevent other people from e.g.\ modifying the page, publishing the page outside Logiweb, or other activities other than the core activities of Logiweb.



\subsubsection{The cache of a page}\label{section:TheCacheOfAPage}

Loading a page results in the construction of a \indexintro{cache} and a \indexintro{rack} for the page. The cache and rack of a page represent the static semantics of the page.

The cache $[
\mathsf {c}]$ of a page $[
\mathsf {p}]$ is an array which maps the references in the transitive bibliography of $[
\mathsf {p}]$ to the rack of the associated page. Hence, $[
\mathsf {c}
{[}
\mathsf {r}
{]}]$ is the rack of the page referenced by $[
\mathsf {r}]$. In particular, the cache of a page contains the rack of the page itself.

The cache $[
\mathsf {c}]$ of a page is an almost homogeneous array. The only exception is that $[
\mathsf {c}
{[}
0
{]}]$ equals the reference of the page. As a consequence, if $[
\mathsf {c}]$ is the cache of a page then $[
\mathsf {c}
{[}
\mathsf {c}
{[}
0
{]}
{]}]$ is the rack of the page.



\subsubsection{The value of the page construct}

A \index{construct, page}\indexintro{page construct} (the construct of a page whose id is zero) represents the page. As an example, the pyk and tex aspects of a page construct effectively become the name of the page expressed in pyk and \TeX, respectively. The page construct is always nulary.

Evaluation of a page construct always yields the Logiweb cache of the associated page. In this way, the evaluator has a clean way to access its environment. Logiweb ignores value definitions of page constructs.

From the point of view of mathematical reasoning, page constructs are constants whose values happen to be the cache of their associated pages.

$[
\mbox{base}]$ is the page construct of the present page. Hence, the value of $[
\mbox{base}]$ is the cache of the present page.

According to Section \ref{section:TheCacheOfAPage}, $[
\mbox{base}
{[}
0
{]}]$ is the reference of the present page. If we take any construct introduced on the present page, say $[
7]$, then the reference of the root of that construct must equal $[
\mbox{base}
{[}
0
{]}]$:

\display{$
\relax [ 
\mbox{base}
{[}
0
{]}
\approx 
\lceil 
7
\rceil 
{}^{r}
\relax ]^{\cdot} $}

In section \ref{section:SelfReferences} we macro define $[
\mbox{self}]$ so that $[
\mbox{self}]$ macro expands to the page construct of the page on which the construct occurs. Hence, on the present page, $[
\mbox{self}]$ expands to $[
\mbox{base}]$. On other pages, $[
\mbox{self}]$ expands to the page construct of those other pages.

We could use $[
\mbox{self}]$ in place of $[
\mbox{base}]$ above. Logiweb does not care about the order of definitions, and it is completely valid to use macros before they are defined. But beware of circularities, they can lead to intractable errors.



\subsubsection{The rack of a page}\label{section:TheRackOfAPage}

According to Section \ref{section:TheCacheOfAPage},
%
\index{rack @\back $[
rack]$ example rack}%
%
\index{example rack $[
rack]$}%
%
\tex{$
[
rack
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline rack
\mbox{''}
]$}%
%
$
[
rack
\mathrel {\dot {=}}
\mbox{base}
{[}
\mbox{base}
{[}
0
{]}
{]}
]$%
%
is the rack of the present page.

The rack of a page maps various, predefined hooks to various values. The hooks of the rack are Logiweb identifiers (c.f. Section \ref{section:RepresentationOfLogiwebIdentifiers}). At the time of writing, the rack $[
\mathsf {a}]$ of a page has the following hooks:

\begin{itemize}

\item
%
\index{vector hook $[
\mbox {\tt \char34}\mathrm {vector}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {vector}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{vector
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {vector}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}vector
\mbox{''}
\rceil 
)
]$%
%
The vector of the page, i.e.\ the sequence of bytes that constitute the page when it is stored on disc or transmitted over a network. As an example, $[
rack
{[}
\mbox {\tt \char34}\mathrm {vector}\mbox {\tt \char34}
{]}
{}^h]$ is the first byte of the vector that represents the present page. That byte happens to be the major version number so, since the present page is encoded using Logiweb version $[
1]$ we have $
\relax [ 
rack
{[}
\mbox {\tt \char34}\mathrm {vector}\mbox {\tt \char34}
{]}
{}^h
\approx 
1
\relax ]^{\cdot} $.

\item
%
\index{bibliography hook $[
\mbox {\tt \char34}\mathrm {bibliography}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {bibliography}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{bibliography
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {bibliography}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}bibliography
\mbox{''}
\rceil 
)
]$%
%
The bibliography of the page, i.e.\ a list of references where the first reference is the reference of the page itself and the other references are references of other pages. The present page is a base page in the sense that it references no other pages: $
\relax [ 
rack
{[}
\mbox {\tt \char34}\mathrm {bibliography}\mbox {\tt \char34}
{]}
\approx 
\lceil 
7
\rceil 
{}^{r}
\mathrel { : \, : }
\mathsf {T}
\relax ]^{\cdot} $.

\item
%
\index{dictionary hook $[
\mbox {\tt \char34}\mathrm {dictionary}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {dictionary}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{dictionary
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {dictionary}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}dictionary
\mbox{''}
\rceil 
)
]$%
%
The dictionary of the page, i.e.\ an array that maps the identifiers of the symbols introduced on the page to their arities. As an example, the arity of $[
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}]$ is two: \display{$
\relax [ 
rack
{[}
\mbox {\tt \char34}\mathrm {dictionary}\mbox {\tt \char34}
{]}
{[}
\lceil 
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\rceil 
{}^{i}
{]}
\approx 
2
\relax ]^{\cdot} $} We say that a \index{exists, symbol}\indexintro{symbol exists} if the dictionary of the page pointed out by the reference of the symbol maps the identifier of the symbol to a value different from $[
\mathsf {T}]$.

\item
%
\index{body hook $[
\mbox {\tt \char34}\mathrm {body}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {body}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{body
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {body}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}body
\mbox{''}
\rceil 
)
]$%
%
The body of the page, i.e.\ the term that one should typeset when viewing the page. On a base page, the root of the body necessarily comes from the page itself: $
\relax [ 
rack
{[}
\mbox {\tt \char34}\mathrm {body}\mbox {\tt \char34}
{]}
{}^{r}
\approx 
\lceil 
7
\rceil 
{}^{r}
\relax ]^{\cdot} $.

\item
%
\index{codex hook $[
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{codex
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}codex
\mbox{''}
\rceil 
)
]$%
%
An array that contains all revelations (i.e.\ proclamations, definitons, and introductions) of the page as described in Section \ref{section:TheCodexOfAPage}.

\item
%
\index{expansion hook $[
\mbox {\tt \char34}\mathrm {expansion}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {expansion}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{expansion
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {expansion}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}expansion
\mbox{''}
\rceil 
)
]$%
%
The macro expanded version of the body of the page. The expanded version is always a syntactically valid term, i.e.\ a term in which all symbols exist and have correct arities as specified in the dictionaries. Logiweb ensures this syntactic validity in a roundabout way: The macro expansion facility is Turing complete and can produce any value as an output. Macro expansion may even loop indefinitely, in which case the author of the page should consider to correct the page before submitting it to Logiweb. If macro expansion does produce a value, then Logiweb checks the result for syntactical validity, and whenever it finds an invalid symbol or a symbol whose arity does not match the number of subtrees, Logiweb replaces the tree rooted at the invalid symbol with the page construct of the present page.

\item
%
\index{code hook $[
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{code
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}code
\mbox{''}
\rceil 
)
]$%
%
An array that contains compiled versions of all value revelations of a page. With two exceptions, the compiled versions are tagged, curried functions: $
\relax [ 
{\cal U}(
rack
{[}
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
{]}
{[}
\lceil 
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\rceil 
{}^{i}
{]}
\mathbin {\mbox {`}}
2
\mathbin {\mbox {`}}
3
)
\approx 
2
\mathrel { : \, : }
3
\relax ]^{\cdot} $. The first exceptions is lambda abstraction which, rather arbitrarily, is represented by a zero: $
\relax [ 
rack
{[}
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
{]}
{[}
\lceil 
\lambda 
\mathsf{x}
.
\mathsf{y}
\rceil 
{}^{i}
{]}
\approx 
0
\relax ]^{\cdot} $. The other exception is quoting which is represented by a one: $
\relax [ 
rack
{[}
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
{]}
{[}
\lceil 
\lceil 
\mathsf{x}
\rceil 
\rceil 
{}^{i}
{]}
\approx 
1
\relax ]^{\cdot} $.

\item
%
\index{cache hook $[
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{cache
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}cache
\mbox{''}
\rceil 
)
]$%
%
An array which maps all references in the transitive, irreflexive bibliography of the page $[
\mathsf {p}]$ to the caches of the associated pages. The present page is a base page in the sense that it references no other pages, so the cache that hangs on the cache hook is empty: $
\relax [ 
rack
{[}
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}
{]}
\approx 
\mathsf {T}
\relax ]^{\cdot} $. If the present page did reference a page with reference $[
\mathsf {r}]$ then $[
rack
{[}
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
{]}]$ would be the cache of page $[
\mathsf {r}]$. In that case, $[
\mbox{base}
{[}
\mathsf {r}
{]}]$ as well as $[
rack
{[}
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
{]}
{[}
\mathsf {r}
{]}]$ would be the rack of page $[
\mathsf {r}]$. In general, the racks and caches of referenced pages can be addressed several ways.

\item
%
\index{diagnose hook $[
\mbox {\tt \char34}\mathrm {diagnose}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {diagnose}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{diagnose
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {diagnose}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}diagnose
\mbox{''}
\rceil 
)
]$%
%
If the value that hangs on the diagnose hook is $[
\mathsf {T}]$ then the page is correct. Otherwise, the value is a term which, when typeset, is supposed to explain what is wrong with the page. In other words, the diagnose hook is where the checking machinery hangs its complaints. The diagnose is pruned to a term the same way as the expansion is. The diagnose is added after checking. During checking the value that hangs on the diagnose hook is always $[
\mathsf {T}]$.

\end{itemize}

\noindent Constants (i.e.\ nulary constructs) like the ones above are computed lazily and the result is kept. For that reason, constants are computed at most once when a Logiweb page is loaded. Computation of e.g.\ $[
identifier( 
\lceil 
\mbox{``}diagnose
\mbox{''}
\rceil 
)]$ is not particularly time and memory efficient but that is irrelevant when using $[
\mbox {\tt \char34}\mathrm {diagnose}\mbox {\tt \char34}]$ since it is only evaluated once.



\subsubsection{The codex of a page}\label{section:TheCodexOfAPage}

The codex $[
\mathsf {c}]$ of a page is a four dimensional array that hangs on the $[
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}]$ hook of the rack of the page.

A page may contain revelations (i.e.\ proclamations, definitions, and introductions), and each revelation defines some aspect of some symbol.

If $[
\mathsf {r}
_{
\mathsf {s}
}]$ and $[
\mathsf {i}
_{
\mathsf {s}
}]$ are the reference and identifier, respectively, of a symbol and if $[
\mathsf {r}
_{
\mathsf {a}
}]$ and $[
\mathsf {i}
_{
\mathsf {a}
}]$ are the reference and identifier, respectively, of an aspect, then

\display{$\left[
\mathsf {c}
{[}
\mathsf {r}
_{
\mathsf {s}
}
{]}
{[}
\mathsf {i}
_{
\mathsf {s}
}
{]}
{[}
\mathsf {r}
_{
\mathsf {a}
}
{]}
{[}
\mathsf {i}
_{
\mathsf {a}
}
{]}\right]$}

is the revelation (if any) of the given aspect of the given symbol.

If the revelation is a definition or introduction, the thing stored in the codex is the entire term that constitutes the revelation. In this case, the first argument of the definition is the aspect (with possible parameters), the second argument is the left hand side of the definition (with possible parameters), and the third argument is the right hand side. The root of the term is a symbol that is proclaimed to denote the ``definition'' or ``introduction'' concept.

If the revelation is a proclamation, the thing stored in the codex has form $[
(
0
\mathrel { : \, : }
\mathsf {i}
\mathrel { : \, : }
\mathsf {T}
)
\mathrel { : \, : }
\mathsf {T}]$ where $[
\mathsf {i}]$ where the cardinal $[
\mathsf {i}]$ identifies the proclamation as explained in Section \ref{section:CodificationOfRevelations}.



\subsubsection{Aspects}

An aspect may be predefined or user defined.

User defined aspects are introduced using a mechanism described later. The reference and identifier of a user defined aspect always identify an existing Logiweb symbol.

The reference of a predefined aspect equals zero and the identifier is a Logiweb identifier. At the time of writing, the following Logiweb identifiers denote predefined aspects:

\begin{itemize}

\item
%
\index{value aspect $[
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}]$}%
%
% \tex below uses \char34 instead of " to avoid problems with makeindex
\tex{$
[
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{value
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}value
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{pyk aspect $[
\mbox {\tt \char34}\mathrm {pyk}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {pyk}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pyk
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {pyk}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}pyk
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{tex aspect $[
\mbox {\tt \char34}\mathrm {tex}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {tex}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{tex
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {tex}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}tex
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{texname aspect $[
\mbox {\tt \char34}\mathrm {texname}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {texname}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{texname
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {texname}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}texname
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{message aspect $[
\mbox {\tt \char34}\mathrm {message}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {message}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{message
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {message}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}message
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{macro aspect $[
\mbox {\tt \char34}\mathrm {macro}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {macro}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{macro
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {macro}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}macro
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{definition aspect $[
\mbox {\tt \char34}\mathrm {definition}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {definition}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{definition
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {definition}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}definition
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{unpack aspect $[
\mbox {\tt \char34}\mathrm {unpack}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {unpack}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{unpack
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {unpack}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}unpack
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{claim @\back $[
\mbox {\tt \char34}\mathrm {claim}\mbox {\tt \char34}]$ claim aspect}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {claim}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{claim
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {claim}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}claim
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{priority aspect $[
\mbox {\tt \char34}\mathrm {priority}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {priority}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{priority
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {priority}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}priority
\mbox{''}
\rceil 
)
]$%
%

\end{itemize}

\noindent As an example, if $[
\mathsf {c}]$ is the codex of a page and if the page makes a value definition of a symbol with reference $[
\mathsf {r}]$ and identifier $[
\mathsf {i}]$ then

\display{$\left[
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mathsf {i}
{]}
{[}
0
{]}
{[}
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
{]}\right]$}

will equal that definition.



\subsubsection{Domestic and foreign definitions}

If a page with reference $[
\mathsf {r}]$ has cache $[
\mathsf {c}]$ then e.g.

\display{$\left[
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
_{
\mathsf {s}
}
{]}
{[}
\mathsf {i}
_{
\mathsf {s}
}
{]}
{[}
0
{]}
{[}
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
{]}\right]$}

denotes the value aspect of the symbol with reference $[
\mathsf {r}
_{
\mathsf {s}
}]$ and identifier $[
\mathsf {i}
_{
\mathsf {s}
}]$ as defined on page $[
\mathsf {r}]$.

We shall say that a definition is \index{domestic definition}\intro{domestic} if $[
\mathsf {r}
=
\mathsf {r}
_{
\mathsf {s}
}]$ and \index{foreign definition}\intro{foreign} otherwise. In other words, a definition is domestic if it occurs on the home page of the symbol being defined.

Logiweb ignores foreign value definitions but store them in the codex for the record. In general, Logiweb ignores foreign definitions of any predefined aspect.

One could decide that foreign definitions could shadow domestic ones in certain situations. Actually, shadowing of pyk, tex, and tex name aspects has been considered for Logiweb, but has been rejected to keep core Logiweb simple. Authors who define their own user aspects may decide if and how foreign definitions may shadow domestic ones for their aspects.



\subsubsection{A codex accessor}

%
\index{aspect @\back $[
\mathbf{aspect}( 
\mathsf{x}
, 
\mathsf{y}
)]$ aspect x subcodex y end aspect}%
%
\tex{$
[
\mathbf{aspect}( 
\mathsf {a}
, 
\mathsf {c}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{aspect
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
$[
\mathbf{aspect}( 
\mathsf {a}
, 
\mathsf {c}
)]$%
%
looks up the the aspect $[
\mathsf {a}]$ in the \indexintro{subcodex} $[
\mathsf {c}]$. The subcodex is assumed to be the result of accessing a codex be the reference and identifier of a symbol. The subcodex is what is called a \index{Lisp property list}\index{property list, Lisp}\intro{property list} in Lisp \cite{mccarthy60,steele}.

If $[
\mathsf {a}]$ is a cardinal then it is interpreted as the Logiweb identifier of a predefined aspect. Otherwise, $[
\mathsf {a}]$ is interpreted as a term whose root symbol denotes a user defined aspect.

\display{$
[
\mathbf{aspect}( 
\mathsf {a}
, 
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {a}
{}^c
\left\{\protect \begin {array}{l}
\mathsf {c}
{[}
0
{]}
{[}
\mathsf {a}
{]}
\\
\mathsf {c}
{[}
\mathsf {a}
{}^{r}
{]}
{[}
\mathsf {a}
{}^{i}
{]}
\protect \end {array}\right.
]$}

%
\index{aspect @\back $[
\mathbf{aspect}( 
\mathsf {a}
, 
\mathsf {t}
, 
\mathsf {c}
)]$}%
%
\tex{$
[
\mathbf{aspect}( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{aspect
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
$[
\mathbf{aspect}( 
\mathsf {a}
, 
\mathsf {t}
, 
\mathsf {c}
)]$%
%
looks up the domestic definition of the root of the term $[
\mathsf {t}]$ for the aspect $[
\mathsf {a}]$ in the cache $[
\mathsf {c}]$. If $[
\mathsf {a}]$ is a cardinal then it is interpreted as the Logiweb identifier of a predefined aspect. Otherwise, $[
\mathsf {a}]$ is interpreted as a term whose root symbol denotes a user defined aspect.

\display{$
[
\mathbf{aspect}( 
\mathsf {a}
, 
\mathsf {t}
, 
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathbf{aspect}( 
\mathsf {a}
, 
\mathsf {c}
{[}
\mathsf {t}
{}^{r}
{]}
{[}
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
{]}
{[}
\mathsf {t}
{}^{r}
{]}
{[}
\mathsf {t}
{}^{i}
{]}
)
]$}



\subsubsection{Value proclamations}

Proclaiming a construct to denote ``apply'', ``lambda'', ``true'', ``if'', or ``quote'' affects the value aspect of the construct. For that reason we shall refer to proclamations with one of these strings in the right hand side as \index{value proclamation}\intro{value proclamations}.

The strings that make sense in the right hand side of proclamations form a subset of the strings that define Logiweb identifiers. The Logiweb identifiers associated to the five value proclamations are defined thus:

\begin{itemize}

\item
%
\index{lambda identifier $[
\mbox {\tt \char34}\mathrm {lambda}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {lambda}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{lambda
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {lambda}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}lambda
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{apply identifier $[
\mbox {\tt \char34}\mathrm {apply}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {apply}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{apply
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {apply}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}apply
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{true identifier $[
\mbox {\tt \char34}\mathrm {true}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {true}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{true
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {true}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}true
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{if identifier $[
\mbox {\tt \char34}\mathrm {if}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {if}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{if
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {if}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}if
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{quote identifier $[
\mbox {\tt \char34}\mathrm {quote}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {quote}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{quote
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {quote}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}quote
\mbox{''}
\rceil 
)
]$%
%

\end{itemize}



\subsubsection{Codification of revelations}\label{section:CodificationOfRevelations}

Logiweb \index{codify}\intro{codifies} a definition like

\display{$
[
\mathsf{x}
{}^H
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf {T}
]$}

simply by placing the entire definition in the codex:

\display{$
\relax [ 
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
, 
\lceil 
\mathsf{x}
{}^H
\rceil 
, 
\mbox{base}
)
\stackrel {t}{=}
\lceil 
[
\mathsf{x}
{}^H
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf {T}
]
\rceil 
\relax ]^{\cdot} $}

Having that definition, one can gain access not only to the right hand side of the definition, but also e.g.\ the parameter list of the left hand side. If one decides to have parameterized aspects, then one will also have access to the parameter list of the aspect in the codex.

Introductions are treated exactly the same way. An introduction like

\display{$
[
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\lambda 
\mathsf{x}
.
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)
]$}

results in the following entry in the codex:

\display{$
\relax [ 
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
, 
\lceil 
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}
\rceil 
, 
\mbox{base}
)
\stackrel {t}{=}
\lceil 
[
\mathsf{y}
\mathrel { \dot { . \, . } }
\mathsf{z}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\lambda 
\mathsf{x}
.
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)
]
\rceil 
\relax ]^{\cdot} $}

In contrast, a proclamation like

\display{$
[
\lambda 
\mathsf{x}
.
\mathsf{y}
\bowtie
\mbox{``}lambda
\mbox{''}
]$}

results in an entry like

\display{$
\relax [ 
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
, 
\lceil 
\lambda 
\mathsf{x}
.
\mathsf{y}
\rceil 
, 
\mbox{base}
)
\approx 
(
0
\mathrel { : \, : }
\mbox {\tt \char34}\mathrm {lambda}\mbox {\tt \char34}
\mathrel { : \, : }
\mathsf {T}
){}^{I} 
\mathrel { : \, : }
\mathsf {T}
\relax ]^{\cdot} $}

In general, a proclamation results in an entry of form $[
(
0
\mathrel { : \, : }
\mathsf {i}
\mathrel { : \, : }
\mathsf {T}
){}^{I} 
\mathrel { : \, : }
\mathsf {T}]$ where $[
\mathsf {i}]$ is the Logiweb identifier that corresponds to the string in the right hand side of the proclamation.



\subsubsection{Message proclamations}

A construct denotes an aspect if the construct has a ``message'' aspect.

Proclaiming a construct to denote ``pyk'', ``tex'', ``texname'', ``value'', ``message'', ``macro'', ``unpack'', ``claim'', or ``priority'' affects the message aspect of the construct. For that reason we shall refer to proclamations with one of these strings in the right hand side as \index{message proclamation}\intro{message proclamations}.

The aspects mentioned above are said to be ``predefined''. User defined aspects are treated later.

In addition to the predefined aspects mentioned above, Logiweb recognizes one more predefined aspect: the ``definition'' aspect, which is unproclaimable and which is treated in Section \ref{section:DefinitionProclamations}.

As an example of use,

\display{$
\relax [ 
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {message}\mbox {\tt \char34}
, 
\lceil 
\mathrm{pyk}
\rceil 
, 
\mbox{base}
)
\approx 
(
0
\mathrel { : \, : }
\mbox {\tt \char34}\mathrm {pyk}\mbox {\tt \char34}
\mathrel { : \, : }
\mathsf {T}
){}^{I} 
\mathrel { : \, : }
\mathsf {T}
\relax ]^{\cdot} $}



\subsubsection{Definition proclamation}\label{section:DefinitionProclamations}

A construct denotes a revelation if the construct has a ``definition'' aspect.

Proclaiming a construct to denote ``proclaim'', ``define'', ``introduce'', or ``hide'' affects the revelation aspect of the construct. For that reason we shall refer to proclamations with one of these strings in the right hand side as \index{definition proclamation}\intro{definition proclamations}. The Logiweb identifiers associated to the definition proclamations are defined thus:

\begin{itemize}

\item
%
\index{proclaim identifier $[
\mbox {\tt \char34}\mathrm {proclaim}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {proclaim}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{proclaim
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {proclaim}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}proclaim
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{define identifier $[
\mbox {\tt \char34}\mathrm {define}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {define}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{define
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {define}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}define
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{introduce identifier $[
\mbox {\tt \char34}\mathrm {introduce}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {introduce}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{introduce
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {introduce}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}introduce
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{hide identifier $[
\mbox {\tt \char34}\mathrm {hide}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {hide}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{hide
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {hide}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}hide
\mbox{''}
\rceil 
)
]$%
%

\end{itemize}

\noindent Constructs proclaimed to ``hide'' disable all proclamations in their subtrees to have effect as described in Section \ref{section:AvoidMacroExpansionAndHarvestingOfStrings}.

As an example of use of the definitions aspect we have

\display{$
\relax [ 
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {definition}\mbox {\tt \char34}
, 
\lceil 
[
\mathsf{x}
{}^H
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf {T}
]
\rceil 
, 
\mbox{base}
)
\approx 
(
0
\mathrel { : \, : }
\mbox {\tt \char34}\mathrm {define}\mbox {\tt \char34}
\mathrel { : \, : }
\mathsf {T}
){}^{I} 
\mathrel { : \, : }
\mathsf {T}
\relax ]^{\cdot} $}



\subsubsection{Priority proclamations}

Proclaiming a construct to denote ``pre'' or ``post'' affects the priority aspect of the construct. For that reason we shall refer to proclamations with one of these strings in the right hand side as \index{priority proclamation}\intro{priority proclamations}. The Logiweb identifiers associated to the priority proclamations are defined thus:

\begin{itemize}

\item
%
\index{pre identifier $[
\mbox {\tt \char34}\mathrm {pre}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {pre}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pre
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {pre}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}pre
\mbox{''}
\rceil 
)
]$%
%

\item
%
\index{post identifier $[
\mbox {\tt \char34}\mathrm {post}\mbox {\tt \char34}]$}%
%
\tex{$
[
\mbox {\tt \char34}\mathrm {post}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{post
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$}%
%
$
[
\mbox {\tt \char34}\mathrm {post}\mbox {\tt \char34}
\stackrel{
\mathrm {val}
}{\rightarrow}
identifier( 
\lceil 
\mbox{``}post
\mbox{''}
\rceil 
)
]$%
%

\end{itemize}

\noindent As an example,

\display{$
\relax [ 
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {priority}\mbox {\tt \char34}
, 
\lceil 
\newline \mathbf {Preassociative} \newline 
\mathsf{x}
; 
\mathsf{y}
\rceil 
, 
\mbox{base}
)
\approx 
(
0
\mathrel { : \, : }
\mbox {\tt \char34}\mathrm {pre}\mbox {\tt \char34}
\mathrel { : \, : }
\mathsf {T}
){}^{I} 
\mathrel { : \, : }
\mathsf {T}
\relax ]^{\cdot} $}



\subsubsection{The code of a page}

The code of a page is a one-dimensional array that hangs on the $[
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}]$ hook of the rack of the page.

If $[
\mathsf {c}]$ is the cache of a page and $[
\mathsf {r}]$ belongs to the transitive bibliography of the page, then

\display{$\left[
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
{]}
{[}
\mathsf {i}
{]}\right]$}

is a tagged, Curried version of

\display{$\left[
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
{]}
{[}
\mathsf {i}
{]}
{[}
0
{]}
{[}
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
{]}\right]$}

As an example, if $[
\mathsf {r}]$ and $[
\mathsf {i}]$ are the reference and identifier, respectively, of the $[
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}]$ construct, then

\display{$\left[
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
{]}
{[}
\mathsf {i}
{]}
=
{\cal M}(
\lambda 
\mathsf{x}
.
\lambda 
\mathsf{y}
.
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
)\right]$}

The first edition engine performs compilation backstage so that the code of a page contains a compiled versions of the value aspects of the codex.

If $[
\mathsf {r}]$ and $[
\mathsf {i}]$ are the reference and identifier, respectively, of a symbol that is proclaimed to denote lambda abstraction, then $[
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
{]}
{[}
\mathsf {i}
{]}
=
0]$. If $[
\mathsf {r}]$ and $[
\mathsf {i}]$ are the reference and identifier, respectively, of a symbol that is proclaimed to denote quoting, then $[
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
{]}
{[}
\mathsf {i}
{]}
=
1]$.



\subsection{Macro expansion}

\subsubsection{A self interpreter}

Before we can define a macro expander we need a self interpreter. We define a self interpreter in the following.

The result of evaluating a term is a map, but the evaluator returns a semitagged map for efficiency reasons. To get the map itself one has to untag the return value.

The self interpreter $[
{\cal E}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ evaluates the term $[
\mathsf {t}]$ for the stack $[
\mathsf {s}]$ and the cache $[
\mathsf {c}]$ and returns the result as a semitagged map. $[
{\cal U}(
{\cal E}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)
)]$ is the map itself.

The self interpreter computes the reference $[
\mathsf {t}
{}^{r}]$ and identifier $[
\mathsf {t}
{}^{i}]$ of the root of the term and passes control to an auxiliary function:

\display{$
[
{\cal E}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
{\cal E}_2(
\mathsf {t}
,
\mathsf {t}
{}^{r}
,
\mathsf {t}
{}^{i}
,
\mathsf {s}
,
\mathsf {c}
)
]$}

$[
{\cal E}_2(
\mathsf {t}
,
\mathsf {r}
,
\mathsf {i}
,
\mathsf {s}
,
\mathsf {c}
)]$ evaluates the term $[
\mathsf {t}]$ whose root symbol has reference $[
\mathsf {r}]$ and identifier $[
\mathsf {i}]$ for the stack $[
\mathsf {s}]$ and the cache $[
\mathsf {c}]$. If the root symbol is a page symbol, it returns the associated cache. Otherwise, it looks up the code of the root symbol:

\display{$
[
{\cal E}_2(
\mathsf {t}
,
\mathsf {r}
,
\mathsf {i}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {i}
{}^s
\left\{\protect \begin {array}{l}
\mathsf {t}
!
\mathsf {s}
!
\mathrm {If}(
\mathsf {r}
\approx 
\mathsf {c}
{[}
0
{]}
,\linebreak [0]
\mathsf {c}
,\linebreak [0]
\mathsf {c}
{[}
\mathsf {c}
{[}
0
{]}
{]}
{[}
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
{]}
)
\\
{\cal E}_3(
\mathsf {t}
,
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
{]}
{[}
\mathsf {i}
{]}
,
\mathsf {s}
,
\mathsf {c}
)
\protect \end {array}\right.
]$}

$[
{\cal E}_3(
\mathsf {t}
,
\mathsf {f}
,
\mathsf {s}
,
\mathsf {c}
)]$ evaluates the term $[
\mathsf {t}]$ whose root symbol has code $[
\mathsf {f}]$ for the stack $[
\mathsf {s}]$ and the cache $[
\mathsf {c}]$. If the code equals $[
\mathsf {T}]$ then the root symbol has no value definition and, hence, the term $[
\mathsf {t}]$ is treated a variable. If the code equals zero then the root symbol denotes lambda abstraction and is treated accordingly. If the code equals one then the root symbol denotes the quote construct and is treated accordingly. Otherwise, the code is a tagged, Curried function to be applied to the argument list $[
\mathsf {t}
{}^t]$ of the term $[
\mathsf {t}]$:

\display{$
[
{\cal E}_3(
\mathsf {t}
,
\mathsf {f}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {f}
{}^c
\left\{\protect \begin {array}{l}
\mathsf {f}
{}^s
\left\{\protect \begin {array}{l}
\mathbf {abstract}(
\mathsf {t}
{}^{1}
,
\mathsf {t}
{}^{2}
,
\mathsf {s}
,
\mathsf {c}
)
\\
\mathsf {c}
!
\mathsf {s}
!
\mathsf {t}
{}^{1}
\protect \end {array}\right.
\\
\mathsf {f}
\left\{\protect \begin {array}{l}
\mathsf {c}
!
\mathbf {lookup}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {T}
)
\\
{\cal E}_4(
\mathsf {f}
,
\mathsf {t}
{}^t
,
\mathsf {s}
,
\mathsf {c}
)
\protect \end {array}\right.
\protect \end {array}\right.
]$}

$[
{\cal E}_4(
\mathsf {f}
,
\mathsf {a}
,
\mathsf {s}
,
\mathsf {c}
)]$ applies the function $[
\mathsf {f}]$ to the arguments $[
\mathsf {a}]$ evaluated for the stack $[
\mathsf {s}]$ and the cache $[
\mathsf {c}]$:

\display{$
[
{\cal E}_4(
\mathsf {f}
,
\mathsf {a}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathrm {If}(
\mathsf {a}
,\linebreak [0]
\mathsf {s}
!
\mathsf {c}
!
\mathsf {f}
,\linebreak [0]
{\cal E}_4(
\mathbf {apply}(
\mathsf {f}
,
{\cal E}(
\mathsf {a}
{}^h
,
\mathsf {s}
,
\mathsf {c}
)
)
,
\mathsf {a}
{}^t
,
\mathsf {s}
,
\mathsf {c}
)
)
]$}

$[
\mathbf {abstract}(
\mathsf {v}
,
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ abstracts the variable $[
\mathsf {v}]$ in the term $[
\mathsf {t}]$ for the stack $[
\mathsf {s}]$ and the cache $[
\mathsf {c}]$:

\display{$
[
\mathbf {abstract}(
\mathsf {v}
,
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {v}
!
\mathsf {t}
!
\mathsf {s}
!
\mathsf {c}
!
\Lambda 
\lambda 
\mathsf{x}
.
{\cal E}(
\mathsf {t}
,
(
\mathsf {v}
\mathrel { : \, : }
\mathsf{x}
)^M
\mathrel { : \, : }
\mathsf {s}
,
\mathsf {c}
)
]$}



\subsubsection{A macro expander}

Macro definitions are based on definitions of the \indexintro{macro aspect} of symbols. Definitions of macro aspects will be referred to as \index{macro definition}\intro{macro definitions}. Other kinds of definitions treated so far include value, pyk, \TeX, and priority definitions. To make macro definitions we must proclaim $[
\mathrm {macro}]$ to denote the macro aspect:

\display{$
[
\mathrm {macro}
\bowtie
\mbox{``}macro
\mbox{''}
]$}

The macro expander $[
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ macro expands the term $[
\mathsf {t}]$ for the \indexintro{macro state} $[
\mathsf {s}]$ and the cache $[
\mathsf {c}]$ and returns the result as a semitagged map. The untagged version $[
{\cal U}(
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)
)]$ is the expansion itself.

As we shall see, macros typically use the macro state to define what should happen after one macro expansion. The initial macro state defined in Section \ref{section:TheInitialMacroState} just specifies that the macro expander should be reinvoked which ensures that macro expansion proceeds until all macros are expanded. But macros may decide not to reinvoke the macro expander. Or they may decide to reinvoke it but with a modified macro state. Or they may decide to invoke an entirely different macro expander.

If the term to be expanded is a page construct, the macro expander returns the term unchanged (page constructs should not be macro expanded for reasons explained later). Otherwise, the macro expander looks up the macro definition of the root of the term and passes control to an auxiliary function:

\display{$
[
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {s}
!
\mathsf {c}
!
\mathrm {If}(
\mathsf {t}
{}^{i}
{}^s
,\linebreak [0]
\mathsf {t}
,\linebreak [0]
{\cal M}_2(
\mathsf {t}
,
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {macro}\mbox {\tt \char34}
, 
\mathsf {t}
, 
\mathsf {c}
)
,
\mathsf {s}
,
\mathsf {c}
)
)
]$}

$[
{\cal M}_2(
\mathsf {t}
,
\mathsf {d}
,
\mathsf {s}
,
\mathsf {c}
)]$ macro expands the term $[
\mathsf {t}]$ whose root symbol has macro definition $[
\mathsf {d}]$ for the macro state $[
\mathsf {s}]$ and the cache $[
\mathsf {c}]$. If the macro definition equals $[
\mathsf {T}]$ then the root symbol has no macro definition. In this case, the subterms of the term are macro expanded. Otherwise, $[
{\cal M}_2(
\mathsf {t}
,
\mathsf {d}
,
\mathsf {s}
,
\mathsf {c}
)]$ evaluates the right hand side $[
\mathsf {d}
{}^{3}]$ of the definition (for completeness: $[
\mathsf {d}
{}^{0}]$ is a symbol that denotes the ``definition'' concept, $[
\mathsf {d}
{}^{1}]$ is a term that represents the macro aspect,  $[
\mathsf {d}
{}^{2}]$ is the left hand side and $[
\mathsf {d}
{}^{3}]$ is the right hand side of the definition). Finally, the evaluated right hand side is applied to the term $[
\mathsf {t}]$, the macro state $[
\mathsf {s}]$, and the cache $[
\mathsf {c}]$ so that the user defined macro $[
\mathsf {d}]$ gets access to term, state, and cache (at expansion time, the cache will be the cache of the page on which the term being macro expanded resides).

\display{$
[
{\cal M}_2(
\mathsf {t}
,
\mathsf {d}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {d}
\left\{\protect \begin {array}{l}
\mathsf {t}
{}^h
\mathrel { : \, : }
{\cal M}^*(
\mathsf {t}
{}^t
,
\mathsf {s}
,
\mathsf {c}
)
\\
{\cal U}^M(
{\cal E}(
\mathsf {d}
{}^{3}
,
\mathsf {T}
,
\mathsf {c}
)
\mathbin {\mbox {`}}
\mathsf {t}
\mathbin {\mbox {`}}
\mathsf {s}
\mathbin {\mbox {`}}
\mathsf {c}
)
\protect \end {array}\right.
]$}

The $[
{\cal M}^*(
\mathsf {a}
,
\mathsf {s}
,
\mathsf {c}
)]$ construct macro expands the elements of the list $[
\mathsf {a}]$.

\display{$
[
{\cal M}^*(
\mathsf {a}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {s}
!
\mathsf {c}
!
\mathrm {If}(
\mathsf {a}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
{\cal M}(
\mathsf {a}
{}^h
,
\mathsf {s}
,
\mathsf {c}
)
\mathrel { : \, : }
{\cal M}^*(
\mathsf {a}
{}^t
,
\mathsf {s}
,
\mathsf {c}
)
)
]$}



\subsubsection{The initial macro state}\label{section:TheInitialMacroState}

The \index{macro state, initial}\indexintro{initial macro state} $[
s_0]$ is useful for passing as the second parameter to $[
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$. $[
s_0]$ is a pair whose head is the macro expander itself and whose tail is left blank. The definition of $[
s_0]$ reads:

\display{$
[
s_0
\stackrel{
\mathrm {val}
}{\rightarrow}
{\cal M}(
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)
)
\mathrel { : \, : }
\mathsf {T}
]$}

In the definition of $[
s_0]$ note that the first ${\cal M}$ is a unary ``map tag'' operation that converts the lambda abstraction into a tagged map whereas the second ${\cal M}$ is the ternary macro expansion operation.

Advanced users may write macros that pass down a macro state different from $[
s_0]$. Such users should pass down a macro state of form $[
\mathsf {m}
\mathrel { : \, : }
\mathsf {p}]$ where $[
\mathsf {m}]$ is a ternary macro expander and $[
\mathsf {p}]$ is a parameter that can contain arbitrary data. The default macro expander $[
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ makes no use of the parameter and for that reason the parameter is set to $[
\mathsf {T}]$ in $[
s_0]$.



\subsubsection{Pruning}\label{section:pruning}

In connection with macro expansion, Logiweb uses a hardwired retract on G{\"odel} trees which we shall refer to as \indexintro{pruning}.

Given the cache of a page and an arbitrary data structure, the pruning operation scans the data structure as if it were a G{\"odel} tree. Whenever the pruning operation encounters a branch that cannot be a G{\"odel} tree, it replaces the branch by the page construct of the given page.

The pruning operation first applies the retract for tagged trees to the given data structure. Then, for each branch of the G{\"odel} tree, it checks that the reference and identifier are cardinals. Then it looks up the arity of the associated symbol in the proper dictionary inside the cache of the given page. If no arity is found, the symbol is invalid and the branch is pruned. Otherwise, the pruning operation checks that the number of subtrees agree with the arity and descend recursively into the subtrees.

If no arity is found for a given symbol it either means that the symbol does not exist on Logiweb or that it exists, but not on a page transitively referenced by the given page.



\subsubsection{Potentially inherited page aspects}\label{section:InheritedAspects}

Macro expansion of a page is governed by the ``potentially inherited macro aspect'' of the page. The potentially inherited macro aspect is an example of a \index{inherited page aspect, potentially}\index{page aspect, potentially inherited}\index{aspect, potentially inherited page}\indexintro{potentially inherited page aspect}. Let us take ``potentially inherited page aspect'' one word at a time.

Aspects of the page construct of a page are ``page aspects'' for that page.

An ``inherited page aspect'' of a page $[
\mathsf {p}]$ is a page aspect of the \index{bed, page}\indexintro{page bed} $[
\mathsf {b}]$ of page $[
\mathsf {p}]$. The bed $[
\mathsf {b}]$ of a page $[
\mathsf {p}]$ is the first page referenced in the bibliography of page $[
\mathsf {p}]$. If page $[
\mathsf {p}]$ is a base page, i.e.\ if page $[
\mathsf {p}]$ references no other pages, then the bed of page $[
\mathsf {p}]$ is page $[
\mathsf {p}]$ itself. The bed $[
\mathsf {b}]$ of a page $[
\mathsf {p}]$ is the page on which page $[
\mathsf {p}]$ rests.

Note for programmers: The first entry of the bibliography of a page is the one that comes after the zeroth entry. The zeroth entry references the page itself. A bibliography is a list of references, and the head of the list is the zeroth entry.

But back to ``potentially inherited page aspects''. A potentially inherited page aspect of a page $[
\mathsf {p}]$ is taken from the page construct of $[
\mathsf {p}]$ if that aspect is available, and is taken from the page construct of the bed of $[
\mathsf {p}]$ otherwise. As an example, the potentially inherited macro aspect of page $[
\mathsf {p}]$ is the macro aspect of the page construct of page $[
\mathsf {p}]$ if such an aspect is defined, and else the macro aspect of the page construct of the bed of $[
\mathsf {p}]$ if such an aspect is defined.

At the time of writing, Logiweb makes use of two potentially inherited page aspects: the macro aspect described in the following, and the claim aspect described in Section \ref{section:Claims}. At a later stage, Logiweb will also make use of a potentially inherited value aspect which defines things to be computed once and for all when pages are loaded and an unconditionally inherited unpack aspect which may decompress and/or decrypt Logiweb vectors when loaded.



\subsubsection{Installing the macro expander}

We shall refer to the G{\"o}del tree that constitutes the macro expanded version of a page as the \indexintro{expansion} of the page. We define the \indexintro{expander} of a page to be the potentially inherited macro aspect of the page.

Logiweb expands a page by applying the expander to the body and cache of the page. If no expander is defined then Logiweb does no macro expansion and uses the body unchanged as expansion.

Now define

\display{$
[
\mbox{base}
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {c}
.
{\cal M}(
\mathsf {t}
,
s_0
,
\mathsf {c}
)
]$}

Because of the definition above, the expansion of the present page is the pruned version of $[
{\cal M}(
\mathsf {t}
,
s_0
,
\mathsf {c}
)]$ where $[
\mathsf {t}]$ and $[
\mathsf {c}]$ are the body and cache, respectively, of the page.

Another page that uses the present page as bed and defines no expander of its own also has expansion $[
{\cal M}(
\mathsf {t}
,
s_0
,
\mathsf {c}
)]$ but then $[
\mathsf {t}]$ and $[
\mathsf {c}]$ are the body and cache, respectively, of that other page.

Recall that the macro expander $[
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ does not macro expand page constructs. One reason for that is that the macro aspect of the page construct defines an expander rather than a macro.



\subsubsection{Iterated macro expansion}\label{section:IteratedMacroExpansion}

The description of macro expansion above is part of the story rather than the whole story.

As descripted in Section \ref{section:loading}, Logiweb ``loads'' a page by ``resolving'' its reference into a Uniform Resource Locator, then ``retrieves'' the page as a vector of bytes, then ``unpacks'' the vector into bibliography, dictionary, and body, then ``codifies'' the page into codex and expansion, and finally ``verifies'' the page.

Codification comprises macro expansion and ``harvesting''. Harvesting is done by scanning the expansion of a page for revelations, i.e.\ proclamations, definitions, and introductions. The process of harvesting converts the expansion, which is a G{\"o}del tree, into a codex.

Codification proceeds thus: First, with the exception stated in Section \ref{section:Bootstrapping}, Logiweb sets the codex of the page to be empty. Then Logiweb macro expands the body of the page using the empty codex for the page in question plus all the codicies of referenced pages. Then Logiweb sets the codex of the page to the result of harvesting the expansion, and then Logiweb macro expands the body of the page once more. Logiweb proceeds this way until the codex does not change anymore (if ever). This is what was meant by ``reading the page over and over again'' in Section \ref{section:loading} and \ref{section:Bootstrapping}.



\subsection{Macro definitions}

\subsubsection{Protection}

$[(
\mathsf{x}
)^{\mathbf {p}}]$ is a particularly important macro; it protects its argument against macro expansion. During macro expansion, the protection construct itself disappears. The definition of protection is not completely trivial:

\display{$(
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
\mathsf {t}
{}^{1}
]
)^{\mathbf {p}}$}

Note that the definition has two occurrences of the protection construct: an outermost and an innermost.

At first reading of the page, no expander has been defined yet, the definition construct has not yet been proclaimed, and Logiweb has not yet understood what the protection construct is supposed to do.

After a couple of readings, Logiweb has still not understood what the protection construct is supposed to do, but has reached a level where it can understand that the formula above defines the macro aspect of the protection construct.

At the next reading of the page, the protection construct is operational, and for that reason, the outermost protection construct protects the innermost protection construct from macro expansion. Without the outermost protection construct, the innermost protection construct would disappear so that it was $[
\mathsf{x}]$ that was macro defined to denote protection, which leads to disaster.

It should be noted that base pages as large as the present one are not particularly easy to write. There are many things that can go wrong in intractable ways. Authors who insist on writing their own base page are encouraged to build them up in small steps, starting with a base page as simple as possible.



\subsubsection{Self references}\label{section:SelfReferences}

We macro define $[
\mbox{self}]$ such that each instance of $[
\mbox{self}]$ expands to the page construct of the page on which the instance occurs.

\display{$(
[
\mbox{self}
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
(
\mathsf {c}
{[}
0
{]}
\mathrel { : \, : }
0
\mathrel { : \, : }
\mathsf {t}
{}^{d}
){}^{I} 
\mathrel { : \, : }
\mathsf {T}
]
)^{\mathbf {p}}$}

Alternatively, one could define $[
\mbox{self}]$ to expand into an invalid tree and let pruning insert a page construct. As an example, one could replace the entire right hand side above by $[
\mathsf {T}]$. But the definition above ensures that resulting page sysmbol enherits the debugging information present in the $[
\mbox{self}]$ construct.



\subsubsection{Avoid macro expansion and harvesting of strings}\label{section:AvoidMacroExpansionAndHarvestingOfStrings}

Good Logiweb pages contain loads of text. Actually, the formal mathematics present on well written Logiweb pages only constitute a minor fraction of the page. Since macro expansion takes time, we arrange that strings are not macro expanded.

The pyk compiler puts a unicode start and end of text construct at the root and leaf of strings, respectively, with the individual characters of the string in between as a row of perls (or, rather, a column of perls; in the string itself, the characters are like a row of perls). We can protect strings against macro expansion by a proper definition of the macro aspect of the unicode start of text construct:

\display{$
[
\mbox{``}
\mathsf{x}
\mbox{''}
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
\mathsf {t}
]$}

Once Logiweb has expanded the body of a page, it does \indexintro{harvesting} of definitions: it scans the expansion and collects all definitions found. To avoid spending time on harvesting inside strings, we proclaim the unicode start of text construct to protect against harvesting:

\display{$
[
\mbox{``}
\mathsf{x}
\mbox{''}
\bowtie
\mbox{``}hide
\mbox{''}
]$}



\subsubsection{Macro definitions}

$(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$ defines $[
\mathsf{x}]$ as shorthand for $[
\mathsf{y}]$. Hence, $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$ makes ordinary macro definitions. The definition of $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$ is slightly involved since $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$ is defined such that it macro expands into a general macro definition.

\display{$(
[
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
\tilde {{\cal M}}_3(
\mathsf {t}
)
]
)^{\mathbf {p}}$}

$[
\tilde {{\cal M}}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ macro expands the term $[
\mathsf {t}]$ using the macro expander embedded in the macro state $[
\mathsf {s}]$ using the cache $[
\mathsf {c}]$.

\display{$
[
\tilde {{\cal M}}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
{\cal U}(
\mathsf {s}
{}^h
\mathbin {\mbox {`}}
\mathsf {t}
\mathbin {\mbox {`}}
\mathsf {s}
\mathbin {\mbox {`}}
\mathsf {c}
)
]$}

$[
\tilde {{\cal M}}_1]$ is a template that defines what $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$ expands into:

\display{$
[
\tilde {{\cal M}}_1
\stackrel{
\mathrm {val}
}{\rightarrow}
\lceil 
[
\mathsf{x}
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
\tilde {{\cal M}}_4(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
,
\lceil 
\mathsf {d}
\rceil 
)
]
\rceil 
]$}

If $[
\mathsf {t}]$ is a term of form $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$ then $[
\tilde {{\cal M}}_2(
\mathsf {t}
)]$ is a stack that maps the variable $[
\mathsf{x}]$ to the left hand side of the macro definition and maps the variable $[
\mathsf {d}]$ to the entire macro definition.

\display{$
[
\tilde {{\cal M}}_2(
\mathsf {t}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
(
\lceil 
\mathsf{x}
\rceil 
\mathrel { : \, : }
\mathsf {t}
{}^{1}
)^M
\mathrel { : \, : }
(
\lceil 
\mathsf {d}
\rceil 
\mathrel { : \, : }
\mathsf {t}
)^M
\mathrel { : \, : }
\mathsf {T}
]$}

$[
\tilde {{\cal M}}_3(
\mathsf {t}
)]$ translates a term $[
\mathsf {t}]$ of form $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$ into a general macro definition. This is done by replacing $[
\mathsf{x}]$ and $[
\mathsf {d}]$ in the template $[
\tilde {{\cal M}}_1]$ by the left hand side of $[
\mathsf {t}]$ and all of $[
\mathsf {t}]$, respectively.

\display{$
[
\tilde {{\cal M}}_3(
\mathsf {t}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\tilde {{\cal Q}}(
\mathsf {t}
,
\tilde {{\cal M}}_1
,
\tilde {{\cal M}}_2(
\mathsf {t}
)
)
]$}

$[
\tilde {{\cal M}}_4(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
,
\mathsf {d}
)]$ performs the macro expansion defined by $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$. The function above macro expands $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$. The function below expands the macro defined by $(
[
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{y}
]
)^{\mathbf {p}}$.

\display{$
[
\tilde {{\cal M}}_4(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
,
\mathsf {d}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\tilde {{\cal M}}(
\tilde {{\cal Q}}(
\mathsf {t}
,
\mathsf {d}
{}^{2}
,
\mathbf {zip}(
\mathsf {d}
{}^{1}
{}^t
,
\mathsf {t}
{}^t
)
)
,
\mathsf {s}
,
\mathsf {c}
)
]$}

$[
\tilde {{\cal Q}}(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
)]$ performs the substitutions defined by the stack $[
\mathsf {s}]$ in the term $[
\mathsf {t}]$. Set the debugging information of all nodes taken from $[
\mathsf {t}]$ to the debugging information of the root of the term $[
\mathsf {r}]$.

\display{$
[
\tilde {{\cal Q}}(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\tilde {{\cal Q}}_2(
\mathsf {r}
{}^{d}
,
\mathsf {t}
,
\mathsf {s}
)
]$}

$[
\tilde {{\cal Q}}_2(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
)]$ performs the substitutions defined by the stack $[
\mathsf {s}]$ in the term $[
\mathsf {t}]$. Set the debugging information of all nodes taken from $[
\mathsf {t}]$ to the debugging information $[
\mathsf {r}]$.

\display{$
[
\tilde {{\cal Q}}_2(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\tilde {{\cal Q}}_3(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
,
\mathbf {lookup}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {T}
)
)
]$}

$[
\tilde {{\cal Q}}_3(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
,
\mathsf {v}
)]$ performs the substitutions defined by the stack $[
\mathsf {s}]$ in the term $[
\mathsf {t}]$. Set the debugging information of all nodes taken from $[
\mathsf {t}]$ to the debugging information $[
\mathsf {r}]$. If $[
\mathsf {v}]$ differs from $[
\mathsf {T}]$ then $[
\mathsf {t}]$ is supposed to occur in $[
\mathsf {s}]$ and $[
\mathsf {v}]$ is supposed to be the associated value. Hence, if $[
\mathsf {v}]$ differs from $[
\mathsf {T}]$ then $[
\mathsf {v}]$ is returned. Otherwise, the root of $[
\mathsf {t}]$ is merged properly with the debugging information $[
\mathsf {r}]$ and substitutions are performed in all subterms of $[
\mathsf {t}]$.

\display{$
[
\tilde {{\cal Q}}_3(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
,
\mathsf {v}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {v}
\left\{\protect \begin {array}{l}
(
\mathsf {t}
{}^{r}
\mathrel { : \, : }
\mathsf {t}
{}^{i}
\mathrel { : \, : }
\mathsf {r}
)^M
\mathrel { : \, : }
\tilde {{\cal Q}}^*(
\mathsf {r}
,
\mathsf {t}
{}^t
,
\mathsf {s}
)
\\
\mathsf {r}
!
\mathsf {t}
!
\mathsf {s}
!
\mathsf {v}
\protect \end {array}\right.
]$}

$[
\tilde {{\cal Q}}^*(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
)]$ performs the substitutions defined by the stack $[
\mathsf {s}]$ in the list $[
\mathsf {t}]$ of terms. Set the debugging information of all nodes taken from $[
\mathsf {t}]$ to the debugging information $[
\mathsf {r}]$.

\display{$
[
\tilde {{\cal Q}}^*(
\mathsf {r}
,
\mathsf {t}
,
\mathsf {s}
)
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {t}
\left\{\protect \begin {array}{l}
\mathsf {r}
!
\mathsf {t}
!
\mathsf {s}
!
\mathsf {T}
\\
\tilde {{\cal Q}}_2(
\mathsf {r}
,
\mathsf {t}
{}^h
,
\mathsf {s}
)
\mathrel { : \, : }
\tilde {{\cal Q}}^*(
\mathsf {r}
,
\mathsf {t}
{}^t
,
\mathsf {s}
)
\protect \end {array}\right.
]$}



\subsubsection{Parentheses}\sect{Parentheses}

$[
(
\mathsf{x}
)]$ is probably the most important among all macros, at least from the point of view of the working mathematician. Parentheses simply disappear when macro expanded:

\display{$
[
(
\mathsf{x}
)
\mathrel {\ddot {=}}
\mathsf{x}
]$}

The following construct uses \verb+\left(...\right)+ to render parentheses. Beware that the construct disables line breaking.



\addvspace{\abovedisplayskip}

\setlength{\leftskip}{\mathindent}\noindent $
[
\left( 
\mathsf{x}
\right) 
\mathrel {\ddot {=}}
\mathsf{x}
]$%
\footnote{$[
\left( 
\mathsf{x}
\right) 
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}big
\linebreak [0]\ \hskip0em plus2.0em{}parenthesis
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}parenthesis
\mbox{''}
]$}\index{\alpha big parenthesis * end parenthesis @\back \makebox[20mm][l]{$[
\left( 
\mathsf{x}
\right) ]$}big parenthesis * end parenthesis}%
\index{pyk: big parenthesis * end parenthesis $[
\left( 
\mathsf{x}
\right) ]$}%
\tex{
$[
\left( 
\mathsf{x}
\right) 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}left(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}right)
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}
\everypar{\setlength{\parindent}{\docparindent}}
\setlength{\parindent}{0mm}

\setlength{\leftskip}{0mm}
\addvspace{\belowdisplayskip}





\subsection{Tagged lambda}\sect{TaggedLambda}

The following macro definition allows to state tagged lambdas in a readable way:



\addvspace{\abovedisplayskip}

\setlength{\leftskip}{\mathindent}\noindent $
[
\Lambda 
\mathsf{x}
. 
\mathsf{y}
\mathrel {\ddot {=}}
\Lambda 
\lambda 
\mathsf{x}
.
\mathsf{y}
]$%
\footnote{$[
\Lambda 
\mathsf{x}
. 
\mathsf{y}
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}tagged
\linebreak [0]\ \hskip0em plus2.0em{}lambda
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}dot
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\mbox{''}
]$}\index{\alpha tagged lambda * dot * @\back \makebox[20mm][l]{$[
\Lambda 
\mathsf{x}
. 
\mathsf{y}]$}tagged lambda * dot *}%
\index{pyk: tagged lambda * dot * $[
\Lambda 
\mathsf{x}
. 
\mathsf{y}]$}%
\tex{
$[
\Lambda 
\mathsf{x}
. 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}Lambda
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline .
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}
\everypar{\setlength{\parindent}{\docparindent}}
\setlength{\parindent}{0mm}

\setlength{\leftskip}{0mm}
\addvspace{\belowdisplayskip}





\subsubsection{Local abbreviations}\sect{LocalAbbreviations}

The following construct allows to override macros locally:

%
\index{let @\back $[
\mathbf{let\ } 
\mathsf{x}
\mathrel{\ddot{=}} 
\mathsf{y}
\mathrel{\ in\ } 
\mathsf{z}]$ let x abbreviate y in z}%
%
\tex{$
[
\mathbf{let\ } 
\mathsf{x}
\mathrel{\ddot{=}} 
\mathsf{y}
\mathrel{\ in\ } 
\mathsf{z}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{let
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\{
\mbox {$\backslash $}ddot
\{
{=}
\}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}mathrel
\{
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}in
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\mbox{''}
]$}%
%
\display{$(
[
\mathbf{let\ } 
\mathsf{x}
\mathrel{\ddot{=}} 
\mathsf{y}
\mathrel{\ in\ } 
\mathsf{z}
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
\newline 
\tilde {{\cal M}}(
\mathsf {t}
{}^{3}
,
\mathsf {s}
,
\mathsf {c}
[ 
\mathsf {t}
{}^{1}
{}^{r}
\mathrel { : \, : }
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
\mathrel { : \, : }
\mathsf {t}
{}^{1}
{}^{r}
\mathrel { : \, : }
\mathsf {t}
{}^{1}
{}^{i}
\mathrel { : \, : }
0
\mathrel { : \, : }
\mbox {\tt \char34}\mathrm {macro}\mbox {\tt \char34}
\mathrel { : \, : }
\mathsf {T}
{\Rightarrow} 
\tilde {{\cal M}}_3(
\mathsf {t}
)
]
)
]
)^{\mathbf {p}}$%
%
}
%

As a somewhat constructed example of use,

\display{$[
\mathbf{let\ } 
(
\mathsf{x}
)
\mathrel{\ddot{=}} 
\mathsf{x}
\mathrel { : \, : }
\mathsf{x}
\mathrel{\ in\ } 
(
3
)]$}

macro expands to

\display{$[
3
\mathrel { : \, : }
3]$}



\subsubsection{Other kinds of definitions}

The following constructs allow to define particular aspects of a left hand side to be the given right hand side.

The following construct is useful for value definitions.

\display{$
[
[
\mathsf{x}
\mathrel {\dot {=}}
\mathsf{y}
]
\mathrel {\ddot {=}}
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf{y}
]
]$}

Use of the construct above for value definitions on which the definition of the macro expander depends may lead to intractable errors. For that reason, the present page is organised such that the construct above is only used from Section \ref{section:Claims} and on and such that the macro expander only depends on definitions stated before \ref{section:Claims}. Logiweb does not care about the order of definitions. The avoidance of vicious circles by dividing at the start of Section \ref{section:Claims} is just for the sake of the author.

The following construct is suitable for value introductions, i.e.\ for value definitions of constructs for which the Logiweb system in use is expected to contain a hardcoded version. As with the value definition, it is not used before Section \ref{section:Claims}.

\display{$
[
[
\mathsf{x}
\mathrel {\acute {=}}
\mathsf{y}
]
\mathrel {\ddot {=}}
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf{y}
]
]$}

The following constructs are convenient for defining $[
\mathrm{pyk}]$, $[
\mathrm{tex}]$, and $[
\mathrm{name}]$ definitions. The constructs protect the left hand side against macro expansion and ensures that the right hand side is typeset as a string. The three constructs below are used uncritically on the present page since rendering is done after codification and, hence, cannot interfere with codification.

\display{$
[
[
\mathsf{x}
\stackrel {\mathrm {pyk}}{=} 
\mathsf{y}
]
\mathrel {\ddot {=}}
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mathsf{y}
]
]$}

\display{$
[
[
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mathsf{y}
]
\mathrel {\ddot {=}}
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mathsf{y}
]
]$}

\display{$
[
[
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mathsf{y}
]
\mathrel {\ddot {=}}
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel{
\mathrm{name}
}{\rightarrow}
\mathsf{y}
]
]$}

Finally, the following construct is convenient for defining priority tables.

%
\index{priority table @\back $[
\mathbf{Priority\ table} [ 
\mathsf{x}
]]$ priority table x end table}%
%
\tex{$
[
\mathbf{Priority\ table} [ 
\mathsf{x}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{Priority
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}table
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}mathbf
\{End
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}table
\}
\mbox{''}
]$}%
%
\tex{$
[
\mathbf{Priority\ table} [ 
\mathsf{x}
]
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{Priority
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}table
\}
\linebreak [0]\ \hskip0em plus2.0em{}[
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ]
\mbox{''}
]$}%
%
\display{$
[
\mathbf{Priority\ table} [ 
\mathsf{x}
]
\mathrel {\ddot {=}}
[
\mbox{self}
\stackrel{
\mathrm{prio}
}{\rightarrow}(
\mathsf{x}
)^{\mathbf {p}}
]
]$%
}
%



\subsubsection{Tuples}

We shall use
\index{tuple x end tuple $[
\langle 
\mathsf{x}
\rangle ]$}
\index{\alpha tuple x end tuple@\back $[
\langle 
\mathsf{x}
\rangle ]$ tuple x end tuple}
\tex{$
[
\langle 
\ast 
\rangle 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}langle
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}rangle
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}$[
\langle 
\mathsf{x}
\rangle ]$ and
%
\index{x comma y $[
\mathsf{x}
,\linebreak [0] 
\mathsf{y}]$}
\index{\alpha x comma y@\back $[
\mathsf{x}
,\linebreak [0] 
\mathsf{y}]$ x comma y}
\tex{$
[
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline ,
\mbox {$\backslash $}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}[0]
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}$[
\mathsf{x}
,\linebreak [0] 
\mathsf{y}]$
%
to express tuples. $[
\langle 
\mathsf{x}
\rangle ]$ will be macro defined such that e.g. $[
\langle 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
,\linebreak [0] 
\mathsf{z}
\rangle ]$ macro expands into $[
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\mathrel { : \, : }
\mathsf{z}
\mathrel { : \, : }
\mathsf {T}]$.

\display{$(
[
\langle 
\mathsf{x}
\rangle 
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
\tilde {{\cal M}}(
\mathbf {tuple}_1( 
\mathsf {t}
) 
,
\mathsf {s}
,
\mathsf {c}
)
]
)^{\mathbf {p}}$}

\index{tuple 1 @\back $[
\mathbf {tuple}_1( 
\mathsf {t}
) ]$}
\tex{$
[
\mathbf {tuple}_1( 
\ast 
) 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{tuple
\}
\_1(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline )
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}$[
\mathbf {tuple}_1( 
\mathsf {t}
) ]$ expands the root of $[
\langle 
\mathsf{x}
\rangle ]$:

\display{$
[
\mathbf {tuple}_1( 
\mathsf {t}
) 
\stackrel{
\mathrm {val}
}{\rightarrow}
\mathsf {t}
{}^{1}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rceil 
\left\{\protect \begin {array}{l}
\tilde {{\cal Q}}(
\mathsf {t}
,
\lceil 
\mathsf{x}
\mathrel { : \, : }(
\langle 
\mathsf{y}
\rangle 
)^{\mathbf {p}}
\rceil 
,
\mathbf {tuple}_2( 
\mathsf {t}
{}^{1}
) 
)
\\
\tilde {{\cal Q}}(
\mathsf {t}
,
\lceil 
\mathsf{x}
\mathrel { : \, : }
\mathsf {T}
\rceil 
,
(
\lceil 
\mathsf{x}
\rceil 
\mathrel { : \, : }
\mathsf {t}
{}^{1}
)
\mathrel { : \, : }
\mathsf {T}
)
\protect \end {array}\right.
]$}

\index{tuple 2 @\back $[
\mathbf {tuple}_2( 
\mathsf {t}
) ]$}
\tex{$
[
\mathbf {tuple}_2( 
\ast 
) 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{tuple
\}
\_2(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline )
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}$[
\mathbf {tuple}_2( 
\mathsf {t}
) ]$ forms the stack used when expanding $[
\langle 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle ]$:

\display{$
[
\mathbf {tuple}_2( 
\mathsf {t}
) 
\stackrel{
\mathrm {val}
}{\rightarrow}
(
\lceil 
\mathsf{x}
\rceil 
\mathrel { : \, : }
\mathsf {t}
{}^{1}
)
\mathrel { : \, : }
(
\lceil 
\mathsf{y}
\rceil 
\mathrel { : \, : }
\mathsf {t}
{}^{2}
)
\mathrel { : \, : }
\mathsf {T}
]$}



\subsubsection{Typography of the expansion}

The author of a Logiweb page should ensure that the tex aspect of the body looks good when typeset by \TeX. Among other, the author should avoid overfull and underfull \TeX\ boxes in the body.

When it comes to the expansion of the page, matters are a bit different. Firstly, the aesthetics of the expansion is less important since the expansion does not address the audience to the same degree as the body does. Secondly, precise control of the typography of the expansion is more intricate.

For these reasons it is convenient to typeset the expansion in a \index{right, ragged}\indexintro{ragged right} style. To do so we first introduce a contruct 
%
\index{ragged right @\back $[
ragged\ right]$ ragged right}%
%
\tex{$
[
ragged\ right
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}raggedright
\mbox{''}
]$}%
%
\tex{$
[
ragged\ right
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline ragged
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}right
\mbox{''}
]$}%
%
$[
ragged\ right]$%
%
which produces a \verb+\raggedright+ command when typeset using its tex aspect.

Second, we introduce a construct which is invisible when typeset using its tex aspect but which macro expands into the construct above:

%
\index{ragged right expansion @\back $[
ragged\ right\ expansion\ ]$ ragged right expansion}%
%
\tex{$
[
ragged\ right\ expansion\ 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox{''}
]$}%
%
\tex{$
[
ragged\ right\ expansion\ 
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline ragged
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}right
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}expansion
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
\display{$
[
ragged\ right\ expansion\ 
\mathrel {\ddot {=}}
ragged\ right
]$%
%
}
%

Including the latter construct above near the start of a Logiweb page, the expansion of the page will be typeset ragged right without affecting the supposedly splendid typography the body.



\subsection{Programming aids}

\subsubsection{Newlines in definitions}

Traditional mathematical formulas typically fit on a single line. Formally, a computer program is nothing but a mathematical formula, but computer programs have a tendency to span more than one line. This is so even if one breaks up a computer program in individual definitions of computable functions and consider each definition at a time.

For the sake of readablity, it is often convenient to control where line breaks occur in definitions of computable functions. To allow such control we introduce a newline construct whose tex name aspect is ``newline'' but whose tex aspect simply forces the formula following it to begin on a new line.

The newline construct is prefix and should be put in front of the formula to begin a new line.

\index{newline @\back $[
newline\ 
\mathsf{x}]$ newline x}%
%
\tex{$
[
newline\ 
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\mbox{''}
]$}%
%
\tex{$
[
newline\ 
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline newline
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\mbox{''}
]$}%
%
\display{$
[
newline\ 
\mathsf{x}
\mathrel {\dot {=}}
\mathsf{x}
{}^M
]$%
%
}

The newline construct is value defined such that it retracts which allows it to occur in functions that are fit for optimization.

The newline construct can be value or macro defined. Above, it has been value defined so that it also affects the typography of the expansion of the page. That is convenient for debugging. In formal reasoning about a computable function it is more convenient to have a newline construct that macro expands to nothingness:

\index{newline @\back $[
macro\ newline\ 
\mathsf{x}]$ macro newline x}%
%
\tex{$
[
macro\ newline\ 
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\mbox{''}
]$}%
%
\tex{$
[
macro\ newline\ 
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline macro
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}newline
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\mbox{''}
]$}%
%
\display{$
[
macro\ newline\ 
\mathsf{x}
\mathrel {\ddot {=}}
\mathsf{x}
]$%
%
}



\subsubsection{The visibility operator}

We now introduce a \indexintro{visibility} operator
%
\index{v: \back $[
( 
\mathsf{x}
)^{\bf v}]$ make visible x end visible}%
%
\index{make visible x end visible $[
( 
\mathsf{x}
)^{\bf v}]$}%
%
\tex{$
[
( 
\mathsf{x}
)^{\bf v}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\mbox{''}
]$}%
%
\tex{$
[
( 
\mathsf{x}
)^{\bf v}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline (
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline )
{\char94}
\{
\mbox {$\backslash $}bf
\linebreak [0]\ \hskip0em plus2.0em{}v
\}
\mbox{''}
]$}%
%
$
[
( 
\mathsf{x}
)^{\bf v}
\mathrel {\ddot {=}}
\mathsf{x}
]$%
%
which forces its argument to be typeset using the tex name aspect and which macro expands to nothingness like parentheses do. The construct is useful in situations where e.g.\ the right hand side of a definition contains operators whose tex aspect make them invisible.

When typeset in the tex aspect, the visibility operator does not exhibit itself, it just affects how its argument is typeset. When typeset in the tex name aspect, the visibility operator reads $[
( 
\mathsf{x}
)^{\bf v}]$.

The bracket $[
( 
\mathsf{x}
)^{\bf v}]$ contains two visibility operators. The outermost operator makes the innermost visible.

The visibility operator $[
( 
\mathsf{x}
)^{\bf v}]$ is almost identical to the text operator $[
(
\mathsf{x}
)^{\bf t}]$. The difference is that the visibility operator macro expands into nothingness whereas the text operator is value defined such that it is self-evaluating.

The bracket $[
(
\mathsf{x}
)^{\bf t}]$ contains a visibility and a text operator. The visibility operator makes the text operator visible.



\subsubsection{Self-evaluation}

The juxtaposition operator $[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}]$ has a tex name aspect that reads $[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}]$ and a tex aspect that reads $[
\mathsf{x}
\mathsf{y}]$. The tex aspect of the juxtaposition operator allows to put two typographic entities back-to-back. In the following we silently use the $[
( 
\mathsf{x}
)^{\bf v}]$ operator to make juxtaposition visible.

We make juxtaposition \indexintro{self-evaluating}:

\display{$
[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\ast 
\mathrel{\mathrm{,}}
\ast 
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$}

The definition above has the effect that e.g.\ $[
\lceil 
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}
\rceil ]$ denotes the same term as $[
\lceil 
\mathsf{x}
\rceil 
\mathrel{\mathrm{,}}
\lceil 
\mathsf{y}
\rceil ]$ except for debugging information present in the terms. The root of the latter is ``clean'' in the sense that its debugging information equals $[
\mathsf {T}]$.

We also make the ``text'' construct self-evaluating:

\display{$
[
(
\mathsf{x}
)^{\bf t}
\mathrel {\dot {=}}
\langle 
\lceil 
(
\ast 
)^{\bf t}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
\rangle 
]$}



\subsubsection{Open if}

The \index{if, open}\indexintro{open if} construct is defined thus:

\index{if: $[
{\bf if} \ 
\mathsf{x}
\ {\bf then} \ 
\mathsf{y}
\ {\bf else} \ 
\mathsf{z}]$ open if x then y else z}%
%
\index{open if x then y else z $[
{\bf if} \ 
\mathsf{x}
\ {\bf then} \ 
\mathsf{y}
\ {\bf else} \ 
\mathsf{z}]$}%
%
\tex{$
[
{\bf if} \ 
\mathsf{x}
\ {\bf then} \ 
\mathsf{y}
\ {\bf else} \ 
\mathsf{z}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}bf
\linebreak [0]\ \hskip0em plus2.0em{}if
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}bf
\linebreak [0]\ \hskip0em plus2.0em{}then
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}bf
\linebreak [0]\ \hskip0em plus2.0em{}else
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\mbox{''}
]$}%
%
\display{$
[
{\bf if} \ 
\mathsf{x}
\ {\bf then} \ 
\mathsf{y}
\ {\bf else} \ 
\mathsf{z}
\mathrel {\ddot {=}}
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{z}
)
]$%
%
}

The open if construct is useful when writing programs with long chains of if-constructs.



\subsubsection{The ``let'' construct}

We define eager, retracting functional application $[
let_1( 
\mathsf {f}
, 
\mathsf{y}
)]$ and the \indexintro{let} construct $[
\mathbf{let\ } 
\mathsf{x}
= 
\mathsf{y}
\mathbf{\ in\ } 
\mathsf{z}]$ as follows:

%
\index{let @\back $[
\mathbf{let\ } 
\mathsf{x}
= 
\mathsf{y}
\mathbf{\ in\ } 
\mathsf{z}]$ let x by y in z}%
%
\tex{$
[
\mathbf{let\ } 
\mathsf{x}
= 
\mathsf{y}
\mathbf{\ in\ } 
\mathsf{z}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{let
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
{=}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}mathbf
\{
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}in
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\mbox{''}
]$}%
%
\display{$
[
\mathbf{let\ } 
\mathsf{x}
= 
\mathsf{y}
\mathbf{\ in\ } 
\mathsf{z}
\mathrel {\ddot {=}}
let_1( 
\lambda 
\mathsf{x}
.
\mathsf{z}
, 
\mathsf{y}
)
]$%
%
}
%

%
\index{let 1 @\back $[
let_1( 
\mathsf{x}
, 
\mathsf{y}
)]$ let one x apply y end let}%
%
\tex{$
[
let_1( 
\mathsf {f}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline let
\_1(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
let_1( 
\mathsf {f}
, 
\mathsf{y}
)
\mathrel {\acute {=}}
let_2( 
\mathsf {f}
, 
\mathsf{y}
{}^M
)
{}^M
]$%
%
}
%

%
\index{let 2 @\back $[
let_2( 
\mathsf{x}
, 
\mathsf{y}
)]$ let two x apply y end let}%
%
\tex{$
[
let_2( 
\mathsf {f}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline let
\_2(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
let_2( 
\mathsf {f}
, 
\mathsf{y}
)
\mathrel {\dot {=}}
(
\mathsf{y}
!
\mathsf {f}
\mathbin {\mbox {'}}
\mathsf{y}
){}^{I} 
]$%
%
}
%

The initial Logiweb engine translates all terms of form $[
let_1( 
\lambda 
\mathsf{x}
.
\mathsf{z}
, 
\mathsf{y}
)]$ to an efficient let-construct internally.

\test{$
\relax [ 
\langle 
2
,\linebreak [0] 
3
,\linebreak [0] 
2
\rangle 
\approx 
\mathbf{let\ } 
\mathsf{x}
= 
2
\mathbf{\ in\ } 
\langle 
\mathsf{x}
,\linebreak [0] 
3
,\linebreak [0] 
\mathsf{x}
\rangle 
\relax ]^{\cdot} $}

\test{$
\relax [ 
0
\approx 
\mathbf{let\ } 
\mathsf{x}
= 
\mathsf {F}
\mathbf{\ in\ } 
\mathsf {T}
\mathrel { \dot { . \, . } }
\mathsf {F}
\relax ]^{\cdot} $}

\test{$
\relax [ 
0
\approx 
\mathbf{let\ } 
\mathsf{x}
= 
\mathsf {F}
\mathbf{\ in\ } 
\mathsf {T}
\mathrel { \dot { . \, . } }
\mathsf{x}
\relax ]^{\cdot} $}

\test{$
\relax [ 
\mathsf {T}
\mathrel { : \, : }
0
\approx 
(
\underline {0}
\mathrel { \dot { . \, . } }
\underline {0}
\mathrel { \dot { . \, . } }
\mathsf {T}
)
\mathrel { \dot { . \, . } }
\lambda 
\mathsf{y}
.
\mathsf{y}
\relax ]^{\cdot} $}

\test{$
\relax [ 
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
\approx 
\mathbf{let\ } 
\mathsf{x}
= 
\lambda 
\mathsf{y}
.
\mathsf{y}
\mathbf{\ in\ } 
(
\underline {0}
\mathrel { \dot { . \, . } }
\underline {0}
\mathrel { \dot { . \, . } }
\mathsf {T}
)
\mathrel { \dot { . \, . } }
\mathsf{x}
\relax ]^{\cdot} $}



\subsubsection{Macro defined connectives}

The connectives $[
\mathsf{x}
\mathrel{\ddot{\wedge}} 
\mathsf{y}]$, $[
\mathsf{x}
\mathrel{\ddot{\vee}} 
\mathsf{y}]$, and $[
\mathsf{x}
\mathrel{\ddot{\Rightarrow}} 
\mathsf{y}]$ macro expand into constructs that only compute $[
\mathsf{y}]$ when needed. Furthermore, the constructs return the value of $[
\mathsf{y}]$ whenever $[
\mathsf{y}]$ is computed.

Such a left-to-right computing behaviour can also be achieved using lazy constructs, but the macro defined connectives above have the benefit that, when used with caution, they can occur in definitions that are fit for optimization.

%
\index{\alpha x macro and y @\back $[
\mathsf{x}
\mathrel{\ddot{\wedge}} 
\mathsf{y}]$ x macro and y}%
%
\index{x macro and y $[
\mathsf{x}
\mathrel{\ddot{\wedge}} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathrel{\ddot{\wedge}} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\{
\mbox {$\backslash $}ddot
\{
\mbox {$\backslash $}wedge
\}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathrel{\ddot{\wedge}} 
\mathsf{y}
\mathrel {\ddot {=}}
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf {F}
)
]$%
%
}
%

%
\index{\alpha x macro or y @\back $[
\mathsf{x}
\mathrel{\ddot{\vee}} 
\mathsf{y}]$ x macro or y}%
%
\index{x macro or y $[
\mathsf{x}
\mathrel{\ddot{\vee}} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathrel{\ddot{\vee}} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\{
\mbox {$\backslash $}ddot
\{
\mbox {$\backslash $}vee
\}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathrel{\ddot{\vee}} 
\mathsf{y}
\mathrel {\ddot {=}}
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf{y}
)
]$%
%
}
%

%
\index{\alpha x macro imply y @\back $[
\mathsf{x}
\mathrel{\ddot{\Rightarrow}} 
\mathsf{y}]$ x macro imply y}%
%
\index{x macro imply y $[
\mathsf{x}
\mathrel{\ddot{\Rightarrow}} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathrel{\ddot{\Rightarrow}} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\{
\mbox {$\backslash $}ddot
\{
\mbox {$\backslash $}Rightarrow
\}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathrel{\ddot{\Rightarrow}} 
\mathsf{y}
\mathrel {\ddot {=}}
\mathrm {If}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf {T}
)
]$%
%
}
%



\subsubsection{Display construct}\sect{DisplayConstruct}

$[
display(
\mathsf{x}
)]$%
\footnote{$[
display(
\mathsf{x}
)
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}display
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}display
\mbox{''}
]$}\index{Display: display * end display @Display: $[
display(
\mathsf{x}
)]$ display * end display}%
\index{pyk: display * end display $[
display(
\mathsf{x}
)]$}%
\tex{
$[
display(
\mathsf{x}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\newline 
\mbox {$\backslash $}addvspace
\{
\mbox {$\backslash $}abovedisplayskip
\}
\newline 
\newline 
\mbox {$\backslash $}setlength
\{
\mbox {$\backslash $}leftskip
\}
\{
\mbox {$\backslash $}mathindent
\}
\mbox {$\backslash $}noindent
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}everypar
\{
\mbox {$\backslash $}setlength
\{
\mbox {$\backslash $}parindent
\}
\{
\mbox {$\backslash $}docparindent
\}
\}
\newline 
\mbox {$\backslash $}setlength
\{
\mbox {$\backslash $}parindent
\}
\{0mm
\}
\newline 
\newline 
\mbox {$\backslash $}setlength
\{
\mbox {$\backslash $}leftskip
\}
\{0mm
\}
\newline 
\mbox {$\backslash $}addvspace
\{
\mbox {$\backslash $}belowdisplayskip
\}
\newline 
\newline 
\mbox{''}
]$}
\tex{
$[
display(
\mathsf{x}
)
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline display(
\#1.
\newline )
\mbox{''}
]$}
typesets its argument as a paragraph whose left margin equals the indentation of a displayed equation. Space is added before and after the paragraph and the first paragraph after a display is unindented.

$[
statement(
\mathsf{x}
)]$%
\footnote{$[
statement(
\mathsf{x}
)
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}statement
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}statement
\mbox{''}
]$}\index{Statement: statement * end statement @Statement: $[
statement(
\mathsf{x}
)]$ statement * end statement}%
\index{pyk: statement * end statement $[
statement(
\mathsf{x}
)]$}%
\tex{
$[
statement(
\mathsf{x}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\newline 
\mbox {$\backslash $}addvspace
\{
\mbox {$\backslash $}abovedisplayskip
\}
\newline 
\newline 
\mbox {$\backslash $}setlength
\{
\mbox {$\backslash $}leftskip
\}
\{0mm
\}
\mbox {$\backslash $}noindent
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}everypar
\{
\mbox {$\backslash $}setlength
\{
\mbox {$\backslash $}parindent
\}
\{
\mbox {$\backslash $}docparindent
\}
\}
\newline 
\mbox {$\backslash $}setlength
\{
\mbox {$\backslash $}parindent
\}
\{0mm
\}
\newline 
\newline 
\mbox {$\backslash $}setlength
\{
\mbox {$\backslash $}leftskip
\}
\{0mm
\}
\newline 
\mbox {$\backslash $}addvspace
\{
\mbox {$\backslash $}belowdisplayskip
\}
\newline 
\newline 
\mbox{''}
]$}
\tex{
$[
statement(
\mathsf{x}
)
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline statement(
\#1.
\newline )
\mbox{''}
]$}
does the same except that the left margin flushes the left margin of the document.



\subsubsection{Introduction of new constructs}\sect{Introduction of new constructs}

The following constructs allow to introduce a new construct (``introduce'' in the normal sense of the word, not in the sense of a Logiweb revelation). The constructs allow to define the pyk aspect $[
\mathsf {p}]$ and tex aspect $[
\mathsf {t}]$ of a new construct $[
\mathsf{x}]$ and also makes two entries in the index. The first of the constructs below adds the text $[
\mathsf {i}]$ in front of one of the index entries.

%
\index{intro: intro * index * pyk * tex * end intro @intro: $[
intro(
\mathsf{x}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)]$ intro * index * pyk * tex * end intro}
%
\index{intro * index * pyk * tex * end intro $[
intro(
\mathsf{x}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)]$}%
%
\tex{$
[
intro(
\mathsf{x}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox {$\backslash $}index
\{
\#2.
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\linebreak [0]\ \hskip0em plus2.0em{}@
\#2.
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\}
\%
\newline 
\mbox {$\backslash $}index
\{pyk
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\%
\newline 
\mbox {$\backslash $}tex
\{
\newline 
\$[
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{tex
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\$[
\linebreak [0]\ \hskip0em plus2.0em{}
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\%
\newline ]
\$
\mbox {$\backslash $}footnote
\{
\$[
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pyk
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox{''}
]$}%
%
\tex{$
[
intro(
\mathsf{x}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline intro(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
intro(
\mathsf{x}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)
\mathrel {\ddot {=}}
\ \$
[
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mathsf {t}
]\$\linebreak[0]\ 
]$%
%
}

%
\index{intro: intro * pyk * tex * end intro @intro: $[
intro(
\mathsf{x}
,
\mathsf {p}
,
\mathsf {t}
)]$ intro * pyk * tex * end intro}
%
\index{intro * pyk * tex * end intro $[
intro(
\mathsf{x}
,
\mathsf {p}
,
\mathsf {t}
)]$}%
%
\tex{$
[
intro(
\mathsf{x}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox {$\backslash $}index
\{
\mbox {$\backslash $}alpha
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\linebreak [0]\ \hskip0em plus2.0em{}@
\mbox {$\backslash $}back
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox[20mm][l]
\{
\$[
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\#2.
\}
\%
\newline 
\mbox {$\backslash $}index
\{pyk
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\%
\newline 
\mbox {$\backslash $}tex
\{
\newline 
\$[
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{tex
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\$[
\linebreak [0]\ \hskip0em plus2.0em{}
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\%
\newline ]
\$
\mbox {$\backslash $}footnote
\{
\$[
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pyk
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox{''}
]$}%
%
\tex{$
[
intro(
\mathsf{x}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline intro(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
intro(
\mathsf{x}
,
\mathsf {p}
,
\mathsf {t}
)
\mathrel {\ddot {=}}
\ \$
[
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mathsf {t}
]\$\linebreak[0]\ 
]$%
}



\subsubsection{Further intro constructs}\sect{FurtherIntroConstruct}

The following four constructs all help introducing new constructs. Each of them expand into pyk and tex and, optionally, tex name definitions. But they also render the pyk definition as a footnote, defer the tex and tex name definitions to an appendix, and make two entries in the index. One of the entries has form ``pyk: (pyk name) (tex rendering)''. The other entry has form ``(index): (tex rendering) (pyk name)''. If no index is given, then the latter entry has form ``(tex rendering) (pyk name)'' and is placed in front of other entries in the index. The four constructs are defined thus:



\addvspace{\abovedisplayskip}

\setlength{\leftskip}{\mathindent}\noindent $
[
\mathsf{x}
/intro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
)
\mathrel {\ddot {=}}
\mathsf{x}
\ \$
[
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mathsf {t}
]\$\linebreak[0]\ 
]$%
\footnote{$[
\mathsf{x}
/intro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}intro
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]$}\index{intro: * intro * pyk * tex * end intro @intro: $[
\mathsf{x}
/intro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
)]$ * intro * pyk * tex * end intro}%
\index{pyk: * intro * pyk * tex * end intro $[
\mathsf{x}
/intro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
)]$}%
\tex{
$[
\mathsf{x}
/intro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\%
\newline 
\mbox {$\backslash $}footnote
\{
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pyk
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox {$\backslash $}index
\{
\mbox {$\backslash $}alpha
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\linebreak [0]\ \hskip0em plus2.0em{}@
\mbox {$\backslash $}back
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox[20mm][l]
\{
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\#3.
\}
\%
\newline 
\mbox {$\backslash $}index
\{pyk
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\%
\newline 
\mbox {$\backslash $}tex
\{
\newline 
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{tex
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox{''}
]$}
\tex{
$[
\mathsf{x}
/intro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline /intro(
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline )
\mbox{''}
]$}
\everypar{\setlength{\parindent}{\docparindent}}
\setlength{\parindent}{0mm}

\setlength{\leftskip}{0mm}
\addvspace{\belowdisplayskip}





\addvspace{\abovedisplayskip}

\setlength{\leftskip}{\mathindent}\noindent $
[
\mathsf{x}
/indexintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)
\mathrel {\ddot {=}}
\mathsf{x}
\ \$
[
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mathsf {t}
]\$\linebreak[0]\ 
]$%
\footnote{$[
\mathsf{x}
/indexintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}intro
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}index
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]$}\index{indexintro: * intro * index * pyk * tex * end intro @indexintro: $[
\mathsf{x}
/indexintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)]$ * intro * index * pyk * tex * end intro}%
\index{pyk: * intro * index * pyk * tex * end intro $[
\mathsf{x}
/indexintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)]$}%
\tex{
$[
\mathsf{x}
/indexintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\%
\newline 
\mbox {$\backslash $}footnote
\{
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pyk
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox {$\backslash $}index
\{
\#3.
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\linebreak [0]\ \hskip0em plus2.0em{}@
\#3.
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\}
\%
\newline 
\mbox {$\backslash $}index
\{pyk
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\%
\newline 
\mbox {$\backslash $}tex
\{
\newline 
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{tex
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#5/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox{''}
]$}
\tex{
$[
\mathsf{x}
/indexintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
)
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline /indexintro(
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline ,
\#5.
\newline )
\mbox{''}
]$}
\everypar{\setlength{\parindent}{\docparindent}}
\setlength{\parindent}{0mm}

\setlength{\leftskip}{0mm}
\addvspace{\belowdisplayskip}





\addvspace{\abovedisplayskip}

\setlength{\leftskip}{\mathindent}\noindent $
[
\mathsf{x}
/nameintro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)
\mathrel {\ddot {=}}
\mathsf{x}
\ \$
[
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mathsf {t}
]\$\linebreak[0]\ 
\ \$
[
\mathsf{y}
\stackrel {\mathrm {name}}{=} 
\mathsf {n}
]\$\linebreak[0]\ 
]$%
\footnote{$[
\mathsf{x}
/nameintro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}intro
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]$}\index{nameintro: * intro * pyk * tex * name * end intro @nameintro: $[
\mathsf{x}
/nameintro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)]$ * intro * pyk * tex * name * end intro}%
\index{pyk: * intro * pyk * tex * name * end intro $[
\mathsf{x}
/nameintro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)]$}%
\tex{
$[
\mathsf{x}
/nameintro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\%
\newline 
\mbox {$\backslash $}footnote
\{
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pyk
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox {$\backslash $}index
\{
\mbox {$\backslash $}alpha
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\linebreak [0]\ \hskip0em plus2.0em{}@
\mbox {$\backslash $}back
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox[20mm][l]
\{
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\#3.
\}
\%
\newline 
\mbox {$\backslash $}index
\{pyk
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\%
\newline 
\mbox {$\backslash $}tex
\{
\newline 
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{tex
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\newline 
\mbox {$\backslash $}tex
\{
\newline 
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{name
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#5/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox{''}
]$}
\tex{
$[
\mathsf{x}
/nameintro(
\mathsf{y}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline /nameintro(
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline ,
\#5.
\newline )
\mbox{''}
]$}
\everypar{\setlength{\parindent}{\docparindent}}
\setlength{\parindent}{0mm}

\setlength{\leftskip}{0mm}
\addvspace{\belowdisplayskip}





\addvspace{\abovedisplayskip}

\setlength{\leftskip}{\mathindent}\noindent $
[
\mathsf{x}
/bothintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)
\mathrel {\ddot {=}}
\mathsf{x}
\ \$
[
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mathsf {t}
]\$\linebreak[0]\ 
\ \$
[
\mathsf{y}
\stackrel {\mathrm {name}}{=} 
\mathsf {n}
]\$\linebreak[0]\ 
]$%
\footnote{$[
\mathsf{x}
/bothintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}intro
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}index
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]$}\index{bothintro: * intro * index * pyk * tex * name * end intro @bothintro: $[
\mathsf{x}
/bothintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)]$ * intro * index * pyk * tex * name * end intro}%
\index{pyk: * intro * index * pyk * tex * name * end intro $[
\mathsf{x}
/bothintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)]$}%
\tex{
$[
\mathsf{x}
/bothintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\%
\newline 
\mbox {$\backslash $}footnote
\{
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pyk
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox {$\backslash $}index
\{
\#3.
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\linebreak [0]\ \hskip0em plus2.0em{}@
\#3.
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\}
\%
\newline 
\mbox {$\backslash $}index
\{pyk
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\linebreak [0]\ \hskip0em plus2.0em{}
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.]
\$
\}
\%
\newline 
\mbox {$\backslash $}tex
\{
\newline 
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{tex
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#5/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\newline 
\mbox {$\backslash $}tex
\{
\newline 
\$[
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{name
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#6/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\$
\}
\mbox{''}
]$}
\tex{
$[
\mathsf{x}
/bothintro(
\mathsf{y}
,
\mathsf {i}
,
\mathsf {p}
,
\mathsf {t}
,
\mathsf {n}
)
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline /bothintro(
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline ,
\#5.
\newline ,
\#6.
\newline )
\mbox{''}
]$}
\everypar{\setlength{\parindent}{\docparindent}}
\setlength{\parindent}{0mm}

\setlength{\leftskip}{0mm}
\addvspace{\belowdisplayskip}





\section{Claims}\sect{Claims}

\subsection{The claim aspect}

We define the \indexintro{claim} of a page to be the potentially inherited claim aspect of the page (c.f.\ \ref{section:InheritedAspects}). Logiweb checks the correctness of a Logiweb page by applying the claim of the page to the expansion and cache of the page. If the result is $[
\mathsf {T}]$ then the page is considered correct.

If the page has no potentially inherited claim aspect then the page is said to make no claim and is considered trivially correct.

We shall refer to the result of applying the claim of a page to the expansion and cache of the page as the \indexintro{correctness} of the page. The correctness equals $[
\mathsf {T}]$ for pages that are correct, including pages that are trivially correct.

Pages are in error if their correctness differs from $[
\mathsf {T}]$. In that case Logiweb prunes the correctness (c.f. Section \ref{section:pruning}) and hangs the result on the \indexintro{diagnose} hook (c.f.\ Section \ref{section:TheRackOfAPage}) of the page.

The proclaimation of the ``claim'' aspect reads:

\display{$
[
\mathrm {claim}
\bowtie
\mbox{``}claim
\mbox{''}
]$}

For convenience, we define a construct for making claim definitions:

%
\index{claim define x as y end define $[
[
\mathsf{x}
\stackrel {claim}{=}
\mathsf{y}
]]$}%
%
\index{claim: $[
[
\mathsf{x}
\stackrel {claim}{=}
\mathsf{y}
]]$ claim define x as y end define}%
%
\tex{$
[
[
\ast 
\stackrel {claim}{=}
\ast 
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{claim
\}
\{
{=}
\}
\#2.
\newline ]
\mbox{''}
]$}%
%
\display{$
[
[
\mathsf{x}
\stackrel {claim}{=}
\mathsf{y}
]
\mathrel {\ddot {=}}
[
\mathsf{x}
\stackrel{
\mathrm {claim}
}{\rightarrow}
\mathsf{y}
]
]$%
}
%



\subsection{Conjunction of claims}

Logiweb merely allows a page to make one claim. But that claim can be arbitrarily complex. As we shall see, the claim of the present page is the conjuctions of a ``checker'' and a ``verifier''.

The ``checker'' scans the expansion of the page for tests like $
\relax [ 
\mathsf {F}
\mathrel { {+} 2 \ast }
3
\approx 
7
\relax ]^{\cdot} $ and checks the correctness of them all. In contrast, the ``verifier'' scans the codex for proofs and verifies all proofs found.

Claims may be combined into a conjunction using $[
\mathsf{x}
\wedge_c 
\mathsf{y}]$:

%
\index{\alpha x simple and y @\back $[
\mathsf{x}
\mathrel{\tilde{\wedge}} 
\mathsf{y}]$ x simple and y}%
%
\index{x simple and y $[
\mathsf{x}
\mathrel{\tilde{\wedge}} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathrel{\tilde{\wedge}} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\{
\mbox {$\backslash $}tilde
\{
\mbox {$\backslash $}wedge
\}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathrel{\tilde{\wedge}} 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {if}(
\mathsf{x}
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{x}
)
]$%
}
%

%
\index{c: \back $[
\mathsf{x}
\wedge_c 
\mathsf{y}]$ x claim and y}%
%
\index{\alpha x claim and y @\back $[
\mathsf{x}
\wedge_c 
\mathsf{y}]$ x claim and y}%
%
\index{x claim and y $[
\mathsf{x}
\wedge_c 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\wedge_c 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}wedge
\_c
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\wedge_c 
\mathsf{y}
\mathrel {\dot {=}}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {c}
.
\mathsf{x}
\mathbin {\mbox {'}}
\mathsf {t}
\mathbin {\mbox {'}}
\mathsf {c}
\mathrel{\tilde{\wedge}} 
\mathsf{y}
\mathbin {\mbox {'}}
\mathsf {t}
\mathbin {\mbox {'}}
\mathsf {c}
]$%
}
%



\subsection{The checker}

The \indexintro{checker} checks the correctness of all test statements on a page:
%
\index{checker @\back$[
\mbox{checker}]$ checker}%
%
\display{$
[
\mbox{checker}
\mathrel {\dot {=}}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {c}
.
\mathbf{check}( 
\mathsf {t}
, 
\mathsf {c}
)
]$%
%
}
%

The construct
%
\index{check 1 @\back $[
\mathbf{check}( 
\mathsf {t}
, 
\mathsf {c}
)]$}
\tex{$
[
\mathbf{check}( 
\ast 
, 
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{check
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}$[
\mathbf{check}( 
\mathsf {t}
, 
\mathsf {c}
)]$
%
allows to check that all claims in the term $[
\mathsf {t}]$ evaluate to $[
\mathsf {T}]$.

If some claim is false then $[
\mathbf{check}( 
\mathsf {t}
, 
\mathsf {c}
)]$ returns the value of the first false claim found. Such a non-nil value is a Logiweb \indexintro{diagnose}. To be useful, a diagnose should be a G{\"o}del tree that can be typeset and which gives a clue what went wrong.

$[
\mathbf{check}( 
\mathsf {t}
, 
\mathsf {c}
)]$ skips all page constructs when checking $[
\mathsf {t}]$.

\display{$
[
\mathbf{check}( 
\mathsf {t}
, 
\mathsf {c}
)
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {t}
{}^{i}
{}^s
,\linebreak [0]
\mathsf {c}
!
\mathsf {T}
,\linebreak [0]
\mathbf{check}_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {claim}\mbox {\tt \char34}
, 
\mathsf {t}
, 
\mathsf {c}
)
)
)
]$}

The construct
%
\index{check 2 @\back $[
\mathbf{check}_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {d}
)]$}
\tex{$
[
\mathbf{check}_2( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{check
\}
\_2(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}$[
\mathbf{check}_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {d}
)]$
%
allows to check that all claims in $[
\mathsf {t}]$ evaluate to $[
\mathsf {T}]$ where $[
\mathsf {d}]$ is the definition of the claim aspect of the root of $[
\mathsf {t}]$.

\display{$
[
\mathbf{check}_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {d}
)
\mathrel {\dot {=}}
\mathsf {d}
\left\{\protect \begin {array}{l}
\mathbf{check}_3( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathbf{aspect}( 
\mbox {\tt \char34}\mathrm {definition}\mbox {\tt \char34}
, 
\mathsf {t}
, 
\mathsf {c}
)
)
\\
{\cal U}^M(
{\cal E}(
\mathsf {d}
{}^{3}
,
\mathsf {T}
,
\mathsf {c}
)
\mathbin {\mbox {`}}
\mathsf {t}
\mathbin {\mbox {`}}
\mathsf {c}
)
\protect \end {array}\right.
]$}

The construct
%
\index{check 3 @\back $[
\mathbf{check}_3( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {d}
)]$}
\tex{$
[
\mathbf{check}_3( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{check
\}
\_3(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}$[
\mathbf{check}_3( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {d}
)]$
%
allows to check that all claims in $[
\mathsf {t}]$ evaluate to $[
\mathsf {T}]$. $[
\mathbf{check}_3( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {d}
)]$ does not descend into trees whose root has a definition aspect $[
\mathsf {d}]$. For that reason, checking does not occur inside definitions, introductions, proclamations, and trees with a ``hide'' construct in its root. In particular, no checking is done inside strings since strings have a ``hide'' construct in their root. This saves a lot of cpu-time. Furthermore, no checking is done inside definitions. This is convenient since otherwise one could not pyk, \TeX, macro, and priority define test constructs (c.f. Section \ref{section:TestForTruth} ff) without getting spurious errors from the occurrences of the test constructs inside the definitions of the test constructs themselves.

\display{$
[
\mathbf{check}_3( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {d}
)
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {d}
,\linebreak [0]
\mathbf{check}^*( 
\mathsf {t}
{}^t
, 
\mathsf {c}
)
,\linebreak [0]
\mathsf {t}
!
\mathsf {c}
!
\mathsf {T}
)
]$}

The construct
%
\index{check 4 @\back $[
\mathbf{check}^*( 
\mathsf {t}
, 
\mathsf {c}
)]$}
\tex{$
[
\mathbf{check}^*( 
\ast 
, 
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{check
\}
{\char94}
{*}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}$[
\mathbf{check}^*( 
\mathsf {t}
, 
\mathsf {c}
)]$
%
allows to check that all claims in the list $[
\mathsf {t}]$ of terms evaluate to $[
\mathsf {T}]$.

\display{$
[
\mathbf{check}^*( 
\mathsf {t}
, 
\mathsf {c}
)
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {t}
,\linebreak [0]
\mathsf {c}
!
\mathsf {T}
,\linebreak [0]
\mathbf{check}^*_2( 
\mathsf {t}
{}^t
, 
\mathsf {c}
, 
\mathbf{check}( 
\mathsf {t}
{}^h
, 
\mathsf {c}
)
)
)
]$}

The construct
%
\index{check 5 @\back $[
\mathbf{check}^*_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {v}
)]$}
\tex{$
[
\mathbf{check}^*_2( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\{check
\}
{\char94}
{*}
\_2(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}$[
\mathbf{check}^*_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {v}
)]$
%
also allows to check that all claims in the list $[
\mathsf {t}]$ of terms evaluate to $[
\mathsf {T}]$ except that it returns $[
\mathsf {v}]$ if $[
\mathsf {v}]$ is false.

\display{$
[
\mathbf{check}^*_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {v}
)
\mathrel {\dot {=}}
\mathrm {If}(
{\neg }
\mathsf {v}
,\linebreak [0]
\mathsf {t}
!
\mathsf {c}
!
\mathsf {v}
,\linebreak [0]
\mathbf{check}^*( 
\mathsf {t}
, 
\mathsf {c}
)
)
]$}



\subsection{Installing the checker}\label{section:InstallingTheChecker}

We now define

\display{$
[
\mbox{self}
\stackrel {claim}{=}
\mbox{checker}
\wedge_c 
\mbox{verifier}
]$}

Because of the definition above, the present page claims that $[
\mathbf{check}( 
\mathsf {t}
, 
\mathsf {c}
)]$ is true where $[
\mathsf {t}]$ and $[
\mathsf {c}]$ are the expansion and cache, respectively, of the present page (the claim above also invokes $[
\mbox{verifier}]$ which is defined later).

Another page that uses the present page as bed and makes no claim of its own also claims that $[
\mathbf{check}( 
\mathsf {t}
, 
\mathsf {c}
)]$ is true but then $[
\mathsf {t}]$ and $[
\mathsf {c}]$ are the expansion and cache, respectively, of that other page.



\subsection{Test for truth}\label{section:TestForTruth}

The construct
%
\index{test x end test $[
\relax [ 
\mathsf{x}
\relax ]^{\cdot} ]$}
\index{\alpha test x end test @\back $[
\relax [ 
\mathsf {t}
\relax ]^{\cdot} ]$ test t end test}
\tex{$
[
\relax [ 
\ast 
\relax ]^{\cdot} 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}[
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}]
{\char94}
\{
\mbox {$\backslash $}cdot
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}$
\relax [ 
\mathsf {t}
\relax ]^{\cdot} $
%
allows to claim that a term $[
\mathsf {t}]$ evaluates to $[
\mathsf {T}]$.

\display{$
[
\relax [ 
\mathsf {t}
\relax ]^{\cdot} 
\stackrel {claim}{=}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {c}
.
\mathrm {if}(
{\cal U}(
{\cal E}(
\mathsf {t}
{}^{1}
,
\mathsf {T}
,
\mathsf {c}
)
)
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {t}
)
]$}

As an example, one may claim that $[
\mathsf {F}
\mathrel { {+} 2 \ast }
3]$ equals seven:

\display{$
\relax [ 
\mathsf {F}
\mathrel { {+} 2 \ast }
3
\approx 
7
\relax ]^{\cdot} $}

$
\relax [ {\cal A}
\relax ]^{\cdot} $ returns the G{\"o}del tree of $
\relax [ {\cal A}
\relax ]^{\cdot} $ as the diagnose if the claim fails. The overall claim defined in Section \ref{section:InstallingTheChecker} returns the value of the first failing claim (if any). Hence, if $
\relax [ 
\mathsf {F}
\mathrel { {+} 2 \ast }
3
\approx 
7
\relax ]^{\cdot} $ failed and was the first failing claim found, then the value of the claim of the page would be the G{\"o}del tree of $
\relax [ 
\mathsf {F}
\mathrel { {+} 2 \ast }
3
\approx 
7
\relax ]^{\cdot} $. Reasonable Logiweb compilers typeset the diagnose so that the failing claim is easy to identify.

Note that macro expansion occurs before checking, so the G{\"o}del tree of a failing claim is the macro expanded version of the claim. The macro expansion facility defined on the present page, however, carefully carries debugging information around when macro expanding, so the debugging information in the root of the expanded G{\"o}del tree indicates the exact location of the failing claim in the unexpanded page.

Note that $
\relax [ 
\mathsf {t}
\relax ]^{\cdot} $ does not fail; all unbound variables evaluate to $[
\mathsf {T}]$.



\subsection{Test for falsehood}

The construct

%
\index{false test x end test $[
\relax [ 
\mathsf{x}
\relax ]^{-} ]$}%
%
\index{\alpha false test x end test @\back $[
\relax [ 
\mathsf{x}
\relax ]^{-} ]$ false test t end test}%
%
\tex{$
[
\relax [ 
\mathsf{x}
\relax ]^{-} 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}[
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}]
{\char94}
\{
\mbox{-}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
\display{$
[
\relax [ 
\mathsf{x}
\relax ]^{-} 
\stackrel {claim}{=}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {c}
.
\mathrm {if}(
{\cal U}(
{\cal E}(
\mathsf {t}
{}^{1}
,
\mathsf {T}
,
\mathsf {c}
)
)
,\linebreak [0]
\mathsf {t}
,\linebreak [0]
\mathsf {T}
)
]$%
}
%
tests that its argument is false. As an example of use, one may claim that $[
2
\approx 
3]$ is false:

\display{$
\relax [ 
2
\approx 
3
\relax ]^{-} $}



\subsection{Raw test}

Like $
\relax [ 
\mathsf {t}
\relax ]^{\cdot} $, the construct
%
\index{raw test x end test $[
\relax [ 
\mathsf{x}
\relax ]^{\circ} ]$}
\index{\alpha raw test x end test @\back $[
\relax [ 
\mathsf {t}
\relax ]^{\circ} ]$ raw test t end test}
\tex{$
[
\relax [ 
\ast 
\relax ]^{\circ} 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}[
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}]
{\char94}
\{
\mbox {$\backslash $}circ
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}$
\relax [ 
\mathsf {t}
\relax ]^{\circ} $
%
allows to claim that a term $[
\mathsf {t}]$ evaluates to $[
\mathsf {T}]$. Contrary to $
\relax [ 
\mathsf{x}
\relax ]^{\cdot} $, $
\relax [ 
\mathsf{x}
\relax ]^{\circ} $ just returns the value of $[
\mathsf{x}]$. This is useful for constructs that generate their own error messages.

\display{$
[
\relax [ 
\mathsf {t}
\relax ]^{\circ} 
\stackrel {claim}{=}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {c}
.
{\cal U}(
{\cal E}(
\mathsf {t}
{}^{1}
,
\mathsf {T}
,
\mathsf {c}
)
)
]$}



\subsection{Spy construct}\sect{SpyConstruct}

$
[
\mathsf{x}
\mathrel{spy}
\mathsf{y}
\stackrel {
\mathrm {val}
}{\Rightarrow }
\mathsf{x}
!
\mathsf{y}
]$%
\footnote{$[
\mathsf{x}
\mathrel{spy}
\mathsf{y}
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}spy
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\mbox{''}
]$}\index{spy: * spy * @spy: $[
\mathsf{x}
\mathrel{spy}
\mathsf{y}]$ * spy *}%
\index{pyk: * spy * $[
\mathsf{x}
\mathrel{spy}
\mathsf{y}]$}%
\tex{
$[
\mathsf{x}
\mathrel{spy}
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\{spy
\}
\#2.
\mbox{''}
]$} evaluates $[
\mathsf{x}]$, discards the value, evaluates $[
\mathsf{y}]$, and returns the value of $[
\mathsf{y}]$. However, behind the scene, $[
\mathsf{x}
\mathrel{spy}
\mathsf{y}]$ also stores the value of $[
\mathsf{x}]$ in the Lisp variable *spy*.

$
[
[
\mathsf{x}
]^{\cdot}
\mathrel {\ddot {=}}
\relax [ 
\lceil 
\mathsf{x}
\rceil 
\mathrel{spy}
\mathsf{x}
\relax ]^{\cdot} 
]$%
\footnote{$[
[
\mathsf{x}
]^{\cdot}
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}spying
\linebreak [0]\ \hskip0em plus2.0em{}test
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}test
\mbox{''}
]$}\index{\alpha spying test * end test @\back \makebox[20mm][l]{$[
[
\mathsf{x}
]^{\cdot}]$}spying test * end test}%
\index{pyk: spying test * end test $[
[
\mathsf{x}
]^{\cdot}]$}%
\tex{
$[
[
\mathsf{x}
]^{\cdot}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1.
\newline ]
{\char94}
\{
\mbox {$\backslash $}cdot
\}
\mbox{''}
]$} is exactly like an ordinary test except that it calls the spy function (the spying nature is emphasized by the fact that spying and non-spying tests are rendered identically:-). $
[
[
\mathsf{x}
]^-
\mathrel {\ddot {=}}
\relax [ 
\lceil 
\mathsf{x}
\rceil 
\mathrel{spy}
\mathsf{x}
\relax ]^{-} 
]$%
\footnote{$[
[
\mathsf{x}
]^-
\stackrel {\mathrm {pyk}}{=} 
\mbox{``}false
\linebreak [0]\ \hskip0em plus2.0em{}spying
\linebreak [0]\ \hskip0em plus2.0em{}test
\linebreak [0]\ \hskip0em plus2.0em{}
{*}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}test
\mbox{''}
]$}\index{\alpha false spying test * end test @\back \makebox[20mm][l]{$[
[
\mathsf{x}
]^-]$}false spying test * end test}%
\index{pyk: false spying test * end test $[
[
\mathsf{x}
]^-]$}%
\tex{
$[
[
\mathsf{x}
]^-
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1.
\newline ]
{\char94}
\mbox{-}
\mbox{''}
]$} is a spying test for falsehood.

Spying tests are good for debugging when some test loops indefinitely. If a test case loops indefinitely, then *spy* will typically contain the last spying test that was executed before the infinite loop.



\section{Logiweb sequent calculus}

The \index{sequent calculus}\index{calculus, sequent}\indexintro{Logiweb sequent calculus} is the low level theory (or ``metatheory'') that comes with Logiweb. Users may use Logiweb sequent calculus and its associated proof checker as they are or use them as a model for constructing their own proof checkers.

The Logiweb sequent calculus corresponds to the assembly language of computing machines. It is possible in principle to use it as it is, but it is much more efficient to use higher level theories built on top of the calculus. When building theories on top of the calculus, the calculus ensures correctness whereas the high level theories provide user friendliness. Programming bugs in the high level theories cannot compromise correctness since correctness is ensured by the low level sequent calculus. Only bugs in the implementation of the sequent calculus and in the levels below can compromise correctness.

In contrast, \indexintro{Map Theory} described later is the high level theory that comes with Logiweb. Again, users may use Map Theory as it is or use it as a model for constructing their own theories. Map Theory is a high level theory implemented on top of the Logiweb sequent calculus.

Map Theory is a classical theory with power as classical ZFC set theory. Contrary to Set Theory, Map Theory builds on lambda calculus. More specificially, Map Theory is the result of adding quantifiers to the Logiweb computing engine. For that reason, Map Theory is suited both for classical mathematics and for reasoning about programs in general and programs for the Logiweb engine in particular.

Logiweb sequent calculus is intuitionistic and has much less power than Map Theory.

Now let $[{\cal M}]$ be the intuitionistic conjunction of all axioms, axioms schemes, and inference rules of Map Theory and let $[{\cal L}]$ be a lemma of Map Theory. In general, $[{\cal L}]$ will not be intuitionistically valid and, hence, $[{\cal L}]$ will not be a lemma of Logiweb sequent calculus. But the statement that $[{\cal M}]$ infers $[{\cal L}]$, written $[{\cal M}
\vdash {\cal L}]$, will be intuitionistically valid, and that is the lemma to be proved from the point of view of the sequent calculus.

Hence, if the user proves a lemma $[{\cal L}]$ in Map Theory, then the lemma will be translated into $[{\cal M}
\vdash {\cal L}]$ and the proof will be translated into a proof of that statement in the sequent calculus.

Now let $[{\cal Z}]$ be the intuitionistic conjunction of all axioms, axiom schemes, and inference rules of classical ZFC set theory. At the time of writing, a rather large, formal proof of $[{\cal M}
\vdash {\cal Z}]$ exists, and that particular proof is going to be the main test case for checkout of the Logiweb system. The lemma $[{\cal M}
\vdash {\cal Z}]$ says that Map Theory can ``simulate'' ZFC set theory and that all developments possible in ZFC set theory are also possible in Map Theory.



\subsection{Statements}

\subsubsection{Messages}

Logiweb comes with a number of predefined aspects like $[
\mathrm{pyk}]$, $[
\mathrm{tex}]$, $[
\mathrm {val}]$, and $[
\mathrm {macro}]$. Logiweb also has a facility for defining new aspects. New aspects are introduced using the \indexintro{message} aspect. The message aspect is a predefined one and, hence, has to be proclaimed:

\display{\index{msg @\back $[
msg]$ message}\tex{$
[
msg
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline msg
\mbox{''}
]$}$
[
msg
\bowtie
\mbox{``}message
\mbox{''}
]$}

For convenience, we define a construct for making message definitions:

\index{message define x as y end define $
[
\mathsf{x}
\stackrel {msg}{=} 
\mathsf{y}
]$}%
%
\index{msg: $
[
\mathsf{x}
\stackrel {msg}{=} 
\mathsf{y}
]$ message define x as y end text end define}%
%
\tex{$
[
[
\mathsf{x}
\stackrel {msg}{=} 
\mathsf{y}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{msg
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ]
\mbox{''}
]$}%
%
\display{%
$
[
[
\mathsf{x}
\stackrel {msg}{=} 
\mathsf{y}
]
\mathrel {\ddot {=}}
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel{
msg
}{\rightarrow}
\mathsf{y}
]
]$%
%
}

Just like a construct may have e.g.\ a value aspect, a construct may have a message aspect. If a construct $[{\cal A}]$ has a message aspect $[{\cal B}]$, then $[{\cal A}]$ denotes the aspect $[{\cal B}]$. Hence, $[{\cal B}]$ becomes an aspect by occurring in the right hand side of a message definition.

If two constructs $[{\cal A}
_{
1
}]$ and $[{\cal A}
_{
2
}]$  both have message aspect $[{\cal B}]$ then $[{\cal A}
_{
1
}]$ and $[{\cal A}
_{
2
}]$ denote the same aspect. The ability to have several constructs that denote the same aspect allows different users to use different notation for the same aspect. This is important because of the notational freedom of mathematics.

If a construct $[{\cal A}]$ has a message aspect $[{\cal B}]$ then both $[{\cal A}]$ and $[{\cal B}]$ may have parameters. Parameters of $[{\cal A}]$ allow to define parameterised aspects. Parameters of $[{\cal B}]$ have no effect since an aspect is identified by the reference and identifier of the root of $[{\cal B}]$.

Aspects of Logiweb have a slight resemblance with messages in object-oriented programming, and for that reason, we use ``aspect'' and ``message'' as synonyms here. But why use ``message'' when ``message'' is just used as a synonym for ``aspect''? The answer is that ``message aspect'' sounds better than ``aspect aspect''.



\subsubsection{The statement aspect}

We shall refer to entities like axioms and inference rules as \index{statement}\intro{statements}. To define such entities it is convenient to have a \index{aspect, statement}\indexintro{statement aspect}. To introduce a statement aspect, we first introduce
%
\index{stmt @\back $[
{<}stmt{>}]$ the statement aspect}%
%
\index{the statement aspect $[
{<}stmt{>}]$}%
%
\tex{$
[
{<}stmt{>}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
{<}
\}stmt
\{
{>}
\}
\mbox{''}
]$}%
%
$[
{<}stmt{>}]$%
%
to represent it.

$[
{<}stmt{>}]$ has a $[
\mathrm{pyk}]$ definition so that it can be referred to in pyk source files and a $[
\mathrm{tex}]$ definition so that it can be rendered in \TeX\ output from Logiweb, and it evaluates to itself:

\display{$
[
{<}stmt{>}
\mathrel {\dot {=}}
\lceil 
{<}stmt{>}
\rceil 
]$}

Apart from that $[
{<}stmt{>}]$ is inert. Its purpose is to occur in the right hand side of a message definition where it identifies the statement aspect.

We shall use $[
stmt]$ to denote the statement aspect:

\display{\index{statement $[
stmt]$}
\index{stmt @\back $[
stmt]$ statement}\tex{$
[
stmt
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline stmt
\mbox{''}
]$}$
[
stmt
\stackrel {msg}{=} 
{<}stmt{>}
]$}

For convenience, we define a construct for making statement definitions:

\index{statement define x as y end define $
[
\mathsf{x}
\stackrel {stmt}{=}
\mathsf{y}
]$}%
%
\index{stmt: $
[
\mathsf{x}
\stackrel {stmt}{=}
\mathsf{y}
]$}%
%
\tex{$
[
[
\mathsf{x}
\stackrel {stmt}{=}
\mathsf{y}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{stmt
\}
\{
{=}
\}
\#2.
\newline ]
\mbox{''}
]$}%
%
\display{%
$
[
[
\mathsf{x}
\stackrel {stmt}{=}
\mathsf{y}
]
\mathrel {\ddot {=}}
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel{
stmt
}{\rightarrow}
\mathsf{y}
]
]$%
%
}



\subsubsection{Axioms}

An \indexintro{axiom} is a statement that somebody accepts as true without proof. As an example, one could declare $[
\mathsf {T}
{}^h
=
\mathsf {T}]$ as an axiom. The definition
%
\index{example axiom $[
HeadNil']$}%
%
\index{HeadNil @\back $[
HeadNil']$ example axiom}%
%
\tex{$
[
HeadNil'
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline HeadNil
\mbox {'}
\mbox{''}
]$}%
%
$
[
HeadNil'
\mathrel {\ddot {=}}
\mathsf {T}
{}^h
=
\mathsf {T}
]$%
%
allows to use $[
HeadNil']$ as shorthand for the given axiom.



\subsubsection{Axiom schemes}\label{section:AxiomSchemes}

An \index{scheme, axiom}\indexintro{axiom scheme} is a systematic collection of axioms. As an example, one could declare $[
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
({\cal A}
\mathrel { : \, : }{\cal B}
)
{}^h
={\cal A}]$ as an axiom scheme. The axiom scheme says that $[
({\cal A}
\mathrel { : \, : }{\cal B}
)
{}^h
={\cal A}]$ for all terms $[{\cal A}]$ and $[{\cal B}]$. The definition
%
\index{example scheme $[
HeadPair']$}%
%
\index{HeadPair @\back $[
HeadPair']$ example scheme}%
%
\tex{$
[
HeadPair'
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline HeadPair
\mbox {'}
\mbox{''}
]$}%
%
$
[
HeadPair'
\mathrel {\ddot {=}}
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
({\cal A}
\mathrel { : \, : }{\cal B}
)
{}^h
={\cal A}
]$%
%
allows to use $[
HeadPair']$ as shorthand for the given axiom scheme.

The variables $[{\cal A}]$ and $[{\cal B}]$ are \index{variable, meta}\index{metavariable}\intro{metavariables}. Metavariables range over terms as opposed to \index{variable, ordinary}\index{ordinary variable}\intro{ordinary variables} which range over values. For more on metavariables see Section \ref{section:Metavariables}.



\subsubsection{Inference rules}

An \index{rule, inference}\indexintro{inference rule} is a rule which states that a certain \indexintro{conclusion} follows from one or more \index{premise}\intro{premisses}. An inference rule states that the conclusion is provable if all the premisses are provable.

As an example, one could declare $[
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
\forall {\cal C}
\colon {\cal A}
={\cal B}
\vdash {\cal A}
={\cal C}
\vdash {\cal B}
={\cal C}]$ as an inference rule. The inference rule says that if $[{\cal A}]$, $[{\cal B}]$, and $[{\cal C}]$ are arbitrary terms, and if $[{\cal A}
={\cal B}]$ and $[{\cal A}
={\cal C}]$ are provable, then $[{\cal B}
={\cal C}]$ is provable.

The definition
%
\index{example rule $[
Transitivity']$}%
%
\index{Transitivity @\back $[
Transitivity']$ example rule}%
%
\tex{$
[
Transitivity'
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Transitivity
\mbox {'}
\mbox{''}
]$}%
%
$
[
Transitivity'
\mathrel {\ddot {=}}
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
\forall {\cal C}
\colon {\cal A}
={\cal B}
\vdash {\cal A}
={\cal C}
\vdash {\cal B}
={\cal C}
]$%
%
allows to use $[
Transitivity']$ as shorthand for the given inference rule.



\subsubsection{Contradictions}

We make the convention that $[
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$ represents absurdity.

A Logiweb \indexintro{contradiction} is a statement that somebody accepts as false without proof. As an example, one could declare $[
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}]$ as a contradiction. The contradiction $[
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}]$ may be expressed as the statement $[
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}
\vdash 
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$.

Contradictions were called ``Logiweb contradictions'' first time they were mentioned above. That was done to emphasize that the word ``contradiction'' is used here in a way that is not necessarily in line with the litterature.

As we shall see, contradictions have two uses. Firstly, they may be used to refute a conjecture by proving that the conjecture implies a contradiction. Secondly, they may be used to refute a theory as inconsistent by proving that a contradiction is provable within the theory.

The definition
%
\index{Contra' @\back $[
Contra']$ contraexample}%
%
\tex{$
[
Contra'
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Contra
\mbox {'}
\mbox{''}
]$}%
%
$
[
Contra'
\mathrel {\ddot {=}}
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}
\vdash 
{\makebox [0mm][l]{$\bot $}\,{\bot }}
]$%
%
allows to use $[
Contra']$ as shorthand for the given contradiction.



\subsubsection{Theories}

We shall refer to axioms, axiom schemes, and inference rules as \index{rule}\intro{rules}.

A Logiweb \indexintro{theory} is a structure that encodes a finite set of rules and contradictions. As an example, one could declare the rules $[
HeadNil']$, $[
HeadPair']$, and $[
Transitivity']$ and the contradiction $[
Contra']$ to form a theory.

The definition

%
\index{example theory primed $[
T'_{E}]$}%
%
\index{T' @\back $[
T'_{E}]$ example theory primed}%
%
\tex{$
[
T'_{E}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline T
\mbox {'}
\_
\{E
\}
\mbox{''}
]$}%
%
\display{$
[
T'_{E}
\stackrel {stmt}{=}
HeadNil'
\mathrel {\oplus} 
HeadPair'
\mathrel {\oplus} 
Transitivity'
\mathrel {\oplus} 
Contra'
]$%
}
%

allows to refer to the example theory as $[
T'_{E}]$ (``T'' for ``Theory'', ``E'' for ``Example'', $[
T'_{E}]$ for ``example theory'').

The notion of a ``Logiweb theory'' is close to the notion of an ``axiotic theory'' in the litterature. Some branches of the litterature use the word ``theory'' in a quite different sense, namely to denote the set of all statements provable from an axiomatic theory.

The notion of a ``Logiweb theory'' differs from the notion of an ``axiomatic theory'' in three ways:

Firstly, the notion of a ``Logiweb theory'' has a precise, technical meaning inside the Logiweb framework. The notion of an ``axiomatic theory'' is independent of any framework but is more vague.

Secondly, a Logiweb theory may include Logiweb contradictions. Axiomatic theories merely contain rules.

Finally, a Logiweb theory contains finitely many rules whereas an axiomatic theory may contain infinitely many. This is because Logiweb theories and axiomatic theories count rules differently.

Axiomatic theories count rules in a very peculiar way: (1) inference rules do not count. (2) axioms that are axioms of first order predicate calculus do not count. (3) axiom schemes count as infinitely many rules. A theory like ZFC set theory \cite{mendelson} has the property that it is ``not finitely axiomatizable''. That result depends on the counting used in axiomatic theories. Using Logiweb counting, ZFC has finitely many rules. All axiomatic theories can be expressed as Logiweb theories using finitely many rules.



\subsubsection{Conjectures, lemmas, and antilemmas}

A Logiweb \indexintro{conjecture} is a statement of form $[{\cal T}
\vdash {\cal C}]$ where $[{\cal T}]$ is a theory and $[{\cal C}]$ is a statement that is expected to follow from the theory. As an example, one could declare $[
T'_{E}
\vdash 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon {\cal A}
={\cal B}
\vdash {\cal B}
={\cal A}]$ as a conjecture.

The definition \index{example lemma $[
L_{1}]$}\index{L @\back $[
L_{1}]$ example lemma}\tex{$
[
L_{1}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline L
\_
\{1
\}
\mbox{''}
]$}$
[
L_{1}
\stackrel {stmt}{=}
T'_{E}
\vdash 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon {\cal A}
={\cal B}
\vdash {\cal B}
={\cal A}
]$ allows to refer to the given conjecture as $[
L_{1}]$.

Later, we introduce the ``Logiweb proof checker'' and the notion of a ``Logiweb proof''. Once a proof of a conjecture is written, accepted by the proof checker, and published on Logiweb, one may refer to the conjecture as a Logiweb \indexintro{lemma}.

Furthermore, if $[{\cal T}
\vdash {\cal C}
\vdash 
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$, i.e. $[{\cal T}
\vdash 
({\cal C}
\vdash 
{\makebox [0mm][l]{$\bot $}\,{\bot }}
)]$ is a Logiweb lemma then one may refer to the conjecture $[{\cal T}
\vdash {\cal C}]$ as a Logiweb \indexintro{antilemma}.



\subsubsection{Statement constructors}

We shall refer to a term as a \indexintro{statement} if we care about its mathematical truth. Hence, rules, contradictions, theories, conjectures, lemmas, and antilemmas are statements.

The constructors
%
\index{x infer y $[
\mathsf{x}
\vdash 
\mathsf{y}]$}%
%
\index{\alpha x infer y@\back $[
\mathsf{x}
\vdash 
\mathsf{y}]$ x infer y}%
%
\tex{$
[
\mathsf{x}
\vdash 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}vdash
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\vdash 
\mathsf{y}]$%
%
,
%
\index{x endorse y $[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}]$}%
%
\index{\alpha x endorse y@\back $[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}]$ x endorse y}%
%
\tex{$
[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\$
\mbox {$\backslash $}vdash
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\}
\mbox {$\backslash $},
\{
\mbox {$\backslash $}vdash
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}]$%
%
,
%
%
%
\index{all x indeed y $[
\forall 
\mathsf{x}
\colon 
\mathsf{y}]$}%
%
\index{\alpha all x indeed y@\back $[
\forall 
\mathsf{x}
\colon 
\mathsf{y}]$ all x indeed y}%
%
\tex{$
[
\forall 
\mathsf{x}
\colon 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}forall
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\forall 
\mathsf{x}
\colon 
\mathsf{y}]$%
%
,
%
%
%
\index{\alpha absurdity @\back $[
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$ absurdity}%
%
\index{absurdity $[
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$}%
%
\tex{$
[
{\makebox [0mm][l]{$\bot $}\,{\bot }}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\$
\mbox {$\backslash $}bot
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\}
\mbox {$\backslash $},
\{
\mbox {$\backslash $}bot
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\}
\mbox{''}
]$}%
%
$[
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$%
%
, and
%
%
%
\index{x rule plus y $[
\mathsf{x}
\mathrel {\oplus} 
\mathsf{y}]$}%
%
\index{\alpha x rule plus y@\back $[
\mathsf{x}
\mathrel {\oplus} 
\mathsf{y}]$ x rule plus y}%
%
\tex{$
[
\mathsf{x}
\mathrel {\oplus} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}oplus
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\mathrel {\oplus} 
\mathsf{y}]$%
%
%
%
allow to form statements from arbitrary terms and statements:

\begin{itemize}

\item $[{\cal A}
\vdash {\cal B}]$ reads $[{\cal A}]$ \index{infer}\intro{infers} $[{\cal B}]$ and states that if $[{\cal A}]$ is provable then $[{\cal B}]$ is provable.

\item $[{\cal A}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} {\cal B}]$ reads $[{\cal A}]$ \index{endorse}\intro{endorses} $[{\cal B}]$ and states that if $[{\cal A}]$ evaluates to $[
\mathsf {T}]$ then $[{\cal B}]$ is provable.

\item $[
\forall {\cal A}
\colon {\cal B}]$ reads \intro{all} $[{\cal A}]$ \intro{indeed} $[{\cal B}]$ and states that $[{\cal B}]$ is provable for all terms $[{\cal A}]$.

\item $[
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$ reads \indexintro{absurdity}. One may claim that a term $[{\cal A}]$ is disprovable by the statement $[{\cal A}
\vdash 
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$.

\item $[{\cal A}
\mathrel {\oplus} {\cal B}]$ reads $[{\cal A}]$ \index{plus, rule}\indexintro{rule plus} $[{\cal B}]$ and states that $[{\cal A}]$ and $[{\cal B}]$ are provable.

\end{itemize}

All the constructors above except endorsement have been used in examples. According to the Unicode standard, $[
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} ]$ reads ``forses'', but we use $[{\cal A}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} {\cal B}]$ for endorsement rather than enforcement.

$[{\cal A}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} {\cal B}]$ states that the side condition $[{\cal A}]$ endorses the conclusion $[{\cal B}]$. The construct can be used for statements like ``$[{\cal B}]$ is free for $[{\cal X}]$ in $[{\cal A}]$ endorses $[
(
\lambda {\cal X}
.{\cal A}
)
\mathbin {\mbox {'}}{\cal B}
=
\langle {\cal A}
\,{|}{\cal X}
{:=}\,{\cal B}
\rangle ]$.

To give a meaningful example of the use of endorsement, however, one has to program some side condition like ``is free for'' first. Examples of use of endorsement will be given later.



\subsubsection{Self-evaluation}

We define the statement constructors such that they are ``self-evaluating''. As an example, the definition of $
\mathsf{x}
\vdash 
\mathsf{y}$ is such that e.g.\ $[
\lceil {\cal A}
\rceil 
\vdash 
\lceil {\cal B}
\rceil ]$ and $[
\lceil {\cal A}
\vdash {\cal B}
\rceil ]$ are equal terms (equal except for debugging information present in the terms which indicates exactly where the terms occur on the Logiweb page). The following definitions make the constructors self-evaluating:

$
[
\mathsf{x}
\vdash 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
\vdash 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$

$
[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$

$
[
\forall 
\mathsf{x}
\colon 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\forall 
\mathsf{x}
\colon 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$

$
[
{\makebox [0mm][l]{$\bot $}\,{\bot }}
\mathrel {\dot {=}}
\langle 
\lceil 
{\makebox [0mm][l]{$\bot $}\,{\bot }}
\rceil 
{}^{R}
\rangle 
]$

$
[
\mathsf{x}
\mathrel {\oplus} 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
\mathrel {\oplus} 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$

$
[
\mathsf{x}
{} ^ { I }
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
{} ^ { I }
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
\rangle 
]$

$
[
\mathsf{x}
{} ^ { \rhd }
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
{} ^ { \rhd }
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
\rangle 
]$

$
[
\mathsf{x}
{} ^ { V } 
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
{} ^ { V } 
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
\rangle 
]$

$
[
\mathsf{x}
{} ^ { + } 
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
{} ^ { + } 
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
\rangle 
]$

$
[
\mathsf{x}
{} ^ { - } 
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
{} ^ { - } 
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
\rangle 
]$

$
[
\mathsf{x}
{} ^ { \ast } 
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
{} ^ { \ast } 
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
\rangle 
]$

$
[
\mathsf{x}
\mathop {\char64} 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
\mathop {\char64} 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$

$
[
\mathsf{x}
\mathrel {i.e.} 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
\mathrel {i.e.} 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$

$
[
\mathsf{x}
; 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
; 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
\vdash 
\lceil 
3
\rceil 
)
\stackrel {t}{=}
\lceil 
2
\vdash 
3
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\lceil 
3
\rceil 
)
\stackrel {t}{=}
\lceil 
2
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
3
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\forall 
\lceil 
2
\rceil 
\colon 
\lceil 
3
\rceil 
)
\stackrel {t}{=}
\lceil 
\forall 
2
\colon 
3
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
{\makebox [0mm][l]{$\bot $}\,{\bot }}
\stackrel {t}{=}
\lceil 
{\makebox [0mm][l]{$\bot $}\,{\bot }}
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
\mathrel {\oplus} 
\lceil 
3
\rceil 
)
\stackrel {t}{=}
\lceil 
2
\mathrel {\oplus} 
3
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
{} ^ { I }
)
\stackrel {t}{=}
\lceil 
2
{} ^ { I }
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
{} ^ { \rhd }
)
\stackrel {t}{=}
\lceil 
2
{} ^ { \rhd }
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
{} ^ { V } 
)
\stackrel {t}{=}
\lceil 
2
{} ^ { V } 
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
{} ^ { + } 
)
\stackrel {t}{=}
\lceil 
2
{} ^ { + } 
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
{} ^ { - } 
)
\stackrel {t}{=}
\lceil 
2
{} ^ { - } 
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
{} ^ { \ast } 
)
\stackrel {t}{=}
\lceil 
2
{} ^ { \ast } 
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
\mathop {\char64} 
\lceil 
3
\rceil 
)
\stackrel {t}{=}
\lceil 
2
\mathop {\char64} 
3
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
\mathrel {i.e.} 
\lceil 
3
\rceil 
)
\stackrel {t}{=}
\lceil 
2
\mathrel {i.e.} 
3
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
(
\lceil 
2
\rceil 
; 
\lceil 
3
\rceil 
)
\stackrel {t}{=}
\lceil 
2
; 
3
\rceil 
\relax ]^{\cdot} $}%
%



\subsection{Metavariables}\label{section:Metavariables}

\subsubsection{Definition of metavariables}

As mentioned in Section \ref{section:AxiomSchemes}, \indexintro{metavariables} range over terms as opposed to ordinary variables which range over values. In the sequent calculus presented in Section \ref{section:SequentCalculus} we need to distinguish metavariables from other variables.

To do so, we simply introduce the unary operator
%
\index{\alpha metavar x end metavar @\back $[\underline{
\mathsf{x}}]$ metavar x end metavar}%
%
\index{metavar x end metavar $[\underline{
\mathsf{x}}]$}%
%
\tex{$
[\underline{
\mathsf{x}}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox {$\backslash $}underline
\{
\#1.
\}
\mbox{''}
]$}%
%
$[\underline{
\mathsf{x}}]$%
%
and make the convention that a term is a metavariable iff it has the $[\underline{
\ast }]$ construct in its root.

Having this convention in place, we introduce the metavariables \hskip0em plus2.0em
%
% a
%
\tex{$
[{\cal A}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}A
\}
\mbox{''}
]$}%
%
$
[{\cal A}
\mathrel {\ddot {=}}\underline{
\mathsf {a}}
]$%
%
, \hskip0em plus2.0em
%
%
% b
%
\tex{$
[{\cal B}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}B
\}
\mbox{''}
]$}%
%
$
[{\cal B}
\mathrel {\ddot {=}}\underline{
\mathsf {b}}
]$%
%
, \hskip0em plus2.0em
%
%
% c
%
\tex{$
[{\cal C}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}C
\}
\mbox{''}
]$}%
%
$
[{\cal C}
\mathrel {\ddot {=}}\underline{
\mathsf {c}}
]$%
%
, \hskip0em plus2.0em
%
%
% d
%
\tex{$
[{\cal D}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}D
\}
\mbox{''}
]$}%
%
$
[{\cal D}
\mathrel {\ddot {=}}\underline{
\mathsf {d}}
]$%
%
, \hskip0em plus2.0em
%
%
% e
%
\tex{$
[{\cal E}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}E
\}
\mbox{''}
]$}%
%
$
[{\cal E}
\mathrel {\ddot {=}}\underline{
\mathsf {e}}
]$%
%
, \hskip0em plus2.0em
%
%
% f
%
\tex{$
[{\cal F}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}F
\}
\mbox{''}
]$}%
%
$
[{\cal F}
\mathrel {\ddot {=}}\underline{
\mathsf {f}}
]$%
%
, \hskip0em plus2.0em
%
%
% g
%
\tex{$
[{\cal G}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}G
\}
\mbox{''}
]$}%
%
$
[{\cal G}
\mathrel {\ddot {=}}\underline{
\mathsf {g}}
]$%
%
, \hskip0em plus2.0em
%
%
% h
%
\tex{$
[{\cal H}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}H
\}
\mbox{''}
]$}%
%
$
[{\cal H}
\mathrel {\ddot {=}}\underline{
\mathsf {h}}
]$%
%
, \hskip0em plus2.0em
%
%
% i
%
\tex{$
[{\cal I}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}I
\}
\mbox{''}
]$}%
%
$
[{\cal I}
\mathrel {\ddot {=}}\underline{
\mathsf {i}}
]$%
%
, \hskip0em plus2.0em
%
%
% j
%
\tex{$
[{\cal J}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}J
\}
\mbox{''}
]$}%
%
$
[{\cal J}
\mathrel {\ddot {=}}\underline{
\mathsf {j}}
]$%
%
, \hskip0em plus2.0em
%
%
% k
%
\tex{$
[{\cal K}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}K
\}
\mbox{''}
]$}%
%
$
[{\cal K}
\mathrel {\ddot {=}}\underline{
\mathsf {k}}
]$%
%
, \hskip0em plus2.0em
%
%
% l
%
\tex{$
[{\cal L}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}L
\}
\mbox{''}
]$}%
%
$
[{\cal L}
\mathrel {\ddot {=}}\underline{
\mathsf {l}}
]$%
%
, \hskip0em plus2.0em
%
%
% m
%
\tex{$
[{\cal M}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}
\mbox{''}
]$}%
%
$
[{\cal M}
\mathrel {\ddot {=}}\underline{
\mathsf {m}}
]$%
%
, \hskip0em plus2.0em
%
%
% n
%
\tex{$
[{\cal N}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}N
\}
\mbox{''}
]$}%
%
$
[{\cal N}
\mathrel {\ddot {=}}\underline{
\mathsf {n}}
]$%
%
, \hskip0em plus2.0em
%
%
% o
%
\tex{$
[{\cal O}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}O
\}
\mbox{''}
]$}%
%
$
[{\cal O}
\mathrel {\ddot {=}}\underline{
\mathsf {o}}
]$%
%
, \hskip0em plus2.0em
%
%
% p
%
\tex{$
[{\cal P}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}P
\}
\mbox{''}
]$}%
%
$
[{\cal P}
\mathrel {\ddot {=}}\underline{
\mathsf {p}}
]$%
%
, \hskip0em plus2.0em
%
%
% q
%
\tex{$
[{\cal Q}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}Q
\}
\mbox{''}
]$}%
%
$
[{\cal Q}
\mathrel {\ddot {=}}\underline{
\mathsf {q}}
]$%
%
, \hskip0em plus2.0em
%
%
% r
%
\tex{$
[{\cal R}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}R
\}
\mbox{''}
]$}%
%
$
[{\cal R}
\mathrel {\ddot {=}}\underline{
\mathsf {r}}
]$%
%
, \hskip0em plus2.0em
%
%
% s
%
\tex{$
[{\cal S}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\mbox{''}
]$}%
%
$
[{\cal S}
\mathrel {\ddot {=}}\underline{
\mathsf {s}}
]$%
%
, \hskip0em plus2.0em
%
%
% t
%
\tex{$
[{\cal T}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}T
\}
\mbox{''}
]$}%
%
$
[{\cal T}
\mathrel {\ddot {=}}\underline{
\mathsf {t}}
]$%
%
, \hskip0em plus2.0em
%
%
% u
%
\tex{$
[{\cal U}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}U
\}
\mbox{''}
]$}%
%
$
[{\cal U}
\mathrel {\ddot {=}}\underline{
\mathsf {u}}
]$%
%
, \hskip0em plus2.0em
%
%
% v
%
\tex{$
[{\cal V}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\mbox{''}
]$}%
%
$
[{\cal V}
\mathrel {\ddot {=}}\underline{
\mathsf {v}}
]$%
%
, \hskip0em plus2.0em
%
%
% w
%
\tex{$
[{\cal W}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}W
\}
\mbox{''}
]$}%
%
$
[{\cal W}
\mathrel {\ddot {=}}\underline{
\mathsf {w}}
]$%
%
, \hskip0em plus2.0em
%
%
% x
%
\tex{$
[{\cal X}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}X
\}
\mbox{''}
]$}%
%
$
[{\cal X}
\mathrel {\ddot {=}}\underline{
\mathsf{x}}
]$%
%
, \hskip0em plus2.0em
%
%
% y
%
\tex{$
[{\cal Y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}Y
\}
\mbox{''}
]$}%
%
$
[{\cal Y}
\mathrel {\ddot {=}}\underline{
\mathsf{y}}
]$%
%
, and \hskip0em plus2.0em
%
%
% z
%
\tex{$
[{\cal Z}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}Z
\}
\mbox{''}
]$}%
%
$
[{\cal Z}
\mathrel {\ddot {=}}\underline{
\mathsf{z}}
]$%
%
.



\subsubsection{Recognition of metavariables}

\index{V: $[
\mathsf{x}
{} ^ {\cal V}]$ x is metavar}%
%
\index{x is metavar $[
\mathsf{x}
{} ^ {\cal V}]$}%
%
\tex{$
[
\mathsf {t}
{} ^ {\cal V}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\mbox{''}
]$}%
%
$[
\mathsf {t}
{} ^ {\cal V}]$%
%
is true if $[
\mathsf {t}]$ is a metavariable:

\display{$
[
\mathsf {t}
{} ^ {\cal V}
\mathrel {\dot {=}}
\mathsf {t}
\stackrel{r}{=} 
\lceil {\cal A}
\rceil 
]$}%
%
\test{$
\relax [ 
\lceil {\cal P}
\rceil 
{} ^ {\cal V}
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
\lceil 
\mathsf {p}
\rceil 
{} ^ {\cal V}
\relax ]^{-} $}



\subsubsection{Closedness}

\index{C: $[
\mathsf{x}
{} ^ {\cal C}]$ x is metaclosed}%
%
\index{x is metaclosed $[
\mathsf{x}
{} ^ {\cal C}]$}%
%
\tex{$
[
\mathsf {t}
{} ^ {\cal C}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}C
\}
\mbox{''}
]$}%
%
$[
\mathsf {t}
{} ^ {\cal C}]$%
%
is true if the term $[
\mathsf {t}]$ contains no metavariables and
%
\index{C*: $[
\mathsf{x}
{} ^ {{\cal C} ^ { \ast }}]$ x is metaclosed star}%
%
\index{x is metaclosed star $[
\mathsf{x}
{} ^ {{\cal C} ^ { \ast }}]$}%
%
\tex{$
[
\mathsf {t}
{} ^ {{\cal C} ^ { \ast }}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}C
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}ast
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\}
\mbox{''}
]$}%
%
$[
\mathsf {t}
{} ^ {{\cal C} ^ { \ast }}]$%
%
is true if the list $[
\mathsf {t}]$ of terms contains no metavariables:

\display{$
[
\mathsf {t}
{} ^ {\cal C}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {t}
{} ^ {\cal V}
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathsf {t}
{}^t
{} ^ {{\cal C} ^ { \ast }}
)
]$}

\display{$
[
\mathsf {t}
{} ^ {{\cal C} ^ { \ast }}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {t}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathrm {If}(
\mathsf {t}
{}^h
{} ^ {\cal C}
,\linebreak [0]
\mathsf {t}
{}^t
{} ^ {{\cal C} ^ { \ast }}
,\linebreak [0]
\mathsf {F}
)
)
]$}%
%
\test{$
\relax [ 
\lceil 
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\mathrel { : \, : }
\mathsf{z}
\rceil 
{} ^ {\cal C}
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
\lceil 
\mathsf{x}
\mathrel { : \, : }{\cal Y}
\mathrel { : \, : }
\mathsf{z}
\rceil 
{} ^ {\cal C}
\relax ]^{-} $}



\subsubsection{The ``free in'' predicate}

\index{free in: $[
\mathsf{x}
\mathrel {free\ in} 
\mathsf{y}]$ x free in y }%
%
\index{x free in y $[
\mathsf{x}
\mathrel {free\ in} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathrel {free\ in} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{free
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}in
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf {v}
\mathrel {free\ in} 
\mathsf {t}]$%
%
is true if the metavariable $[
\mathsf {v}]$ is occurs free in the term $[
\mathsf {t}]$. Furthermore,
%
\index{free in*: $[
\mathsf{x}
\mathrel {free\ in}^{\ast} 
\mathsf{y}]$ x free in star y }%
%
\index{x free in star y $[
\mathsf{x}
\mathrel {free\ in}^{\ast} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathrel {free\ in}^{\ast} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{free
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}in
\}
{\char94}
\{
\mbox {$\backslash $}ast
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf {v}
\mathrel {free\ in}^{\ast} 
\mathsf {t}]$%
%
is true if the metavariable $[
\mathsf {v}]$ is occurs free in the list $[
\mathsf {t}]$ of terms.

\display{$
[
\mathsf {v}
\mathrel {free\ in} 
\mathsf {t}
\mathrel {\dot {=}}
\newline 
{\bf if} \ 
\mathsf {v}
\stackrel {t}{=}
\mathsf {t}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\forall 
\ast 
\colon 
\ast 
\rceil 
\ {\bf then} \ 
\mathsf {v}
\mathrel {free\ in}^{\ast} 
\mathsf {t}
{}^t
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {v}
\stackrel {t}{=}
\mathsf {t}
{}^{1}
\ {\bf then} \ 
\mathsf {F}
\ {\bf else} \ 
\mathsf {v}
\mathrel {free\ in} 
\mathsf {t}
{}^{2}
]$}

\display{$
[
\mathsf {v}
\mathrel {free\ in}^{\ast} 
\mathsf {t}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {t}
,\linebreak [0]
\mathsf {v}
!
\mathsf {F}
,\linebreak [0]
\mathrm {If}(
\mathsf {v}
\mathrel {free\ in} 
\mathsf {t}
{}^h
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf {v}
\mathrel {free\ in}^{\ast} 
\mathsf {t}
{}^t
)
)
]$}%
%
\test{$
\relax [ 
\lceil {\cal Y}
\rceil 
\mathrel {free\ in} 
\lceil {\cal X}
\mathrel { : \, : }{\cal Y}
\mathrel { : \, : }{\cal Z}
\rceil 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
\lceil {\cal Y}
\rceil 
\mathrel {free\ in} 
\lceil {\cal X}
\mathrel { : \, : }
\mathsf{y}
\mathrel { : \, : }{\cal Z}
\rceil 
\relax ]^{-} $}%



\subsubsection{The ``free for'' predicate}

%
\index{free for: $[
\mathsf{x}
\mathrel {free\ for} 
\mathsf{y}
\mathrel {in} 
\mathsf{z}]$ x free for y in z }%
%
\index{x free for y in z $[
\mathsf{x}
\mathrel {free\ for} 
\mathsf{y}
\mathrel {in} 
\mathsf{z}]$}%
%
\tex{$
[
\mathsf {a}
\mathrel {free\ for} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{free
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}for
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{in
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\mbox{''}
]$}%
%
$[
\mathsf {a}
\mathrel {free\ for} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}]$%
%
is true if the term $[
\mathsf {a}]$ is free for the metavariable $[
\mathsf{x}]$ in the term $[
\mathsf {b}]$. Furthermore,
%
\index{free for*: \back $[
\mathsf{x}
\mathrel {free\ for}^{\ast} 
\mathsf{y}
\mathrel {in} 
\mathsf{z}]$ x free for star y in z }%
%
\index{x free for star y in z $[
\mathsf{x}
\mathrel {free\ for}^{\ast} 
\mathsf{y}
\mathrel {in} 
\mathsf{z}]$}%
%
\tex{$
[
\mathsf {a}
\mathrel {free\ for}^{\ast} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{free
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}for
\}
{\char94}
\{
\mbox {$\backslash $}ast
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{in
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\mbox{''}
]$}%
%
$[
\mathsf {a}
\mathrel {free\ for}^{\ast} 
\ast 
\mathrel {in} 
\mathsf {b}]$%
%
is true if the term $[
\mathsf {a}]$ is free for the metavariable $[
\mathsf{x}]$ in the list $[
\mathsf {b}]$ of terms.

\display{$
[
\mathsf {a}
\mathrel {free\ for} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}
\mathrel {\dot {=}}
\mathsf {a}
!
\mathsf{x}
!
\newline 
{\bf if} \ 
\mathsf {b}
{} ^ {\cal V}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {b}
\stackrel{r}{=} 
\lceil 
\forall 
\ast 
\colon 
\ast 
\rceil 
\ {\bf then} \ 
\mathsf {a}
\mathrel {free\ for}^{\ast} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}
{}^t
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf{x}
\stackrel {t}{=}
\mathsf {b}
{}^{1}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf{x}
\mathrel {free\ in} 
\mathsf {b}
{}^{2}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {b}
{}^{1}
\mathrel {free\ in} 
\mathsf {a}
\ {\bf then} \ 
\mathsf {F}
\ {\bf else} \ 
\newline 
\mathsf {a}
\mathrel {free\ for} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}
{}^{2}
]$}

\display{$
[
\mathsf {a}
\mathrel {free\ for}^{\ast} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}
\mathrel {\dot {=}}
\newline 
{\bf if} \ 
\mathsf {b}
\ {\bf then} \ 
\mathsf {a}
!
\mathsf{x}
!
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {a}
\mathrel {free\ for} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}
{}^h
\ {\bf then} \ 
\mathsf {a}
\mathrel {free\ for}^{\ast} 
\mathsf{x}
\mathrel {in} 
\mathsf {b}
{}^t
\ {\bf else} \ 
\mathsf {F}
]$}%
%
\test{$
\relax [ 
\lceil 
\mathsf{x}
\mathrel { : \, : }{\cal Y}
\mathrel { : \, : }
\mathsf{z}
\rceil 
\mathrel {free\ for} 
\lceil {\cal X}
\rceil 
\mathrel {in} 
\lceil 
\forall {\cal X}
\colon 
\mathsf {b}
\mathrel { : \, : }{\cal X}
\mathrel { : \, : }
\mathsf {c}
\rceil 
\relax ]^{\cdot} $}
%
\test{$
\relax [ 
\lceil 
\mathsf{x}
\mathrel { : \, : }{\cal Y}
\mathrel { : \, : }
\mathsf{z}
\rceil 
\mathrel {free\ for} 
\lceil {\cal X}
\rceil 
\mathrel {in} 
\lceil 
\forall {\cal Y}
\colon 
\mathsf {b}
\mathrel { : \, : }{\cal X}
\mathrel { : \, : }
\mathsf {c}
\rceil 
\relax ]^{-} $}
%
\test{$
\relax [ 
\lceil 
\mathsf{x}
\mathrel { : \, : }{\cal Y}
\mathrel { : \, : }
\mathsf{z}
\rceil 
\mathrel {free\ for} 
\lceil {\cal Y}
\rceil 
\mathrel {in} 
\lceil 
\forall {\cal X}
\colon 
\mathsf {b}
\mathrel { : \, : }{\cal X}
\mathrel { : \, : }
\mathsf {c}
\rceil 
\relax ]^{\cdot} $}
%
\test{$
\relax [ 
\lceil 
\mathsf{x}
\mathrel { : \, : }{\cal Y}
\mathrel { : \, : }
\mathsf{z}
\rceil 
\mathrel {free\ for} 
\lceil {\cal Y}
\rceil 
\mathrel {in} 
\lceil 
\forall {\cal Y}
\colon 
\mathsf {b}
\mathrel { : \, : }{\cal X}
\mathrel { : \, : }
\mathsf {c}
\rceil 
\relax ]^{\cdot} $}



\subsubsection{Metavariable substitution}

\index{\alpha sub x set y to z end sub @\back $[
\langle 
\mathsf{x}
\,{\protect\vert}
\mathsf{y}
{:=}\,
\mathsf{z}
\rangle ]$ sub x set y to z end sub }%
%
\index{sub x set y to z end sub $[
\langle 
\mathsf{x}
\,{\protect\vert}
\mathsf{y}
{:=}\,
\mathsf{z}
\rangle ]$}%
%
\tex{$
[
\langle 
\mathsf {a}
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}langle
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $},
\{
\mbox {$\backslash $}protect
\mbox {$\backslash $}vert
\}
\#2.
\newline 
\{
{:}
{=}
\}
\mbox {$\backslash $},
\#3.
\newline 
\mbox {$\backslash $}rangle
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
$[
\langle 
\mathsf {a}
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle ]$%
%
replaces all free occurrences of the metavariable $[
\mathsf{x}]$ by the term $[
\mathsf {b}]$ in the term $[
\mathsf {a}]$. The operation does no renaming of bound variables, so variable clashes will occur if $[
\mathsf {b}]$ is not free for $[
\mathsf{x}]$ in $[
\mathsf {a}]$. Furthermore,
%
\index{\alpha sub star x set y to z end sub @\back $[
\langle ^ { \ast } 
\mathsf{x}
\,{\protect\vert}
\mathsf{y}
{:=}\,
\mathsf{z}
\rangle ]$ sub star x set y to z end sub }%
%
\index{sub star x set y to z end sub $[
\langle ^ { \ast } 
\mathsf{x}
\,{\protect\vert}
\mathsf{y}
{:=}\,
\mathsf{z}
\rangle ]$}%
%
\tex{$
[
\langle ^ { \ast } 
\mathsf {a}
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}langle
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}ast
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $},
\{
\mbox {$\backslash $}protect
\mbox {$\backslash $}vert
\}
\#2.
\newline 
\{
{:}
{=}
\}
\mbox {$\backslash $},
\#3.
\newline 
\mbox {$\backslash $}rangle
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
$[
\langle ^ { \ast } 
\mathsf {a}
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle ]$%
%
replaces all free occurrences of the metavariable $[
\mathsf{x}]$ by the term $[
\mathsf {b}]$ in the list $[
\mathsf {a}]$ of terms.

\display{$
[
\langle 
\mathsf {a}
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle 
\mathrel {\dot {=}}
\mathsf{x}
!
\mathsf {b}
!
\newline 
{\bf if} \ 
\mathsf {a}
{} ^ {\cal V}
\ {\bf then} \ 
\mathrm {If}(
\mathsf {a}
\stackrel {t}{=}
\mathsf{x}
,\linebreak [0]
\mathsf {b}
,\linebreak [0]
\mathsf {a}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {a}
\stackrel{r}{=} 
\lceil 
\forall 
\ast 
\colon 
\ast 
\rceil 
\ {\bf then} \ 
\mathsf {a}
{}^h
\mathrel { : \, : }
\langle ^ { \ast } 
\mathsf {a}
{}^t
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle 
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {a}
{}^{1}
\stackrel {t}{=}
\mathsf{x}
\ {\bf then} \ 
\mathsf {a}
\ {\bf else} \ 
\newline 
\langle 
\mathsf {a}
{}^{0}
,\linebreak [0] 
\mathsf {a}
{}^{1}
,\linebreak [0] 
\langle 
\mathsf {a}
{}^{2}
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle 
\rangle 
]$}

\display{$
[
\langle ^ { \ast } 
\mathsf {a}
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle 
\mathrel {\dot {=}}
\mathsf{x}
!
\mathsf {b}
!
\mathrm {If}(
\mathsf {a}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\langle 
\mathsf {a}
{}^h
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle 
\mathrel { : \, : }
\langle ^ { \ast } 
\mathsf {a}
{}^t
\,{\protect\vert}
\mathsf{x}
{:=}\,
\mathsf {b}
\rangle 
)
]$}%
%
\test{$
\relax [ 
\langle 
\lceil {\cal A}
\mathrel { : \, : }
(
\forall {\cal A}
\colon {\cal A}
)
\mathrel { : \, : }{\cal B}
\mathrel { : \, : }{\cal A}
\rceil 
\,{\protect\vert}
\lceil {\cal A}
\rceil 
{:=}\,
\lceil 
2
\rceil 
\rangle 
\stackrel {t}{=}
\lceil 
2
\mathrel { : \, : }
(
\forall {\cal A}
\colon {\cal A}
)
\mathrel { : \, : }{\cal B}
\mathrel { : \, : }
2
\rceil 
\relax ]^{\cdot} $}



\subsection{Sequent calculus}\label{section:SequentCalculus}

\subsubsection{Term sets}

We shall represent sets of terms as lists without repetitions. We require the lists to be without repetitions in the sense that a term $[
\mathsf{x}]$ is not allowed to occur more than once and, furthermore, if two distinct terms $[
\mathsf{x}]$ and $[
\mathsf{y}]$ satisfy $[
\mathsf{x}
\stackrel {t}{=}
\mathsf{y}]$ then the lists are not allowed to contain them both.

The membership operation
%
\index{\alpha x term in y @\back $[
\mathsf{x}
\in_t 
\mathsf{y}]$ x term in y}%
%
\index{x term in y $[
\mathsf{x}
\in_t 
\mathsf{y}]$}%
%
\index{t: $[
\mathsf{x}
\in_t 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\in_t 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}in
\_t
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\in_t 
\mathsf{y}]$%
%
is defined thus:

\display{$
[
\mathsf{x}
\in_t 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{y}
{}^a
,\linebreak [0]
\mathsf{x}
!
\mathsf {F}
,\linebreak [0]
\mathrm {If}(
\mathsf{x}
\stackrel {t}{=}
\mathsf{y}
{}^h
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf{x}
\in_t 
\mathsf{y}
{}^t
)
)
]$}%
%
\test{$
\relax [ 
\lceil 
\mathsf{y}
\rceil 
\in_t 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
\lceil 
\mathsf {u}
\rceil 
\in_t 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{-} $}

The subset operation
%
\index{\alpha x term subset y @\back $[
\mathsf{x}
\subseteq_T 
\mathsf{y}]$ x term subset y}%
%
\index{x term subset y $[
\mathsf{x}
\subseteq_T 
\mathsf{y}]$}%
%
\index{T: $[
\mathsf{x}
\subseteq_T 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\subseteq_T 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}subseteq
\_T
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\subseteq_T 
\mathsf{y}]$%
%
is defined thus:

\display{$
[
\mathsf{x}
\subseteq_T 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^a
,\linebreak [0]
\mathsf{y}
!
\mathsf {T}
,\linebreak [0]
\mathrm {If}(
\mathsf{x}
{}^h
\in_t 
\mathsf{y}
,\linebreak [0]
\mathsf{x}
{}^t
\subseteq_T 
\mathsf{y}
,\linebreak [0]
\mathsf {F}
)
)
]$}%
%
\test{$
\relax [ 
\langle 
\lceil 
\mathsf{z}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{x}
\rceil 
\rangle 
\subseteq_T 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
\langle 
\lceil 
\mathsf{z}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf {u}
\rceil 
\rangle 
\subseteq_T 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{-} $}

The set equality operation
%
\index{\alpha x term set equal y @\back $[
\mathsf{x}
\stackrel{T}{=} 
\mathsf{y}]$ x term set equal y}%
%
\index{x term set equal y $[
\mathsf{x}
\stackrel{T}{=} 
\mathsf{y}]$}%
%
\index{T: $[
\mathsf{x}
\stackrel{T}{=} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\stackrel{T}{=} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\{T
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\stackrel{T}{=} 
\mathsf{y}]$%
%
is defined thus:

\display{$
[
\mathsf{x}
\stackrel{T}{=} 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
\subseteq_T 
\mathsf{y}
,\linebreak [0]
\mathsf{y}
\subseteq_T 
\mathsf{x}
,\linebreak [0]
\mathsf {F}
)
]$}%
%
\test{$
\relax [ 
\langle 
\lceil 
\mathsf{z}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{x}
\rceil 
\rangle 
\stackrel{T}{=} 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
\langle 
\lceil 
\mathsf{z}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{x}
\rceil 
\rangle 
\stackrel{T}{=} 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{-} $}%
%
\test{$
\relax [ 
\langle 
\lceil 
\mathsf{z}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{x}
\rceil 
\rangle 
\stackrel{T}{=} 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{-} $}

The empty set
%
\index{\alpha the empty set @\back $[
\emptyset ]$ the empty set}%
%
\index{the empty set $[
\emptyset ]$}%
%
\tex{$
[
\emptyset 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}emptyset
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
$[
\emptyset ]$%
%
is defined thus:

\display{$
[
\emptyset 
\mathrel {\dot {=}}
\mathsf {T}
]$}

The operation
%
\index{\alpha x term plus y end plus @\back $[
\mathsf{x}
\cup \{ 
\mathsf{y}
\}]$ x term plus y end plus}%
%
\index{x term plus var y end plus $[
\mathsf{x}
\cup \{ 
\mathsf{y}
\}]$}%
%
\tex{$
[
\mathsf{x}
\cup \{ 
\mathsf{y}
\}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}cup
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}
\}
\mbox{''}
]$}%
%
$[
\mathsf{x}
\cup \{ 
\mathsf{y}
\}]$%
%
adds the term $[
\mathsf{y}]$ to the term set $[
\mathsf{x}]$:

\display{$
[
\mathsf{x}
\cup \{ 
\mathsf{y}
\}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{y}
\in_t 
\mathsf{x}
,\linebreak [0]
\mathsf{x}
,\linebreak [0]
\mathsf{y}
\mathrel { : \, : }
\mathsf{x}
)
]$}%
%
\test{$
\relax [ 
\emptyset 
\cup \{ 
\lceil 
\mathsf{x}
\rceil 
\}
\cup \{ 
\lceil 
\mathsf{y}
\rceil 
\}
\cup \{ 
\lceil 
\mathsf{z}
\rceil 
\}
\cup \{ 
\lceil 
\mathsf{y}
\rceil 
\}
\stackrel {t^*}{=}
\langle 
\lceil 
\mathsf{z}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{x}
\rceil 
\rangle 
\relax ]^{\cdot} $}

The operation
%
\index{\alpha x term minus y end minus @\back $[
\mathsf{x}
\backslash \{ 
\mathsf{y}
\}]$ x term minus y end minus}%
%
\index{x term minus var y end minus $[
\mathsf{x}
\backslash \{ 
\mathsf{y}
\}]$}%
%
\tex{$
[
\mathsf{x}
\backslash \{ 
\mathsf{y}
\}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}backslash
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}
\}
\mbox{''}
]$}%
%
$[
\mathsf{x}
\backslash \{ 
\mathsf{y}
\}]$%
%
removes the term $[
\mathsf{y}]$ from the term set $[
\mathsf{x}]$:

\display{$
[
\mathsf{x}
\backslash \{ 
\mathsf{y}
\}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^a
,\linebreak [0]
\mathsf{y}
!
\emptyset 
,\linebreak [0]
\mathrm {If}(
\mathsf{y}
\stackrel {t}{=}
\mathsf{x}
{}^h
,\linebreak [0]
\mathsf{x}
{}^t
,\linebreak [0]
\mathsf{x}
{}^h
\mathrel { : \, : }
\mathsf{x}
{}^t
\backslash \{ 
\mathsf{y}
\}
)
)
]$}%
%
\test{$
\relax [ 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\backslash \{ 
\lceil 
\mathsf{y}
\rceil 
\}
\stackrel {t^*}{=}
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\backslash \{ 
\lceil 
\mathsf {u}
\rceil 
\}
\stackrel {t^*}{=}
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{\cdot} $}

The operation
%
\index{\alpha x term union y @\back $[
\mathsf{x}
\cup 
\mathsf{y}]$ x term union y}%
%
\index{x term union y $[
\mathsf{x}
\cup 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\cup 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}cup
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\cup 
\mathsf{y}]$%
%
computes the union of the term sets $[
\mathsf{x}]$ and $[
\mathsf{y}]$:

\display{$
[
\mathsf{x}
\cup 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf{x}
{}^a
,\linebreak [0]
\mathsf{y}
,\linebreak [0]
\mathsf{x}
{}^t
\cup 
\mathsf{y}
\cup \{ 
\mathsf{x}
{}^h
\}
)
]$}%
%
\test{$
\relax [ 
\langle 
\lceil 
\mathsf {a}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf {b}
\rceil 
\rangle 
\cup 
\langle 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\stackrel {t^*}{=}
\langle 
\lceil 
\mathsf {a}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf {b}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{x}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{y}
\rceil 
,\linebreak [0] 
\lceil 
\mathsf{z}
\rceil 
\rangle 
\relax ]^{\cdot} $}



\subsubsection{Sequents}\label{section:Sequents}

A Logiweb \indexintro{sequent} is a triple $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$ where $[
\mathsf {p}]$ and $[
\mathsf {s}]$ are term sets and $[
\mathsf {c}]$ is a term. In a sequent $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$ we shall refer to $[
\mathsf {p}]$, $[
\mathsf {c}]$, and $[
\mathsf {c}]$ as \indexintro{premise}, \indexintro{side condition}, and \indexintro{conclusion}, respectively, of the sequent.

A sequent $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$ represents the statement that if all members of $[
\mathsf {p}]$ are provable and if all members of $[
\mathsf {s}]$ evaluate to $[
\mathsf {T}]$ then $[
\mathsf {c}]$ is provable.

Sequents allow to express the same thing in many ways. As an example, the following five sequents all state that if $[{\cal A}]$ and $[{\cal B}]$ are provable then $[{\cal A}
\mathrel {\oplus} {\cal B}]$ is provable:

\display{$
\begin {array}{
l
}
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] {\cal A}
\vdash {\cal B}
\vdash {\cal A}
\mathrel {\oplus} {\cal B}
\rangle 
\\ 
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] {\cal B}
\vdash {\cal A}
\vdash {\cal A}
\mathrel {\oplus} {\cal B}
\rangle 
\\ 
\langle 
\emptyset 
\cup \{ {\cal A}
\}
,\linebreak [0] 
\emptyset 
,\linebreak [0] {\cal B}
\vdash {\cal A}
\mathrel {\oplus} {\cal B}
\rangle 
\\ 
\langle 
\emptyset 
\cup \{ {\cal B}
\}
,\linebreak [0] 
\emptyset 
,\linebreak [0] {\cal A}
\vdash {\cal A}
\mathrel {\oplus} {\cal B}
\rangle 
\\ 
\langle 
\emptyset 
\cup \{ {\cal A}
\}
\cup \{ {\cal B}
\}
,\linebreak [0] 
\emptyset 
,\linebreak [0] {\cal A}
\mathrel {\oplus} {\cal B}
\rangle 
\end {array}$}

The sequent $[
\langle 
\emptyset 
\cup \{ {\cal B}
\}
\cup \{ {\cal A}
\}
,\linebreak [0] 
\emptyset 
,\linebreak [0] {\cal A}
\mathrel {\oplus} {\cal B}
\rangle ]$ is considered equal to the last of the sequents above since the order of elements in term sets is considered unimportant.

From an operational point of view one may think of a sequent $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$ as a tool makers workshop where $[
\mathsf {c}]$ is the anvil where lemmas are forged. $[
\mathsf {p}]$ may be seen as a storage room for premises, in which case part of the tool makers work is to bring premises back and forth between anvil and storage room. Alternatively, $[
\mathsf {p}]$ may be seen as a backlog of proof obligations. $[
\mathsf {s}]$ is like $[
\mathsf {p}]$ except that it stores side conditions.

As we shall see, the storage room $[
\mathsf {p}]$ will be used for several different things. As an example, when proving $[{\cal A}
={\cal B}
\vdash {\cal B}
={\cal A}]$ in $[
T'_{E}]$, $[
\mathsf {p}]$ will be used to contain the axiomatic theory $[
T'_{E}]$ itself, it will be used to contain the premise $[{\cal A}
={\cal B}]$, and it will be used to contain conclusions of individual lines of the proof.



\subsubsection{Sequent equality}

The sequent equality operation
%
\index{\alpha x sequent equal y @\back $[
\mathsf{x}
\stackrel{s}{=} 
\mathsf{y}]$ x sequent equal y}%
%
\index{x sequent equal y $[
\mathsf{x}
\stackrel{s}{=} 
\mathsf{y}]$}%
%
\index{s: $[
\mathsf{x}
\stackrel{s}{=} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\stackrel{s}{=} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\{s
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\stackrel{s}{=} 
\mathsf{y}]$%
%
is defined thus:

\display{$
[
\mathsf{x}
\stackrel{s}{=} 
\mathsf{y}
\mathrel {\dot {=}}
\mathrm {If}(
{\neg }
\mathsf{x}
{}^{2}
\stackrel {t}{=}
\mathsf{y}
{}^{2}
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
\mathrm {If}(
\mathsf{x}
{}^{0}
\stackrel{T}{=} 
\mathsf{y}
{}^{0}
,\linebreak [0]
\mathsf{x}
{}^{1}
\stackrel{T}{=} 
\mathsf{y}
{}^{1}
,\linebreak [0]
\mathsf {F}
)
)
]$}%
%
\test{$
\relax [ 
\langle 
\langle 
\lceil 
1
\rceil 
,\linebreak [0] 
\lceil 
2
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
3
\rceil 
,\linebreak [0] 
\lceil 
4
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\stackrel{s}{=} 
\langle 
\langle 
\lceil 
2
\rceil 
,\linebreak [0] 
\lceil 
1
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
4
\rceil 
,\linebreak [0] 
\lceil 
3
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
\langle 
\langle 
\lceil 
6
\rceil 
,\linebreak [0] 
\lceil 
2
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
3
\rceil 
,\linebreak [0] 
\lceil 
4
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\stackrel{s}{=} 
\langle 
\langle 
\lceil 
2
\rceil 
,\linebreak [0] 
\lceil 
1
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
4
\rceil 
,\linebreak [0] 
\lceil 
3
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\relax ]^{-} $}%
%
\test{$
\relax [ 
\langle 
\langle 
\lceil 
1
\rceil 
,\linebreak [0] 
\lceil 
6
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
3
\rceil 
,\linebreak [0] 
\lceil 
4
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\stackrel{s}{=} 
\langle 
\langle 
\lceil 
2
\rceil 
,\linebreak [0] 
\lceil 
1
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
4
\rceil 
,\linebreak [0] 
\lceil 
3
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\relax ]^{-} $}%
%
\test{$
\relax [ 
\langle 
\langle 
\lceil 
1
\rceil 
,\linebreak [0] 
\lceil 
2
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
6
\rceil 
,\linebreak [0] 
\lceil 
4
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\stackrel{s}{=} 
\langle 
\langle 
\lceil 
2
\rceil 
,\linebreak [0] 
\lceil 
1
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
4
\rceil 
,\linebreak [0] 
\lceil 
3
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\relax ]^{-} $}%
%
\test{$
\relax [ 
\langle 
\langle 
\lceil 
1
\rceil 
,\linebreak [0] 
\lceil 
2
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
3
\rceil 
,\linebreak [0] 
\lceil 
6
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\stackrel{s}{=} 
\langle 
\langle 
\lceil 
2
\rceil 
,\linebreak [0] 
\lceil 
1
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
4
\rceil 
,\linebreak [0] 
\lceil 
3
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\relax ]^{-} $}%
%
\test{$
\relax [ 
\langle 
\langle 
\lceil 
1
\rceil 
,\linebreak [0] 
\lceil 
2
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
3
\rceil 
,\linebreak [0] 
\lceil 
4
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
6
\rceil 
\rangle 
\stackrel{s}{=} 
\langle 
\langle 
\lceil 
2
\rceil 
,\linebreak [0] 
\lceil 
1
\rceil 
\rangle 
,\linebreak [0] 
\langle 
\lceil 
4
\rceil 
,\linebreak [0] 
\lceil 
3
\rceil 
\rangle 
,\linebreak [0] 
\lceil 
5
\rceil 
\rangle 
\relax ]^{-} $}%



\subsubsection{Sequent operations}

Logiweb sequent calculus comprises twelve \index{sequent operation}\index{operation, sequent}\intro{sequent operations}. We shall refer to a term that is built up from these twelve operations as a \index{proof, sequent}\indexintro{sequent proof}. We shall say that a term $[
\mathsf {c}]$ is a \index{lemma, sequent}\intro{sequent lemma} if there exists a sequent proof which evaluates to $[
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
\mathsf {c}
\rangle ]$. In the tool makers analogy, the sequent $[
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
\mathsf {c}
\rangle ]$ represents the situation where $[
\mathsf {c}]$ has been forged and the backlogs of remaining work are empty.

We shall refer to a sequent operation as sequent-nulary, sequent-unary, or sequent-binary if it depends on zero, one, or two sequents, respectively. As an example, a binary operation that depends on one sequent and one non-sequent is sequent-unary. Logiweb sequent calculus comprises one sequent-nulary, ten sequent-unary, and one sequent-binary operation. The sole sequent-binary operation of Logiweb sequent calculus is the ``cut'' operation.

In the tool makers analogy, each sequent-unary operation corresponds to a work process such as moving a premise from anvil to storage room. The sequent-nulary operation is the starting point of any work process, and the sequent-binary operation allows to use the outcome of one work process as a tool in another process.



\subsubsection{Proof initiation}

The sequent-nulary operation
%
\index{I: $[
\mathsf{x}
{} ^ { I }]$ x init}%
%
\index{x init $[
\mathsf{x}
{} ^ { I }]$}%
%
\tex{$
[
\mathsf{x}
{} ^ { I }
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}I
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\mbox{''}
]$}%
%
$[
\mathsf{x}
{} ^ { I }]$%
%
performs the following operation:

\display{$[
\mathsf {a}
{} ^ { I }]$ evaluates to $[
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
\mathsf {a}
\vdash 
\mathsf {a}
\rangle ]$}

In section \ref{section:TheProofEvaluator} we introduce a ``proof evaluator'' which, given a sequent proof, computes the value of the proof. It is the proof evaluator that is going to evaluate $[
\mathsf {a}
{} ^ { I }]$ as shown above.

As an example of use, $[
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)]$ is a sequent lemma because $[
({\cal A}
\mathrel {\oplus} {\cal B}
)
{} ^ { I }]$ evaluates to $[
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\rangle ]$. In other words, $
\relax [ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
{} ^ { I }
\ proves\ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\relax ]^{\circ} $, where the ``proves'' predicate will be defined in Section \ref{section:LemmaVerification}.

The statement that

\display{$[
({\cal A}
\mathrel {\oplus} {\cal B}
)
{} ^ { I }]$ proves $[
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)]$}

is just an informal statement that the given sequent proof proves the given term. In contrast, the statement that

\display{$
\relax [ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
{} ^ { I }
\ proves\ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\relax ]^{\circ} $}

is a formal one that uses the formally defined $[
\mathsf{x}
\ proves\ 
\mathsf{y}]$ relation defined in Section \ref{section:LemmaVerification}. The latter statement makes Logiweb verify the claim formally.

The statement that

\display{$
\relax [ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
{} ^ { I }
\ proves\ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\relax ]^{\cdot} $}

also forces Logiweb to verify the claim formally, but if the claim turned out to fail, the user would merely get the information that that particular claim failed. If $[
\mathsf{x}]$ does not prove $[
\mathsf{y}]$ then $[
\mathsf{x}
\ proves\ 
\mathsf{y}]$ returns a term which, when typeset, explains why not. For that reason,

\display{$
\relax [ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
{} ^ { I }
\ proves\ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\relax ]^{\circ} $}

has the benefit that if the claim fails then the generated error message will be more precise.



\subsubsection{Inference introduction}

We overload $[
\mathsf{x}
\vdash 
\mathsf{y}]$ to denote both an operation on statements and a sequent operation. Ambiguity cannot occur since the proof evaluator will decide what $[
\mathsf{x}
\vdash 
\mathsf{y}]$ means on a case by case basis.

$[
\mathsf {a}
\vdash 
\mathsf {q}]$ is sequent-unary; it takes a premise $[
\mathsf {a}]$ and a sequent $[
\mathsf {q}]$ and moves the premise from storage room to anvil:

\display{$[
\mathsf {a}
\vdash 
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$ evaluates to $[
\langle 
\mathsf {p}
\backslash \{ 
\mathsf {a}
\}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {a}
\vdash 
\mathsf {c}
\rangle ]$}

Note that a premise can be moved from storage room to anvil even if there the premise was not present in the storage room to begin with. A premise may be seen as work to be done, and moving a premise that did not exist before corresponds to creation of work to be done from nothing.

As an example of use, $
\relax [ {\cal A}
\vdash {\cal B}
{} ^ { I }
\ proves\ {\cal A}
\vdash {\cal B}
\vdash {\cal B}
\relax ]^{\circ} $.



\subsubsection{Endorsement and quantifier introduction}

We also overload $[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}]$ and $[
\forall 
\mathsf{x}
\colon 
\mathsf{y}]$:

\display{$[
\mathsf {a}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
\backslash \{ 
\mathsf {a}
\}
,\linebreak [0] 
\mathsf {a}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf {c}
\rangle ]$}

\display{$[
\forall 
\mathsf{x}
\colon 
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\forall 
\mathsf{x}
\colon 
\mathsf {c}
\rangle ]$ if $[
\mathsf{x}]$ is a metavariable and is not free in $[
\mathsf {p}]$ and $[
\mathsf {s}]$}

As an example of use, $
\relax [ 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon {\cal A}
\vdash {\cal B}
{} ^ { I }
\ proves\ 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon {\cal A}
\vdash {\cal B}
\vdash {\cal B}
\relax ]^{\circ} $.



\subsubsection{Inference and endorsement elimination}

The operation
%
\index{\alpha x modus @\back $[
\mathsf{x}
{} ^ { \rhd }]$ x modus}%
%
\index{x modus $[
\mathsf{x}
{} ^ { \rhd }]$}%
%
\tex{$
[
\mathsf{x}
{} ^ { \rhd }
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}rhd
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\mbox{''}
]$}%
%
$[
\mathsf{x}
{} ^ { \rhd }]$%
%
eliminates an inference or endorsement:

\display{$[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {a}
\vdash 
\mathsf {c}
\rangle 
{} ^ { \rhd }]$ evaluates to $[
\langle 
\mathsf {p}
\cup \{ 
\mathsf {a}
\}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$}

\display{$[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {a}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf {c}
\rangle 
{} ^ { \rhd }]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
\cup \{ 
\mathsf {a}
\}
,\linebreak [0] 
\mathsf {c}
\rangle ]$}

As an example of use, $
\relax [ {\cal A}
\vdash {\cal B}
\vdash {\cal A}
{} ^ { I }
{} ^ { \rhd }
\ proves\ {\cal A}
\vdash {\cal B}
\vdash {\cal A}
\relax ]^{\circ} $.

We shall refer to $[
\mathsf{x}
{} ^ { \rhd }]$ as the \indexintro{modus} operation. As we shall see, the inference rule of \index{ponens, modus}\indexintro{modus ponens} will be implemented by the modus operation together with the cut operation described later: the modus operation is used for preparation whereas a cut is used for the actual execution.

Inferences can be eliminated by modus ponens whereas endorsements can be eliminated by either \index{probans, modus}\indexintro{modus probans} or \indexintro{verification}. Modus ponens says that if $[
\mathsf{x}
\vdash 
\mathsf{y}]$ and if we can prove $[
\mathsf{x}]$ then we positivily have $[
\mathsf{y}]$. Verification says that if $[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}]$ and if $[
\mathsf{x}]$ evaluates to $[
\mathsf {T}]$ then $[
\mathsf{y}]$ is verified. Modus probans says that if $[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}]$ and if we happen to know or assume that $[
\mathsf{x}]$ evaluates to $[
\mathsf {T}]$ then this knowledge approves $[
\mathsf{y}]$. The modus operation implements half of modus ponens or modus probans. Verification is treated in Section \ref{section:Verification}.



\subsubsection{Quantifier elimination}

The operation
%
\index{\alpha x at y @\back $[
\mathsf{x}
\mathop {\char64} 
\mathsf{y}]$ x at y}%
%
\index{x at y $[
\mathsf{x}
\mathop {\char64} 
\mathsf{y}]$}%
%
% \tex below uses \char64 instead of @ to avoid problems with makeindex
%
\tex{$
[
\mathsf{x}
\mathop {\char64} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathop
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}char64
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\mathop {\char64} 
\mathsf{y}]$%
%
eliminates a quantifer:

\display{$[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\forall 
\mathsf{x}
\colon 
\mathsf {c}
\rangle 
\mathop {\char64} 
\mathsf {a}]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\langle 
\mathsf {c}
\,{|}
\mathsf{x}
{:=}\,
\mathsf {a}
\rangle 
\rangle ]$ if $[
\mathsf{x}]$ is a metavariable and $[
\mathsf {a}]$ is free for $[
\mathsf{x}]$ in $[
\mathsf {c}]$}

As an example of use, $
\relax [ 
(
\forall {\cal A}
\colon {\cal A}
={\cal A}
)
\vdash 
(
\forall {\cal A}
\colon {\cal A}
={\cal A}
)
{} ^ { I }
{} ^ { \rhd }
\mathop {\char64} 
0
\ proves\ 
(
\forall {\cal A}
\colon {\cal A}
={\cal A}
)
\vdash 
0
=
0
\relax ]^{\circ} $.



\subsubsection{Verification}\label{section:Verification}

The operation
%
\index{V: $[
\mathsf{x}
{} ^ { V } ]$ x verify}%
%
\index{x verify $[
\mathsf{x}
{} ^ { V } ]$}%
%
\tex{$
[
\mathsf{x}
{} ^ { V } 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}V
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
$[
\mathsf{x}
{} ^ { V } ]$%
%
eliminates a side condition by evaluating it and seeing that it is true:

% This is a place where the base page differs from the official one:
\display{$[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {a}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf {b}
\rangle 
{} ^ { V } ]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {b}
\rangle ]$ if $[
{\cal U}^M(
{\cal E}(
\mathsf {a}
,
\mathsf {T}
,
\mathsf {c}
)
\mathbin {\mbox {`}}
\mathsf {c}
)]$ evaluates to $[
\mathsf {T}]$ where $[
\mathsf {c}]$ is the cache of the page on which the verification operation occurs}

As an example of use, $
\relax [ 
(
\forall {\cal A}
\colon 
{\cal T}( {\cal A}
)
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} {\cal A}
)
\vdash 
(
(
\forall {\cal A}
\colon 
{\cal T}( {\cal A}
)
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} {\cal A}
)
{} ^ { I }
{} ^ { \rhd }
\mathop {\char64} 
(
\mathsf {F}
\mathrel { {+} 2 \ast }
2
\approx 
5
)
)
{} ^ { V } 
\ proves\ 
(
\forall {\cal A}
\colon 
{\cal T}( {\cal A}
)
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} {\cal A}
)
\vdash 
\mathsf {F}
\mathrel { {+} 2 \ast }
2
\approx 
5
\relax ]^{\circ} $ where

%
\index{T @\back $[
{\cal T}( 
\mathsf{x}
)]$ computably true x end true}%
%
\index{computably true x end true $[
{\cal T}( 
\mathsf{x}
)]$}%
%
\tex{$
[
{\cal T}( 
\mathsf{x}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}T
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal T}( 
\mathsf{x}
)
\mathrel {\ddot {=}}
\lambda 
\mathsf {c}
.
{\cal U}^M(
{\cal E}(
\lceil 
\mathsf{x}
\rceil 
,
\mathsf {T}
,
\mathsf {c}
)
)
]$}
%
\test{$
\relax [ 
{\cal U}(
{\cal E}(
\lceil 
\mathsf {F}
\mathrel { {+} 2 \ast }
2
\approx 
5
\rceil 
,
\mathsf {T}
,
\mbox{self}
)
)
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
{\cal U}^M(
{\cal E}(
\lceil 
\mathsf {F}
\mathrel { {+} 2 \ast }
2
\approx 
5
\rceil 
,
\mathsf {T}
,
\mbox{self}
)
)
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
{\cal U}^M(
{\cal E}(
\lceil 
{\cal T}( 
\mathsf {F}
\mathrel { {+} 2 \ast }
2
\approx 
5
)
\rceil 
,
\mathsf {T}
,
\mbox{self}
)
\mathbin {\mbox {`}}
\mbox{self}
)
\relax ]^{\cdot} $}

In the example above, $[
\forall {\cal A}
\colon 
{\cal T}( {\cal A}
)
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} {\cal A}]$ is an axiom scheme that says that any term that evaluates to $[
\mathsf {T}]$ is provable.



\subsubsection{Currying}

The operations
%
\index{\alpha x curry plus @\back $[
\mathsf{x}
{} ^ { + } ]$ x curry plus}%
%
\index{x curry plus $[
\mathsf{x}
{} ^ { + } ]$}%
%
\tex{$
[
\mathsf{x}
{} ^ { + } 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
{+}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
$[
\mathsf{x}
{} ^ { + } ]$%
%
and
%
\index{\alpha x curry minus @\back $[
\mathsf{x}
{} ^ { - } ]$ x curry minus}%
%
\index{x curry minus $[
\mathsf{x}
{} ^ { - } ]$}%
%
\tex{$
[
\mathsf{x}
{} ^ { - } 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{-}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
$[
\mathsf{x}
{} ^ { - } ]$%
%
add and remove a $[
\mathrel {\oplus} ]$, respectively:

\display{$[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {a}
\vdash 
\mathsf {b}
\vdash 
\mathsf {c}
\rangle 
{} ^ { + } ]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
(
\mathsf {a}
\mathrel {\oplus} 
\mathsf {b}
)
\vdash 
\mathsf {c}
\rangle ]$}

\display{$[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
(
\mathsf {a}
\mathrel {\oplus} 
\mathsf {b}
)
\vdash 
\mathsf {c}
\rangle 
{} ^ { - } ]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {a}
\vdash 
\mathsf {b}
\vdash 
\mathsf {c}
\rangle ]$}

$[
\mathsf{x}
{} ^ { - } ]$ and $[
\mathsf{x}
{} ^ { + } ]$ are known as \indexintro{currying} and \indexintro{decurrying}, respectively.

As an example of use, $
\relax [ 
({\cal A}
\vdash {\cal B}
{} ^ { I }
)
{} ^ { + } 
\ proves\ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash {\cal B}
\relax ]^{\circ} $.

As another example, $
\relax [ 
({\cal A}
\mathrel {\oplus} {\cal B}
)
{} ^ { I }
{} ^ { - } 
\ proves\ {\cal A}
\vdash {\cal B}
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\relax ]^{\circ} $.



\subsubsection{Referencing and dereferencing}

The operations
%
\index{i.e.: $[
\mathsf{x}
\mathrel {i.e.} 
\mathsf{y}]$ x id est y}%
%
\index{x id est y $[
\mathsf{x}
\mathrel {i.e.} 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\mathrel {i.e.} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{i.e.
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
\mathrel {i.e.} 
\mathsf{y}]$%
%
and
%
\index{\alpha x dereference @\back $[
\mathsf{x}
{} ^ { \ast } ]$ x dereference}%
%
\index{x dereference $[
\mathsf{x}
{} ^ { \ast } ]$}%
%
\tex{$
[
\mathsf{x}
{} ^ { \ast } 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}ast
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
$[
\mathsf{x}
{} ^ { \ast } ]$%
%
change from term to name and vice versa, respectively:

\display{$[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle 
\mathrel {i.e.} 
\mathsf {n}]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {n}
\rangle ]$ if $[
\mathsf {c}]$ is the statement aspect of $[
\mathsf {n}]$}

\display{$[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {n}
\rangle 
{} ^ { \ast } ]$ evaluates to $[
\langle 
\mathsf {p}
,\linebreak [0] 
\mathsf {s}
,\linebreak [0] 
\mathsf {c}
\rangle ]$ where $[
\mathsf {c}]$ is the statement aspect of $[
\mathsf {n}]$}

We shall refer to $[
\mathsf{x}
\mathrel {i.e.} 
\mathsf{y}]$ and $[
\mathsf{x}
{} ^ { \ast } ]$ as \indexintro{referencing} and \indexintro{dereferencing}, respectively. The asterisk in $[
\mathsf{x}
{} ^ { \ast } ]$ is inspired by the C programming language.

As an example of use, $
\relax [ 
T'_{E}
\vdash 
T'_{E}
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
\ proves\ 
T'_{E}
\vdash 
(
HeadNil'
\mathrel {\oplus} 
HeadPair'
\mathrel {\oplus} 
Transitivity'
\mathrel {\oplus} 
Contra'
)
\relax ]^{\circ} $.

As another example, $
\relax [ 
(
HeadNil'
\mathrel {\oplus} 
HeadPair'
\mathrel {\oplus} 
Transitivity'
\mathrel {\oplus} 
Contra'
)
\vdash 
(
HeadNil'
\mathrel {\oplus} 
HeadPair'
\mathrel {\oplus} 
Transitivity'
\mathrel {\oplus} 
Contra'
)
{} ^ { I }
{} ^ { \rhd }
\mathrel {i.e.} 
T'_{E}
\ proves\ 
(
HeadNil'
\mathrel {\oplus} 
HeadPair'
\mathrel {\oplus} 
Transitivity'
\mathrel {\oplus} 
Contra'
)
\vdash 
T'_{E}
\relax ]^{\circ} $.



\subsubsection{The cut operation}

The sequent-binary operation
%
\index{\alpha x cut y @\back $[
\mathsf{x}
; 
\mathsf{y}]$ x cut y}%
%
\index{x cut y $[
\mathsf{x}
; 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
; 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline ;
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$[
\mathsf{x}
; 
\mathsf{y}]$%
%
is the well-known \indexintro{cut} operation. It satisfies:

\display{$[
\langle 
\mathsf {p}
_{
1
}
,\linebreak [0] 
\mathsf {s}
_{
1
}
,\linebreak [0] 
\mathsf {c}
_{
1
}
\rangle 
; 
\langle 
\mathsf {p}
_{
2
}
,\linebreak [0] 
\mathsf {s}
_{
2
}
,\linebreak [0] 
\mathsf {c}
_{
2
}
\rangle ]$ evaluates to $[
\langle 
\mathsf {p}
_{
1
}
\cup 
(
\mathsf {p}
_{
2
}
\backslash \{ 
\mathsf {c}
_{
1
}
\}
)
,\linebreak [0] 
\mathsf {s}
_{
1
}
\cup 
\mathsf {s}
_{
2
}
,\linebreak [0] 
\mathsf {c}
_{
2
}
\rangle ]$}

As an example of use, let
%
\index{Remainder @\back $[
Remainder]$}%
%
\tex{$
[
Remainder
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Remainder
\mbox{''}
]$}%
%
$[
Remainder]$%
%
denote all of $[
T'_{E}]$ except $[
HeadNil']$:

\display{$
[
Remainder
\mathrel {\ddot {=}}
HeadPair'
\mathrel {\oplus} 
Transitivity'
\mathrel {\oplus} 
Contra'
]$}

We have that

\display{$[
T'_{E}
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } ]$}

evaluates to

\display{$[
\langle 
T'_{E}
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
HeadNil'
\mathrel {\oplus} 
Remainder
\rangle ]$}

and that

\display{$[
(
HeadNil'
\vdash 
Remainder
\vdash 
HeadNil'
{} ^ { I }
)
{} ^ { + } 
{} ^ { \rhd }]$}

evaluates to

\display{$[
\langle 
HeadNil'
\mathrel {\oplus} 
Remainder
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
HeadNil'
\rangle ]$}

so

\display{$
\relax [ 
T'_{E}
\vdash 
(
T'_{E}
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
; 
(
HeadNil'
\vdash 
Remainder
\vdash 
HeadNil'
{} ^ { I }
{} ^ { \rhd }
)
{} ^ { + } 
{} ^ { \rhd }
)
\ proves\ 
T'_{E}
\vdash 
HeadNil'
\relax ]^{\circ} $.}

The lemma says that $[
HeadNil']$ is provable in $[
T'_{E}]$. In general, as one should expect, all rules of a theory are provable in the theory.



\subsubsection{Rule lemmas}

For a rule $[{\cal R}]$ of a theory $[{\cal T}]$ we shall refer to $[{\cal T}
\vdash {\cal R}]$ as the \index{lemma, rule}\indexintro{rule lemma} of $[{\cal R}]$.

In proofs, one constantly needs rule lemmas. Hence, as soon as one has defined a theory it is convenient to prove the rule lemma of each rule. Once that is done one can forget about the rules and use the rule lemmas instead.

For that reason, one should not waste good names on rules; one should reserve good names for rule lemmas.



\subsection{Implementation of the twelve sequent operations}

Sequent evaluators for the twelve individual sequent operations of Logiweb sequent calculus are defined in the following sections. See Section \ref{section:SequentCalculus} for explanations of what each operation does.



\subsubsection{Evaluation of the init operation}

\index{S: $[
{\cal S}^{I}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval init x term y end eval}%
%
\index{seqeval init x term y end eval $[
{\cal S}^{I}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{I}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{I
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{I}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
\mathsf {t}
\mbox {-color}( 
\mathsf {t}
{}^{1}
\vdash 
\mathsf {t}
{}^{1}
)
\rangle 
]$%
%
}



\subsubsection{Evaluation of the modus operation}

\index{S: $[
{\cal S}^{\rhd}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval modus x term y end eval}%
%
\index{seqeval modus x term y end eval $[
{\cal S}^{\rhd}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{\rhd}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{
\mbox {$\backslash $}rhd
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{\rhd}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{\rhd}(
\mathsf {c}
, 
\mathsf {t}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{1}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{1}^{\rhd}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ seqeval modus one x term y sequent z end eval}%
%
\index{seqeval modus one x term y sequent z end eval $[
{\cal S}_{1}^{\rhd}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{\rhd}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{
\mbox {$\backslash $}rhd
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{\rhd}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {q}
{}^{2}
\stackrel{r}{=} 
\lceil 
\ast 
\vdash 
\ast 
\rceil 
\ {\bf then} \ 
\langle 
\mathsf {q}
{}^{0}
\cup \{ 
\mathsf {q}
{}^{2}
{}^{1}
\}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {q}
{}^{2}
{}^{2}
\rangle 
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {q}
{}^{2}
\stackrel{r}{=} 
\lceil 
\ast 
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\ast 
\rceil 
\ {\bf then} \ 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
\cup \{ 
\mathsf {q}
{}^{2}
{}^{1}
\}
,\linebreak [0] 
\mathsf {q}
{}^{2}
{}^{2}
\rangle 
\ {\bf else} \ 
\newline 
error(
\mbox{``}The
\linebreak [0]\ \hskip0em plus2.0em{}modus
\linebreak [0]\ \hskip0em plus2.0em{}operation
\linebreak [0]\ \hskip0em plus2.0em{}requires
\linebreak [0]\ \hskip0em plus2.0em{}the
\linebreak [0]\ \hskip0em plus2.0em{}conclusion
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}its
\linebreak [0]\ \hskip0em plus2.0em{}argument
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}be
\linebreak [0]\ \hskip0em plus2.0em{}an
\linebreak [0]\ \hskip0em plus2.0em{}inference
\linebreak [0]\ \hskip0em plus2.0em{}or
\linebreak [0]\ \hskip0em plus2.0em{}an
\linebreak [0]\ \hskip0em plus2.0em{}endorsement
\mbox{''}
,
\mathsf {t}
)
]$%
%
}%
%
\test{$
\relax [ 
{\cal S}(
\mbox{self}
, 
\lceil {\cal A}
{} ^ { I }
{} ^ { \rhd }
\rceil 
)
\stackrel{s}{=} 
\langle 
\langle 
\lceil {\cal A}
\rceil 
\rangle 
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
\lceil {\cal A}
\rceil 
\rangle 
\relax ]^{\cdot} $}



\subsubsection{Evaluation of the verify operation}

\index{S: $[
{\cal S}^{E}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval verify x term y end eval}%
%
\index{seqeval verify x term y end eval $[
{\cal S}^{E}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{E}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{E
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{E}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{E}(
\mathsf {c}
, 
\mathsf {t}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{1}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{1}^{E}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ seqeval verify one x term y sequent z end eval}%
%
\index{seqeval verify one x term y sequent z end eval $[
{\cal S}_{1}^{E}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{E}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{E
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{E}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {q}
{}^{2}
\stackrel{r}{=} 
\lceil 
\ast 
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\ast 
\rceil 
\ {\bf then} \ 
error(
\mbox{``}The
\linebreak [0]\ \hskip0em plus2.0em{}verify
\linebreak [0]\ \hskip0em plus2.0em{}operation
\linebreak [0]\ \hskip0em plus2.0em{}requires
\linebreak [0]\ \hskip0em plus2.0em{}the
\linebreak [0]\ \hskip0em plus2.0em{}conclusion
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}its
\linebreak [0]\ \hskip0em plus2.0em{}argument
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}be
\linebreak [0]\ \hskip0em plus2.0em{}an
\linebreak [0]\ \hskip0em plus2.0em{}endorsement
{:}
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\cal U}^M(
{\cal E}(
\mathsf {q}
{}^{2}
{}^{1}
,
\mathsf {T}
,
\mathsf {c}
)
\mathbin {\mbox {`}}
\mathsf {c}
)
\ {\bf then} \ 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {q}
{}^{2}
{}^{2}
\rangle 
\ {\bf else} \ 
\newline 
error(
\mbox{``}False
\linebreak [0]\ \hskip0em plus2.0em{}side
\linebreak [0]\ \hskip0em plus2.0em{}condition
{:}
\mbox{''}
,
\mathsf {t}
)
]$%
%
}



\subsubsection{Evaluation of the decurrying operation}

\index{S: $[
{\cal S}^{+}(
\mathsf{x}
, 
\mathsf{y}
)]$ sequent eval plus x term y end eval}%
%
\index{sequent eval plus x term y end eval $[
{\cal S}^{+}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{+}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{
{+}
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{+}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{+}(
\mathsf {c}
, 
\mathsf {t}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{1}
)
)
]$%
}

\index{S: $[
{\cal S}_{1}^{+}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ seqeval plus one x term y sequent z end eval}%
%
\index{seqeval plus one x term y sequent z end eval $[
{\cal S}_{1}^{+}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{+}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{
{+}
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{+}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {q}
{}^{2}
\stackrel{r}{=} 
\lceil 
\ast 
\vdash 
\ast 
\rceil 
\wedge 
\mathsf {q}
{}^{2}
{}^{2}
\stackrel{r}{=} 
\lceil 
\ast 
\vdash 
\ast 
\rceil 
\ {\bf then} \ 
\newline 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {t}
\mbox {-color}( 
(
\mathsf {q}
{}^{2}
{}^{1}
\mathrel {\oplus} 
\mathsf {q}
{}^{2}
{}^{2}
{}^{1}
)
\vdash 
\mathsf {q}
{}^{2}
{}^{2}
{}^{2}
)
\rangle 
\ {\bf else} \ 
\newline 
error(
\mbox{``}Term;conclusion
\linebreak [0]\ \hskip0em plus2.0em{}not
\linebreak [0]\ \hskip0em plus2.0em{}fit
\linebreak [0]\ \hskip0em plus2.0em{}for
\linebreak [0]\ \hskip0em plus2.0em{}decurrying
{:}
\mbox{''}
,
\mathsf {t}
; 
\mathsf {q}
{}^{2}
)
]$%
%
}



\subsubsection{Evaluation of the currying operation}

\index{S: $[
{\cal S}^{-}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval minus x term y end eval}%
%
\index{seqeval minus x term y end eval $[
{\cal S}^{-}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{-}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{
\mbox{-}
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{-}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{-}(
\mathsf {c}
, 
\mathsf {t}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{1}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{1}^{-}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ seqeval minus one x term y sequent z end eval}%
%
\index{seqeval minus one x term y sequent z end eval $[
{\cal S}_{1}^{-}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{-}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{
\mbox{-}
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{-}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {q}
{}^{2}
\stackrel{r}{=} 
\lceil 
\ast 
\vdash 
\ast 
\rceil 
\wedge 
\mathsf {q}
{}^{2}
{}^{1}
\stackrel{r}{=} 
\lceil 
\ast 
\mathrel {\oplus} 
\ast 
\rceil 
\ {\bf then} \ 
\newline 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {t}
\mbox {-color}( 
\mathsf {q}
{}^{2}
{}^{1}
{}^{1}
\vdash 
\mathsf {q}
{}^{2}
{}^{1}
{}^{2}
\vdash 
\mathsf {q}
{}^{2}
{}^{2}
)
\rangle 
\ {\bf else} \ 
\newline 
error(
\mbox{``}Term;conclusion
\linebreak [0]\ \hskip0em plus2.0em{}not
\linebreak [0]\ \hskip0em plus2.0em{}fit
\linebreak [0]\ \hskip0em plus2.0em{}for
\linebreak [0]\ \hskip0em plus2.0em{}decurrying
{:}
\mbox{''}
,
\mathsf {t}
; 
\mathsf {q}
{}^{2}
)
]$%
%
}



\subsubsection{Evaluation of the dereferencing operation}

\index{S: $[
{\cal S}^{\ast}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval deref x term y end eval}%
%
\index{seqeval deref x term y end eval $[
{\cal S}^{\ast}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{\ast}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{
\mbox {$\backslash $}ast
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{\ast}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{\ast}(
\mathsf {c}
, 
\mathsf {t}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{1}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{1}^{\ast}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ seqeval deref one x term y sequent z end eval}%
%
\index{seqeval deref one x term y sequent z end eval $[
{\cal S}_{1}^{\ast}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{\ast}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{
\mbox {$\backslash $}ast
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{\ast}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\cal S}_{2}^{\ast}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
, 
\mathbf{aspect}( 
{<}stmt{>}
, 
\mathsf {q}
{}^{2}
, 
\mathsf {c}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{2}^{\ast}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$ seqeval deref two x term y sequent z def u end eval}%
%
\index{seqeval deref two x term y sequent z def u end eval $[
{\cal S}_{2}^{\ast}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$}%
%
\tex{$
[
{\cal S}_{2}^{\ast}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
, 
\mathsf {d}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{2
\}
{\char94}
\{
\mbox {$\backslash $}ast
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{2}^{\ast}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
, 
\mathsf {d}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\mathsf {q}
!
\newline 
{\bf if} \ 
\mathsf {d}
\ {\bf then} \ 
error(
\mbox{``}Dereferencing
\linebreak [0]\ \hskip0em plus2.0em{}construct
\linebreak [0]\ \hskip0em plus2.0em{}that
\linebreak [0]\ \hskip0em plus2.0em{}has
\linebreak [0]\ \hskip0em plus2.0em{}no
\linebreak [0]\ \hskip0em plus2.0em{}statement
\linebreak [0]\ \hskip0em plus2.0em{}def
{:}
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\newline 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {d}
{}^{3}
\rangle 
]$%
%
}



\subsubsection{Evaluation of quantifier elimination}

\index{S: $[
{\cal S}^{\char64}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval at x term y end eval}%
%
\index{seqeval at x term y end eval $[
{\cal S}^{\char64}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{\char64}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{
\mbox {$\backslash $}char64
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{\char64}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{\char64}(
\mathsf {c}
, 
\mathsf {t}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{1}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{1}^{\char64}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ seqeval at one x term y sequent x end eval}%
%
\index{seqeval at one x term y sequent z end eval $[
{\cal S}_{1}^{\char64}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{\char64}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{
\mbox {$\backslash $}char64
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{\char64}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {q}
{}^{2}
\stackrel{r}{=} 
\lceil 
\forall 
\ast 
\colon 
\ast 
\rceil 
\ {\bf then} \ 
error(
\mbox{``}Quantifier
\linebreak [0]\ \hskip0em plus2.0em{}elimination
\linebreak [0]\ \hskip0em plus2.0em{}requires
\linebreak [0]\ \hskip0em plus2.0em{}the
\linebreak [0]\ \hskip0em plus2.0em{}conclusion
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}its
\linebreak [0]\ \hskip0em plus2.0em{}argument
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}be
\linebreak [0]\ \hskip0em plus2.0em{}a
\linebreak [0]\ \hskip0em plus2.0em{}quantifier
{:}
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {t}
{}^{2}
\mathrel {free\ for} 
\mathsf {q}
{}^{2}
{}^{1}
\mathrel {in} 
\mathsf {q}
{}^{2}
{}^{2}
\ {\bf then} \ 
error(
\mbox{``}Quantifier
\linebreak [0]\ \hskip0em plus2.0em{}elimination
\linebreak [0]\ \hskip0em plus2.0em{}leads
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}variable
\linebreak [0]\ \hskip0em plus2.0em{}clash
{:}
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\newline 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\langle 
\mathsf {q}
{}^{2}
{}^{2}
\,{\protect\vert}
\mathsf {q}
{}^{2}
{}^{1}
{:=}\,
\mathsf {t}
{}^{2}
\rangle 
\rangle 
]$%
}



\subsubsection{Evaluation of inference introduction}

\index{S: $[
{\cal S}^{\vdash}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval infer x term y end eval}%
%
\index{seqeval infer x term y end eval $[
{\cal S}^{\vdash}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{\vdash}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{
\mbox {$\backslash $}vdash
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{\vdash}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{\vdash}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {t}
{}^{1}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{2}
)
)
]$%
}

\index{S: $[
{\cal S}_{1}^{\vdash}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$ seqeval infer one x term y premise z sequent u end eval}%
%
\index{seqeval infer one x term y premise z sequent u end eval $[
{\cal S}_{1}^{\vdash}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{\vdash}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{
\mbox {$\backslash $}vdash
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{\vdash}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {p}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\mathsf {p}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
\langle 
\mathsf {q}
{}^{0}
\backslash \{ 
\mathsf {p}
\}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {t}
\mbox {-color}( 
\mathsf {p}
\vdash 
\mathsf {q}
{}^{2}
)
\rangle 
]$%
%
}



\subsubsection{Evaluation of endorsement introduction}

\index{S: $[
{\cal S}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval endorse x term y end eval}%
%
\index{seqeval endorse x term y end eval $[
{\cal S}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\mbox {$\backslash $}scriptsize
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\mbox {$\backslash $}vdash
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\}
\mbox {$\backslash $},
\{
\mbox {$\backslash $}vdash
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {t}
{}^{1}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{2}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{1}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$ seqeval endorse one x term y side z sequent u end eval}%
%
\index{seqeval endorse one x term y side z sequent u end eval $[
{\cal S}_{1}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\mbox {$\backslash $}scriptsize
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\mbox {$\backslash $}vdash
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\}
\mbox {$\backslash $},
\{
\mbox {$\backslash $}vdash
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {p}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\mathsf {p}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
\backslash \{ 
\mathsf {p}
\}
,\linebreak [0] 
\mathsf {t}
\mbox {-color}( 
\mathsf {p}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf {q}
{}^{2}
)
\rangle 
]$%
%
}



\subsubsection{Evaluation of the referencing operation}

\index{S: $[
{\cal S}^{i.e.}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval est x term y end eval}%
%
\index{seqeval est x term y end eval $[
{\cal S}^{i.e.}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{i.e.}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{i.e.
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{i.e.}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{i.e.}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {t}
{}^{2}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{1}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{1}^{i.e.}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$ seqeval est one x term y name z sequent u end eval}%
%
\index{seqeval est one x term y name z sequent u end eval $[
{\cal S}_{1}^{i.e.}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{i.e.}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{i.e.
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{i.e.}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {a}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\mathsf {a}
!
\newline 
\mathrm {If}(
\mathsf {q}
{} ^ { E }
,\linebreak [0]
\mathsf {q}
,\linebreak [0]
{\cal S}_{2}^{i.e.}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {a}
, 
\mathsf {q}
, 
\mathbf{aspect}( 
{<}stmt{>}
, 
\mathsf {a}
, 
\mathsf {c}
)
)
)
]$%
%
}

\index{S: $[
{\cal S}_{2}^{i.e.}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
, 
\mathsf {v}
)]$ seqeval est two x term y name z sequent u def v end eval}%
%
\index{seqeval est two x term y name z sequent u def v end eval $[
{\cal S}_{2}^{i.e.}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
, 
\mathsf {v}
)]$}%
%
\tex{$
[
{\cal S}_{2}^{i.e.}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {a}
, 
\mathsf {q}
, 
\mathsf {d}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{2
\}
{\char94}
\{i.e.
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#5.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{2}^{i.e.}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {a}
, 
\mathsf {q}
, 
\mathsf {d}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\mathsf {a}
!
\mathsf {q}
!
\newline 
{\bf if} \ 
\mathsf {d}
\ {\bf then} \ 
error(
\mbox{``}Referencing
\linebreak [0]\ \hskip0em plus2.0em{}construct
\linebreak [0]\ \hskip0em plus2.0em{}that
\linebreak [0]\ \hskip0em plus2.0em{}has
\linebreak [0]\ \hskip0em plus2.0em{}no
\linebreak [0]\ \hskip0em plus2.0em{}statement
\linebreak [0]\ \hskip0em plus2.0em{}def
{:}
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {d}
{}^{3}
\stackrel {t}{=}
\mathsf {q}
{}^{2}
\ {\bf then} \ 
error(
\mbox{``}Reference;conclusion
\linebreak [0]\ \hskip0em plus2.0em{}do
\linebreak [0]\ \hskip0em plus2.0em{}not
\linebreak [0]\ \hskip0em plus2.0em{}match
{:}
\mbox{''}
,
\mathsf {a}
; 
\mathsf {q}
{}^{2}
)
\ {\bf else} \ 
\newline 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {a}
\rangle 
]$%
%
}



\subsubsection{Evaluation of quantifier introduction}

\index{S: $[
{\cal S}^{\forall}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval all x term y end eval}%
%
\index{seqeval all x term y end eval $[
{\cal S}^{\forall}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{\forall}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{
\mbox {$\backslash $}forall
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{\forall}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{\forall}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {t}
{}^{1}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{2}
)
)
]$%
%
}

\index{S: $[
{\cal S}_{1}^{\forall}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$ seqeval all one x term y variable z sequent u end eval}%
%
\index{seqeval all one x term y variable z sequent u end eval $[
{\cal S}_{1}^{\forall}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{\forall}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {v}
, 
\mathsf {q}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{
\mbox {$\backslash $}forall
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{\forall}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {v}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\mathsf {v}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {v}
{} ^ {\cal V}
\ {\bf then} \ 
error(
\mbox{``}Metageneralization
\linebreak [0]\ \hskip0em plus2.0em{}over
\linebreak [0]\ \hskip0em plus2.0em{}non
\mbox{-}metavariable
{:}
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {v}
\mathrel {free\ in} 
\mathsf {q}
{}^{0}
\ {\bf then} \ 
error(
\mbox{``}Metageneralization
\linebreak [0]\ \hskip0em plus2.0em{}over
\linebreak [0]\ \hskip0em plus2.0em{}metavariable
\linebreak [0]\ \hskip0em plus2.0em{}that
\linebreak [0]\ \hskip0em plus2.0em{}occurs
\linebreak [0]\ \hskip0em plus2.0em{}free
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}some
\linebreak [0]\ \hskip0em plus2.0em{}premise
{:}
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {v}
\mathrel {free\ in} 
\mathsf {q}
{}^{1}
\ {\bf then} \ 
error(
\mbox{``}Metageneralization
\linebreak [0]\ \hskip0em plus2.0em{}over
\linebreak [0]\ \hskip0em plus2.0em{}metavariable
\linebreak [0]\ \hskip0em plus2.0em{}that
\linebreak [0]\ \hskip0em plus2.0em{}occurs
\linebreak [0]\ \hskip0em plus2.0em{}free
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}some
\linebreak [0]\ \hskip0em plus2.0em{}side
\linebreak [0]\ \hskip0em plus2.0em{}condition
{:}
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\newline 
\langle 
\mathsf {q}
{}^{0}
,\linebreak [0] 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {t}
\mbox {-color}( 
\forall 
\mathsf {v}
\colon 
\mathsf {q}
{}^{2}
)
\rangle 
]$%
}



\subsubsection{Evaluation of the cut operation}

\index{S: $[
{\cal S}^{;}(
\mathsf{x}
, 
\mathsf{y}
)]$ seqeval cut x term y end eval}%
%
\index{seqeval cut x term y end eval $[
{\cal S}^{;}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}^{;}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
{\char94}
\{;
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}^{;}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
{\cal S}_{1}^{;}(
\mathsf {c}
, 
\mathsf {t}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{1}
)
)
]$%
}

\index{S: $[
{\cal S}_{1}^{;}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ seqeval cut one x term y forerunner z end eval}%
%
\index{seqeval cut one x term y forerunner z end eval $[
{\cal S}_{1}^{;}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$}%
%
\tex{$
[
{\cal S}_{1}^{;}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{1
\}
{\char94}
\{;
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{1}^{;}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {p}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\newline 
\mathrm {If}(
\mathsf {p}
{} ^ { E }
,\linebreak [0]
\mathsf {p}
,\linebreak [0]
{\cal S}_{2}^{;}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {p}
, 
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
{}^{2}
)
)
)
]$%
%
}

\index{S: $[
{\cal S}_{2}^{;}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$ seqeval cut two x term y sequent u end eval}%
%
\index{seqeval cut two x term y forerunner z sequent u end eval $[
{\cal S}_{2}^{;}(
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {u}
)]$}%
%
\tex{$
[
{\cal S}_{2}^{;}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {p}
, 
\mathsf {q}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}
\_
\{2
\}
{\char94}
\{;
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}_{2}^{;}(
\mathsf {c}
, 
\mathsf {t}
, 
\mathsf {p}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {t}
!
\mathsf {p}
!
\newline 
\mathrm {If}(
\mathsf {q}
{} ^ { E }
,\linebreak [0]
\mathsf {q}
,\linebreak [0]
\langle 
\mathsf {p}
{}^{0}
\cup 
(
\mathsf {q}
{}^{0}
\backslash \{ 
\mathsf {p}
{}^{2}
\}
)
,\linebreak [0] 
\mathsf {p}
{}^{1}
\cup 
\mathsf {q}
{}^{1}
,\linebreak [0] 
\mathsf {q}
{}^{2}
\rangle 
)
]$%
}



\subsection{The proof evaluator}\label{section:TheProofEvaluator}

\subsubsection{Coloring}

$[
\mathsf{x}
\vdash 
\mathsf{y}]$ is self-evaluating. For that reason, $[
\lceil 
\mathsf{x}
\rceil 
\vdash 
\lceil 
\mathsf{y}
\rceil ]$ and $[
\lceil 
\mathsf{x}
\vdash 
\mathsf{y}
\rceil ]$ are equal terms except for debugging information.

The debugging information of the root of $[
\lceil 
\mathsf{x}
\rceil 
\vdash 
\lceil 
\mathsf{y}
\rceil ]$ equals $[
\mathsf {T}]$ which represents no debugging information. For that reason we shall call the root \indexintro{uncolored}.

Proper debugging information comprises a list of cardinals where the last cardinal in the list is the reference of the page on which the given node occurs. Hence, proper debugging information always differs from $[
\mathsf {T}]$. We shall refer to nodes whose debugging information differs from $[
\mathsf {T}]$ as \indexintro{colored}.

Whenever terms are generated using self-evaluating constructs, there will be uncolored nodes near the root of the generated term. The binary $[
\mathsf {a}
\mbox {-color}( 
\mathsf {t}
)]$ operation returns the term $[
\mathsf {t}]$ but copies the debugging information from the root of $[
\mathsf {a}]$ into uncolored nodes of $[
\mathsf {t}]$. We shall refer to this artistic touch as \indexintro{coloring}.

The coloring operation merely descends into the tree until it meets nodes with proper debugging information, so the operation will miss uncolored nodes hidden deeply inside the tree.

The coloring operation is defined thus:

\index{color: $[
\mathsf{x}
\mbox {-color}( 
\mathsf{y}
)]$ x color y end color}%
%
\index{x color y end color $[
\mathsf{x}
\mbox {-color}( 
\mathsf{y}
)]$}%
%
\tex{$
[
\mathsf{x}
\mbox {-color}( 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox{-}color
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
\mathsf {a}
\mbox {-color}( 
\mathsf {t}
)
\mathrel {\dot {=}}
\mathsf {t}
{}^{d}
\left\{\protect \begin {array}{l}
(
\mathsf {t}
{}^{r}
\mathrel { : \, : }
\mathsf {t}
{}^{i}
\mathrel { : \, : }
\mathsf {a}
{}^{d}
)
\mathrel { : \, : }
\mathsf {a}
\mbox {-color}^{\ast}( 
\mathsf {t}
{}^t
)
\\
\mathsf {a}
!
\mathsf {t}
\protect \end {array}\right.
]$%
}

\index{color*: $[
\mathsf{x}
\mbox {-color}^{\ast}( 
\mathsf{y}
)]$ x color star y end color}%
%
\index{x color star y end color $[
\mathsf{x}
\mbox {-color}^{\ast}( 
\mathsf{y}
)]$}%
%
\tex{$
[
\mathsf{x}
\mbox {-color}^{\ast}( 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox{-}color
\}
{\char94}
\{
\mbox {$\backslash $}ast
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
\mathsf {a}
\mbox {-color}^{\ast}( 
\mathsf {t}
)
\mathrel {\dot {=}}
\mathsf {t}
\left\{\protect \begin {array}{l}
\mathsf {a}
!
\mathsf {T}
\\
\mathsf {a}
\mbox {-color}( 
\mathsf {t}
{}^h
)
\mathrel { : \, : }
\mathsf {a}
\mbox {-color}^{\ast}( 
\mathsf {t}
{}^t
)
\protect \end {array}\right.
]$%
}%
%
\test{$
\relax [ 
\lceil 
2
\rceil 
\mbox {-color}( 
\lceil 
3
\rceil 
\vdash 
\lceil 
4
\rceil 
)
\stackrel {t}{=}
\lceil 
3
\vdash 
4
\rceil 
\relax ]^{\cdot} $}



\subsubsection{Error message generation}

The following macro expands into a construct that returns an error message. The first argument is supposed to be a string and the value of the second is supposed to be a term.

When used, the construct generates an error message consisting of the string followed by a newline followed by the term, which is of course rather limited. Whenever it is convenient to include more than one term in a message we take the rather crude approach to combine the messages by the cut operation! The cut operation is self-evaluating and, when typeset, puts a semicolon between its arguments, which is close to tolerable.

The error generation macro simply quotes the string argument and leaves the actual generation of the error message to an auxiliary function:

\index{error @\back $[
error(
\mathsf {m}
,
\mathsf {t}
)]$ error x term y end error}%
%
\tex{$
[
error(
\mathsf {m}
,
\mathsf {t}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline error(
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ,
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
error(
\mathsf {m}
,
\mathsf {t}
)
\mathrel {\ddot {=}}
error_{2}(
\lceil 
\mathsf {m}
\rceil 
,
\mathsf {t}
)
]$%
}

The following function generates an error message from a message $[
\mathsf {m}]$ and a term $[
\mathsf {t}]$.

$[
\mathsf {m}]$ is supposed to be a unicode string with a unicode start of text in the root. That start of text character is removed by computing $[
\mathsf {m}
{}^{1}]$ to drop the ``double quotes'' from the string, but a $[
(
\mathsf{x}
)^{\bf t}]$ ensures that the unquoted string is still typeset as a string eventually.

The text is glued together with a string that merely contains a newline character and which is treated similarly. Furthermore, the text plus newline character are glued together with the term $[
\mathsf {t}]$.

The text, newline character, and term are glued together with the $[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}]$. The $[
(
\mathsf{x}
)^{\bf t}]$ and $[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}]$ are invisible when typeset using their tex aspects and, hence, do not exhibit themselves in the final error message. These two constructs are visible in the right hand side of the definition below and in several places above because they are made visible using $[
( 
\mathsf{x}
)^{\bf v}]$.

A $[
\mathsf {t}
\mbox {-color}( 
\mathsf{x}
)]$ copies the debugging information in the root of $[
\mathsf {t}]$ to nodes in the error message that are generated by $[
(
\mathsf{x}
)^{\bf t}]$ and $[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}]$ and have no debugging information of their own. The definition reads:

\index{error two @\back $[
error_{2}(
\mathsf {m}
,
\mathsf {t}
)]$ error two x term y end error}%
%
\tex{$
[
error_{2}(
\mathsf {m}
,
\mathsf {t}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline error
\_
\{2
\}(
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ,
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
error_{2}(
\mathsf {m}
,
\mathsf {t}
)
\mathrel {\dot {=}}
\mathsf {t}
\mbox {-color}( 
(
\mathsf {m}
{}^{1}
)^{\bf t}
\mathrel{\mathrm{,}}
(
\lceil 
\mbox{``}
\newline 
\mbox{''}
\rceil 
{}^{1}
)^{\bf t}
\mathrel{\mathrm{,}}
\mathsf {t}
)
]$%
}



\subsubsection{Error recognition}

The sequent evaluator returns a sequent or an error message. For obvious reasons, we shall need the ability to tell whether a return value is the one or the other.

Error messages are terms that can be typeset by the Logiweb system. When recognizing error messages, we assume that they are generated by the error message generator of the previous section or similar means that put a $[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}]$ operator in the root of the message. That particular operator is harmless to have in the root of error messages because typesetting of $[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}]$ results in $[
\mathsf{x}]$ and $[
\mathsf{y}]$ being typeset and then concatenated. Note that $[
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}]$ above reads $[
( 
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}
)^{\bf v}]$ in the source of the present page, otherwise the comma would have been invisible as in $[
\mathsf{x}
\mathsf{y}]$.

The predicate below is true if the argument is an error message and false if the argument is a sequent. It is also false in many other cases as we shall benefit from later.

\index{E: $[
\mathsf{x}
{} ^ { E }]$ x is error}%
%
\index{x is error $[
\mathsf{x}
{} ^ { E }]$}%
%
\tex{$
[
\mathsf{x}
{} ^ { E }
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
\linebreak [0]\ \hskip0em plus2.0em{}
{\char94}
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}E
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
{} ^ { E }
\mathrel {\dot {=}}
\mathsf{x}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\mathrel{\mathrm{,}}
\mathsf{y}
\rceil 
]$%
%
}



\subsubsection{Sequent evaluation}

The sequent evaluation function $[
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
)]$ evaluates the sequent proof $[
\mathsf {t}]$ in the context defined by the cache $[
\mathsf {c}]$. The result is a sequent or an error message. If it is a sequent, then the proof is valid and the sequent is the conclusion of the proof.

The sequent evaluation function recognises the twelve sequent operations of Logiweb sequent calculus and turns against any other operations in $[
\mathsf {t}]$.

\index{S: $[
{\cal S}(
\mathsf{x}
, 
\mathsf{y}
)]$ sequent eval x term y end eval}%
%
\index{sequent eval x term y end eval $[
{\cal S}(
\mathsf{x}
, 
\mathsf{y}
)]$}%
%
\tex{$
[
{\cal S}(
\mathsf{x}
, 
\mathsf{y}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}S
\}(
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\newline 
{\bf if} \ 
\mathsf {t}
{} ^ { E }
\ {\bf then} \ 
\mathsf {t}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
{} ^ { I }
\rceil 
\ {\bf then} \ 
{\cal S}^{I}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
{} ^ { \rhd }
\rceil 
\ {\bf then} \ 
{\cal S}^{\rhd}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
{} ^ { V } 
\rceil 
\ {\bf then} \ 
{\cal S}^{E}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
{} ^ { + } 
\rceil 
\ {\bf then} \ 
{\cal S}^{+}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
{} ^ { - } 
\rceil 
\ {\bf then} \ 
{\cal S}^{-}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
{} ^ { \ast } 
\rceil 
\ {\bf then} \ 
{\cal S}^{\ast}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
\mathop {\char64} 
\ast 
\rceil 
\ {\bf then} \ 
{\cal S}^{\char64}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
\vdash 
\ast 
\rceil 
\ {\bf then} \ 
{\cal S}^{\vdash}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\ast 
\rceil 
\ {\bf then} \ 
{\cal S}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
\mathrel {i.e.} 
\ast 
\rceil 
\ {\bf then} \ 
{\cal S}^{i.e.}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\forall 
\ast 
\colon 
\ast 
\rceil 
\ {\bf then} \ 
{\cal S}^{\forall}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\ast 
; 
\ast 
\rceil 
\ {\bf then} \ 
{\cal S}^{;}(
\mathsf {c}
, 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
error(
\mbox{``}Unknown
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}operator
{:}
\mbox{''}
,
\mathsf {t}
)
]$%
}%
%
\test{$
\relax [ 
{\cal S}(
\mbox{self}
, 
\lceil 
({\cal A}
\mathrel {\oplus} {\cal B}
)
{} ^ { I }
\rceil 
)
\stackrel{s}{=} 
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
\lceil 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\vdash 
({\cal A}
\mathrel {\oplus} {\cal B}
)
\rceil 
\rangle 
\relax ]^{\cdot} $}%
%
\test{$
\relax [ 
{\cal S}(
\mbox{self}
, 
\lceil {\cal A}
\vdash {\cal B}
{} ^ { I }
\rceil 
)
\stackrel{s}{=} 
\langle 
\emptyset 
,\linebreak [0] 
\emptyset 
,\linebreak [0] 
\lceil {\cal A}
\vdash {\cal B}
\vdash {\cal B}
\rceil 
\rangle 
\relax ]^{\cdot} $}



\subsubsection{Lemma verification}\label{section:LemmaVerification}

The macro $[
\mathsf {p}
\ proves\ 
\mathsf {t}]$ claims that $[
\mathsf {p}]$ proves $[
\mathsf {t}]$: 

%
\index{proves: $
\mathsf{x}
\ proves\ 
\mathsf{y}$ x proves y}%
%
\index{x proves y: $
\mathsf{x}
\ proves\ 
\mathsf{y}$}%
%
\tex{$
[
\mathsf {p}
\ proves\ 
\mathsf {t}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}proves
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf {p}
\ proves\ 
\mathsf {t}
\mathrel {\ddot {=}}
proof( 
\lceil 
\mathsf {p}
\rceil 
, 
\lceil 
\mathsf {t}
\rceil 
, 
\mbox{self}
)
]$%
}

As an example, the following verifies $[
2
\vdash 
2]$:

\display{$
\relax [ 
2
{} ^ { I }
\ proves\ 
2
\vdash 
2
\relax ]^{\circ} $}

Perturbing the conclusion to e.g.\ $[
2
\vdash 
3]$ provokes the diagnose aspect of the page symbol to be set to a term which, if typeset using the tex aspect, generates an appropriate error message.

$[
proof( 
\mathsf {p}
, 
\mathsf {t}
, 
\mathsf {c}
)]$ equals $[
\mathsf {T}]$ if the proof $[
\mathsf {p}]$ proves the sequent lemma $[
\mathsf {t}]$ in the context defined by the cache $[
\mathsf {c}]$. Otherwise, $[
proof( 
\mathsf {p}
, 
\mathsf {t}
, 
\mathsf {c}
)]$ returns an error message:

\index{proof @\back $[
proof( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ proof x term y cache z end proof}%
%
\index{proof x term y cache z end proof $
proof( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)$}%
%
\tex{$
[
proof( 
\mathsf {p}
, 
\mathsf {t}
, 
\mathsf {c}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline proof(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
proof( 
\mathsf {p}
, 
\mathsf {t}
, 
\mathsf {c}
)
\mathrel {\dot {=}}
proof_{2}( 
{\cal S}(
\mathsf {c}
, 
\mathsf {p}
)
, 
\mathsf {t}
)
]$%
}

$[
proof_{2}( 
\mathsf {q}
, 
\mathsf {t}
)]$ equals $[
\mathsf {T}]$ if $[
\mathsf {q}]$ is a sequent which proves the sequent lemma $[
\mathsf {t}]$. Otherwise, $[
proof_{2}( 
\mathsf {q}
, 
\mathsf {t}
)]$ returns an error message:

\index{proof 2 @\back $[
proof_{2}( 
\mathsf{x}
, 
\mathsf{y}
)]$ proof two x term y end proof}%
%
\tex{$
[
proof_{2}( 
\mathsf {q}
, 
\mathsf {t}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline proof
\_
\{2
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
proof_{2}( 
\mathsf {q}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
\mathsf {t}
!
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {q}
{}^{0}
\ {\bf then} \ 
error(
\mbox{``}Proof
\linebreak [0]\ \hskip0em plus2.0em{}has
\linebreak [0]\ \hskip0em plus2.0em{}at
\linebreak [0]\ \hskip0em plus2.0em{}least
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}unresolved
\linebreak [0]\ \hskip0em plus2.0em{}premise.
\linebreak [0]\ \hskip0em plus2.0em{}Lemma;premise
\linebreak [0]\ \hskip0em plus2.0em{}reads
{:}
\mbox{''}
,
\mathsf {t}
; 
\mathsf {q}
{}^{0}
{}^h
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {q}
{}^{1}
\ {\bf then} \ 
error(
\mbox{``}Proof
\linebreak [0]\ \hskip0em plus2.0em{}has
\linebreak [0]\ \hskip0em plus2.0em{}at
\linebreak [0]\ \hskip0em plus2.0em{}least
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}unresolved
\linebreak [0]\ \hskip0em plus2.0em{}side
\linebreak [0]\ \hskip0em plus2.0em{}condition.
\linebreak [0]\ \hskip0em plus2.0em{}Lemma;condition
\linebreak [0]\ \hskip0em plus2.0em{}reads
{:}
\mbox{''}
,
\mathsf {t}
; 
\mathsf {q}
{}^{1}
{}^h
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {q}
{}^{2}
\stackrel {t}{=}
\mathsf {t}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
error(
\mbox{``}Lemma
\linebreak [0]\ \hskip0em plus2.0em{}does
\linebreak [0]\ \hskip0em plus2.0em{}not
\linebreak [0]\ \hskip0em plus2.0em{}match
\linebreak [0]\ \hskip0em plus2.0em{}conclusion.
\linebreak [0]\ \hskip0em plus2.0em{}Lemma;conclusion
\linebreak [0]\ \hskip0em plus2.0em{}reads
{:}
\mbox{''}
,
\mathsf {t}
; 
\mathsf {q}
{}^{2}
)
]$%
}



\subsection{The verifier}

\subsubsection{Conjunction membership}

The verifier allows proofs to refer to previously proved lemmas. Such previously proved lemmas may occur on the same page as the proof or in transitively referenced pages.

When a lemma on another page is referenced, the verifier needs to ensure that that other page has been properly checked. The verifier does so by looking up the diagnose aspect of the referenced page to see that the referenced page is correct. Furthermore, the verifier looks up the claim aspect of the referenced page to see that the claim is a conjunction that includes the verifier itself.

The above verification check for referenced pages is fast because the verifier itself is not invoked on the page. Rather, the verifier just ensures that the verifier was invoked successfully when the page was loaded.

Furthermore, the verification check is flexible in that the verifier only requires referenced pages to be checked by the verifier if those other pages actually contribute to proofs. This allows pages that contain proofs to reference pages that are unrelated to proofs such as pages that define computer programs, formatting constructs, fonts, or whatever.

The verifier is also flexible in that it allows referenced pages to be checked by any number of other checkers alongside the verifier itself. That allows the verifier to coexist with other proof checkers and all sorts of other checkers. As an example, one may decide to impose strong typing on a page using some type checker without affecting the ability to check proofs.

To implement the above verification check we need a relation $[
\mathsf{x}
\in_c 
\mathsf{y}]$ which is true iff the term $[
\mathsf{x}]$ belongs to the conjunction $[
\mathsf{y}]$:

%
\index{c: \back $[
\mathsf{x}
\in_c 
\mathsf{y}]$ x claim in y}%
%
\index{\alpha x claim in y @\back $[
\mathsf{x}
\in_c 
\mathsf{y}]$ x claim in y}%
%
\index{x claim in y $[
\mathsf{x}
\in_c 
\mathsf{y}]$}%
%
\tex{$
[
\mathsf{x}
\in_c 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}in
\_c
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\in_c 
\mathsf{y}
\mathrel {\dot {=}}
\mathsf{y}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\wedge_c 
\mathsf{y}
\rceil 
\left\{\protect \begin {array}{l}
\mathrm {If}(
\mathsf{x}
\in_c 
\mathsf{y}
{}^{1}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
\mathsf{x}
\in_c 
\mathsf{y}
{}^{2}
)
\\
\mathsf{x}
\stackrel {t}{=}
\mathsf{y}
\protect \end {array}\right.
]$%
}
%

Furthermore, we need a function $[
claims( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {r}
)]$ which is true if the term $[
\mathsf {t}]$ belongs to the potentially inherited claim of page $[
\mathsf {r}]$ according to the cache $[
\mathsf {c}]$:

%
\index{claims @\back $[
claims( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {r}
)]$ claims t cache c ref r end claims}%
%
\tex{$
[
claims( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {r}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline claims(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
claims( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {r}
)
\mathrel {\dot {=}}
\newline 
\mathrm {If}(
claims_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {r}
)
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
claims_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {bibliography}\mbox {\tt \char34}
{]}
{}^{1}
)
)
]$%
}
%

%
\index{claims 2 @\back $[
claims_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {r}
)]$ claims two t cache c ref r end claims}%
%
\tex{$
[
claims_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {r}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline claims
\_2(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
claims_2( 
\mathsf {t}
, 
\mathsf {c}
, 
\mathsf {r}
)
\mathrel {\dot {=}}
\mathrm {If}(
{\neg }
\mathsf {r}
{}^c
,\linebreak [0]
\mathsf {t}
!
\mathsf {c}
!
\mathsf {F}
,\linebreak [0]
\mathsf {t}
\in_c 
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
{]}
{[}
0
{]}
{[}
0
{]}
{[}
\mbox {\tt \char34}\mathrm {claim}\mbox {\tt \char34}
{]}
{}^{3}
)
]$%
}
%

\test{$
\relax [ 
\lceil 
\mbox{checker}
\rceil 
\in_c 
\lceil 
\mbox{checker}
\wedge_c 
\mbox{verifier}
\rceil 
\relax ]^{\cdot} $}

\test{$
\relax [ 
\lceil 
\mbox{verifier}
\rceil 
\in_c 
\lceil 
\mbox{checker}
\wedge_c 
\mbox{verifier}
\rceil 
\relax ]^{\cdot} $}

\test{$
\relax [ 
\lceil 
7
\rceil 
\in_c 
\lceil 
\mbox{checker}
\wedge_c 
\mbox{verifier}
\rceil 
\relax ]^{-} $}

\test{$
\relax [ 
claims( 
\lceil 
\mbox{verifier}
\rceil 
, 
\mbox{self}
, 
\mbox{self}
{[}
0
{]}
)
\relax ]^{\cdot} $}

\test{$
\relax [ 
claims( 
\lceil 
7
\rceil 
, 
\mbox{self}
, 
\mbox{self}
{[}
0
{]}
)
\relax ]^{-} $}



\subsubsection{The proof aspect}\label{section:TheProofAspect}

The ``proves'' predicate in Section \ref{section:LemmaVerification} is useful for testing the validity of a single, stand-alone proof which proves some lemma from scratch without reference to any auxilliary lemmas.

For more complex proofs, we introduce a \indexintro{proof aspect} and make the convention that whenever a construct has a proof aspect, then the construct should also have a statement aspect and, furthermore, the proof aspect should be a proof of the statement aspect. We make the proof aspect self-evaluating and use $[
proof]$ to denote it:

%
\index{proof @\back $[
{<}proof{>}]$ the proof aspect}%
%
\index{the proof aspect $[
{<}proof{>}]$}%
%
\tex{$
[
{<}proof{>}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
{<}
\}proof
\{
{>}
\}
\mbox{''}
]$}%
%
\display{$
[
{<}proof{>}
\mathrel {\dot {=}}
\lceil 
{<}proof{>}
\rceil 
]$%
}
%

%
\index{proof $[
proof]$}%
%
\tex{$
[
proof
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline proof
\mbox{''}
]$}%
%
\display{$
[
proof
\stackrel {msg}{=} 
{<}proof{>}
]$%
}
%

From the point of view of Logiweb, lemmas and proofs are just definitions:

%
\index{Lemma @\back $
[ \mathbf{Lemma\ } 
\mathsf{x}
\colon 
\mathsf{y}
]$ lemma x says y}%
%
\tex{$
[
[ \mathbf{Lemma\ } 
\mathsf{x}
\colon 
\mathsf{y}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}mathbf
\{Lemma
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ]
\mbox{''}
]$}
%
\display{$
[
[ \mathbf{Lemma\ } 
\mathsf{x}
\colon 
\mathsf{y}
]
\mathrel {\ddot {=}}
[
\mathsf{x}
\stackrel{
stmt
}{\rightarrow}
\mathsf{y}
]
]$%
}
%

\index{proof of @\back $
[ \mathbf{Proof\ of\ }
\mathsf{x}
\colon 
\mathsf{y}
]$ proof of x read y end proof}%
%
\tex{$
[
[ \mathbf{Proof\ of\ }
\mathsf{x}
\colon 
\mathsf{y}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}mathbf
\{Proof
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}of
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ]
\mbox{''}
]$}%
%
\display{$
[
[ \mathbf{Proof\ of\ }
\mathsf{x}
\colon 
\mathsf{y}
]
\mathrel {\ddot {=}}
[
\mathsf{x}
\stackrel{
proof
}{\rightarrow}
\mathsf{y}
]
]$%
}
%

The following construct provides a reader friendly way of stating that a statement $[
\mathsf{z}]$ is provable in a theory $[
\mathsf{x}]$ and giving the conjecture the name $[
\mathsf{y}]$.

%
\index{in theory x lemma y says z end lemma $
[ 
\mathsf{x}
\mathbf{\ lemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]$}%
%
\index{lemma: $
[ 
\mathsf{x}
\mathbf{\ lemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]$ in theory x lemma y says z end lemma}%
%
\tex{$
[
[ 
\mathsf{x}
\mathbf{\ lemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}mathbf
\{
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ]
\mbox{''}
]$}
%
\display{$
[
[ 
\mathsf{x}
\mathbf{\ lemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
\mathrel {\ddot {=}}
[
\mathsf{y}
\stackrel {stmt}{=}
\mathsf{x}
\vdash 
\mathsf{z}
]
]$%
}
%

As an example of use,

%
\index{example axiom lemma primed $[
HeadNil'']$}%
%
\index{HeadNil @\back $[
HeadNil'']$ example axiom lemma primed}%
%
\tex{$
[
HeadNil''
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline HeadNil
\mbox {'}
\mbox {'}
\mbox{''}
]$}%
%
\statement{$
[ 
T'_{E}
\mathbf{\ lemma\ } 
HeadNil''
\colon 
\mathsf {T}
{}^h
=
\mathsf {T}
]$%
}
%

conjectures that $[
\mathsf {T}
{}^h
=
\mathsf {T}]$ is provable in $[
T'_{E}]$.

The following construct provides a reader friendly way of stating that a statement $[
\mathsf{z}]$ is disprovable in a theory $[
\mathsf{x}]$ and giving the anticonjecture the name $[
\mathsf{y}]$.

%
\index{in theory x antilemma y says z end antilemma $
[ 
\mathsf{x}
\mathbf{\ antilemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]$}%
%
\index{antilemma: $
[ 
\mathsf{x}
\mathbf{\ antilemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]$ in theory x antilemma y says z end antilemma}%
%
\tex{$
[
[ 
\mathsf{x}
\mathbf{\ antilemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}mathbf
\{
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}antilemma
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ]
\mbox{''}
]$}
%
\display{$
[
[ 
\mathsf{x}
\mathbf{\ antilemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
\mathrel {\ddot {=}}
[ 
\mathsf{x}
\mathbf{\ lemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
\vdash 
{\makebox [0mm][l]{$\bot $}\,{\bot }}
]
]$%
}
%

As an example of use,

%
\index{Contra'' @\back $[
Contra'']$ contraexample lemma primed}%
%
\tex{$
[
Contra''
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Contra
\mbox {'}
\mbox {'}
\mbox{''}
]$}%
%
\statement{$
[ 
T'_{E}
\mathbf{\ antilemma\ } 
Contra''
\colon 
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}
]$%
}
%

conjectures that $[
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}]$ is disprovable in $[
T'_{E}]$.



\subsubsection{Verifier}

The $[
\mbox{verifier}]$ checks the correctness of all proofs on a page. It is suited to appear in a conjunction that makes up the claim of a page. The verifier ignores the macro expanded tree $[
\mathsf {t}]$ and merely uses the cache $[
\mathsf {c}]$.

%
\index{verifier @\back $[
\mbox{verifier}]$ verifier}%
%
\display{$
[
\mbox{verifier}
\mathrel {\dot {=}}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {c}
.
{\cal V}_1( 
\mathsf {c}
)
]$%
}
%

$[
{\cal V}_1( 
\mathsf {c}
)]$ extracts the reference $[
\mathsf {r}]$ of the page to be checked from the cache $[
\mathsf {c}]$ of the page. Then it extracts the subcodex $[
\mathsf{x}]$ of all domestic definition of the page and uses $[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf{x}
)]$ to evaluate the array of proofs into an array $[
\mathsf {p}]$ of sequents. Then it uses $[
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {d}
)]$ to verify the correctness of all proofs.

%
\index{v 1 @\back $[
{\cal V}_1( 
\mathsf {c}
)]$ verify one c end verify}%
%
\index{verify one c end verify $[
{\cal V}_1( 
\mathsf {c}
)]$}%
%
\tex{$
[
{\cal V}_1( 
\mathsf {c}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\_1(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal V}_1( 
\mathsf {c}
)
\mathrel {\dot {=}}
\newline 
\mathbf{let\ } 
\mathsf {r}
= 
\mathsf {c}
{[}
0
{]}
\mathbf{\ in\ } 
\newline 
\mathbf{let\ } 
\mathsf{x}
= 
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
{]}
\mathbf{\ in\ } 
\newline 
\mathbf{let\ } 
\mathsf {p}
= 
{\cal V}_2( 
\mathsf {c}
, 
\mathsf{x}
)
\mathbf{\ in\ } 
\newline 
\mathbf{let\ } 
\mathsf {d}
= 
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {T}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {d}
\ {\bf then} \ 
\mathsf {d}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {i}
= 
{\cal V}_5( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {p}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {i}
{}^c
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
error(
\mbox{``}Circular
\linebreak [0]\ \hskip0em plus2.0em{}proof.
\linebreak [0]\ \hskip0em plus2.0em{}Circle
\linebreak [0]\ \hskip0em plus2.0em{}includes
{:}
\mbox{''}
,
\mathsf {p}
{[}
\mathsf {i}
{]}
{}^{0}
{}^h
)
]$%
}
%

$[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
)]$ evaluates all proofs in the subcodex $[
\mathsf {p}]$ and returns the result as a one-dimensional array of sequents (indexed by the identifier of each proof). $[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
)]$ is not particularly efficient since it continues to evaluate all proofs even if one of the proofs returns an error message.

For each symbol in the subcodex, $[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
)]$ extracts the proof definition $[
\mathsf {d}]$ (i.e.\ the right hand side of the $[
{<}proof{>}]$ aspect) of the symbol. If the proof aspect exists (i.e.\ differs from $[
\mathsf {T}]$) then $[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
)]$ uses the evaluator $[
{\cal E}(
\mathsf {d}
,
\mathsf {T}
,
\mathsf {c}
)]$ to compute the value of $[
\mathsf {d}]$, applies the result to the cache $[
\mathsf {c}]$ in order to give access to the cache from proof tactics inside $[
\mathsf {d}]$, and then uses the sequent evaluator $[
{\cal S}(
\mathsf {c}
, 
\mathsf {t}
)]$ to evaluate the proof into a sequent.

%
\index{v 2 @\back $[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
)]$ verify two c proofs p end verify}%
%
\index{verify two c proofs p end verify $[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
)]$}%
%
\tex{$
[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\_2(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\newline 
{\bf if} \ 
\mathsf {p}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {p}
{}^h
{}^c
\ {\bf then} \ 
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
{}^h
)
\mathrel { : \, : }
{\cal V}_2( 
\mathsf {c}
, 
\mathsf {p}
{}^t
)
\ {\bf else} \ 
\mathsf {p}
{}^h
\mathrel { : \, : }
\newline 
\mathbf{let\ } 
\mathsf {d}
= 
\mathbf{aspect}( 
{<}proof{>}
, 
\mathsf {p}
{}^t
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {d}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {r}
= 
{\cal S}(
\mathsf {c}
, 
{\cal U}^M(
{\cal E}(
\mathsf {d}
{}^{3}
,
\mathsf {T}
,
\mathsf {c}
)
\mathbin {\mbox {`}}
\mathsf {c}
\mathbin {\mbox {`}}
\mathsf {p}
)
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {r}
{} ^ { E }
\ {\bf then} \ 
error(
\mbox{``}Error
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}proof
\linebreak [0]\ \hskip0em plus2.0em{}of
\mbox{''}
,
\mathsf {d}
{}^{2}
\lceil 
\mbox{``}
\newline 
\mbox{''}
\rceil 
{}^{1}
\mathsf {r}
)
\ {\bf else} \ 
\mathsf {r}
]$%
}
%

$[
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {d}
)]$ returns the diagnose $[
\mathsf {d}]$ if $[
\mathsf {d}]$ differs from $[
\mathsf {T}]$. Otherwise, it traverses the array $[
\mathsf {p}]$ of sequents and checks each sequent $[
\mathsf {q}]$ for correctness. During the check, $[
\mathsf {i}]$ is bound to the identifier of the proof being checked and $[
\mathsf {d}]$ is bound to the lemma being checked.

%
\index{v 3 @\back $[
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {d}
)]$ verify three c ref r sequents p diagnose d end verify}%
%
\index{verify three c ref r sequents p diagnose d end verify $[
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {d}
)]$}%
%
\tex{$
[
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {d}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\_3(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {d}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {r}
!
\mathsf {p}
!
\newline 
{\bf if} \ 
{\neg }
\mathsf {d}
\ {\bf then} \ 
\mathsf {d}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {p}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {p}
{}^h
{}^c
\ {\bf then} \ 
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
{}^t
, 
{\cal V}_3( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
{}^h
, 
\mathsf {T}
)
)
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {i}
= 
\mathsf {p}
{}^h
\mathbf{\ in\ } 
\newline 
\mathbf{let\ } 
\mathsf {q}
= 
\mathsf {p}
{}^t
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {q}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {q}
{} ^ { E }
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {q}
{}^{1}
\ {\bf then} \ 
error(
\mbox{``}Unchecked
\linebreak [0]\ \hskip0em plus2.0em{}sidecondition
{:}
\mbox{''}
,
\mathsf {q}
{}^{1}
{}^h
)
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {d}
= 
\mathbf{aspect}( 
{<}stmt{>}
, 
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
{]}
{[}
\mathsf {i}
{]}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {d}
\ {\bf then} \ 
error(
\mbox{``}Proof
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}non
\mbox{-}existent
\linebreak [0]\ \hskip0em plus2.0em{}lemma
{:}
\mbox{''}
,
\mathsf {q}
{}^{2}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {q}
{}^{2}
\stackrel {t}{=}
\mathsf {d}
{}^{3}
\ {\bf then} \ 
error(
\mbox{``}Lemma/proof
\linebreak [0]\ \hskip0em plus2.0em{}mismatch
{:}
\mbox{''}
,
\mathsf {d}
{}^{2}
; 
\mathsf {q}
{}^{2}
)
\ {\bf else} \ 
\newline 
{\cal V}_4( 
\mathsf {c}
, 
\mathsf {q}
{}^{0}
)
]$%
}
%

$[
{\cal V}_4( 
\mathsf {c}
, 
\mathsf {p}
)]$ checks that the list $[
\mathsf {p}]$ of premises consists of proved lemmas. That is done by verifying that each member of $[
\mathsf {p}]$ has a proof and belongs to a correct page that lists the verifier among its claims. The page being verified is considered correct during the check since the diagnose aspect is not yet set while checking the page. The only thing $[
{\cal V}_4( 
\mathsf {c}
, 
\mathsf {p}
)]$ does not check for is circular proofs (e.g.\ proofs that make use of the lemma they prove). Checking for circularity is done elsewhere.

%
\index{v 4 @\back $[
{\cal V}_4( 
\mathsf {c}
, 
\mathsf {p}
)]$ verify four c premises p end verify}%
%
\index{verify four c premises p end verify $[
{\cal V}_4( 
\mathsf {c}
, 
\mathsf {p}
)]$}%
%
\tex{$
[
{\cal V}_4( 
\mathsf {c}
, 
\mathsf {p}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\_4(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal V}_4( 
\mathsf {c}
, 
\mathsf {p}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\newline 
{\bf if} \ 
\mathsf {p}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {d}
= 
{\cal V}_4( 
\mathsf {c}
, 
\mathsf {p}
{}^t
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {d}
\ {\bf then} \ 
\mathsf {d}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {p}
= 
\mathsf {p}
{}^h
\mathbf{\ in\ } 
\newline 
\mathbf{let\ } 
\mathsf {r}
= 
\mathsf {p}
{}^{r}
\mathbf{\ in\ } 
\newline 
\mathbf{let\ } 
\mathsf {i}
= 
\mathsf {p}
{}^{i}
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {diagnose}\mbox {\tt \char34}
{]}
\ {\bf then} \ 
\newline 
error(
\mbox{``}Reference
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}erroneous
\linebreak [0]\ \hskip0em plus2.0em{}page
\mbox{''}
,
\mathsf {p}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
claims( 
\lceil 
\mbox{verifier}
\rceil 
, 
\mathsf {c}
, 
\mathsf {r}
)
\ {\bf then} \ 
\newline 
error(
\mbox{``}Reference
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}unchecked
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
,
\mathsf {p}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathbf{aspect}( 
{<}proof{>}
, 
\mathsf {p}
, 
\mathsf {c}
)
\ {\bf then} \ 
\newline 
error(
\mbox{``}Reference
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}unproved
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
,
\mathsf {p}
)
\ {\bf else} \ 
\mathsf {T}
]$%
}
%

$[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ takes as input an array $[
\mathsf {q}]$ that contains the conclusions of all proofs on the present page. These conclusions are all sequents and they are indexed by the identifiers of the symbols they belong to.

The sequents are allowed to have unresolved premises provided the premises are proved elsewhere. Furthermore, the directed graph with sequents as nodes and premises as edges is required to be non-cyclic. $[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ performs a search for cycles.

Logiweb pages and Logiweb bibliographic references form a non-cyclic graph, so whenever a premise refers to a lemma proved on another page, that premise cannot be part of a cycle. For that reason, $[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ ignores premises whose reference differs from the reference $[
\mathsf {r}]$ of the page being checked.

$[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ checks all nodes and edges reachable from the node with identifier $[
\mathsf {i}]$ for cycles. If a cycle is found, the identifier of one of the nodes in the cycle is returned. Hence, a return value which is a cardinal indicates that a cycle is found. Otherwise, $[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ replaces all reachable nodes in $[
\mathsf {q}]$ by the cardinal $[
1]$ and returns the modified $[
\mathsf {q}]$.

When $[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ reaches a node that is set to $[
1]$ then it assumes that that node has already been checked for cycles.

During the search for cycles, $[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ temporarily sets all nodes being considered to $[
0]$. When $[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ reaches a node that is set to $[
0]$ it assumes that a cycle has been found and returns the identifier of the node.

%
\index{v 7 @\back $[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$ verify seven c ref r id i sequents q end verify}%
%
\index{verify seven c ref r id i sequents q end verify $[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)]$}%
%
\tex{$
[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\_7(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {i}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {r}
!
\newline 
\mathbf{let\ } 
\mathsf {v}
= 
\mathsf {q}
{[}
\mathsf {i}
{]}
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {v}
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {v}
\approx 
0
\ {\bf then} \ 
\mathsf {i}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {v}
\approx 
1
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {q}
= 
{\cal V}_6( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {v}
{}^{0}
, 
\mathsf {q}
[ 
\mathsf {i}
{\rightarrow} 
0
]
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {q}
{}^c
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\mathsf {q}
[ 
\mathsf {i}
{\rightarrow} 
1
]
]$%
}
%

$[
{\cal V}_6( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {q}
)]$ checks all indices in the list $[
\mathsf {p}]$ if premises for circularity in the array $[
\mathsf {q}]$ of sequents.

%
\index{v 6 @\back $[
{\cal V}_6( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {q}
)]$ verify six c ref r list p sequents q end verify}%
%
\index{verify six c ref r list p sequents q end verify $[
{\cal V}_6( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {q}
)]$}%
%
\tex{$
[
{\cal V}_6( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {q}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\_6(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal V}_6( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {r}
!
\mathsf {p}
!
\newline 
{\bf if} \ 
\mathsf {q}
{}^c
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {p}
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {q}
= 
{\cal V}_6( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
{}^t
, 
\mathsf {q}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {q}
{}^c
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {r}
\approx 
\mathsf {p}
{}^h
{}^{r}
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {p}
{}^h
{}^{i}
, 
\mathsf {q}
)
]$%
}
%

$[
{\cal V}_5( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {a}
, 
\mathsf {q}
)]$ checks all indices in the array $[
\mathsf {a}]$ for circularity in the array $[
\mathsf {q}]$ of sequents.

%
\index{v 5 @\back $[
{\cal V}_5( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {a}
, 
\mathsf {q}
)]$ verify five c ref r array a sequents q end verify}%
%
\index{verify five c ref r array a sequents q end verify $[
{\cal V}_5( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {a}
, 
\mathsf {q}
)]$ verify five c ref r array a sequents q end verify}%
%
\tex{$
[
{\cal V}_5( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {a}
, 
\mathsf {q}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}V
\}
\_5(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal V}_5( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {a}
, 
\mathsf {q}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\mathsf {r}
!
\mathsf {a}
!
\newline 
{\bf if} \ 
\mathsf {q}
{}^c
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {a}
\ {\bf then} \ 
\mathsf {q}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {a}
{}^h
{}^c
\ {\bf then} \ 
{\cal V}_5( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {a}
{}^t
, 
{\cal V}_5( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {a}
{}^h
, 
\mathsf {q}
)
)
\ {\bf else} \ 
\newline 
{\cal V}_7( 
\mathsf {c}
, 
\mathsf {r}
, 
\mathsf {a}
{}^h
, 
\mathsf {q}
)
]$%
}
%



\subsubsection{The rule lemma tactic}

In Section \ref{section:TheProofAspect} we stated two lemmas:

\statement{$
[ 
T'_{E}
\mathbf{\ lemma\ } 
HeadNil''
\colon 
\mathsf {T}
{}^h
=
\mathsf {T}
]$}

\statement{$
[ 
T'_{E}
\mathbf{\ antilemma\ } 
Contra''
\colon 
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}
]$}

Both lemmas are trivial; they are both instances of the general fact that all rules of a theory are provable in the theory. It is rather straightforward to prove both lemmas using suitable sequent operations but instead of writing a handmade proof for each lemma we shall write a proof tactic which, given a theory and a rule of the theory, generates a proof that the rule follows from the theory. We shall refer to the tactic as the $[
Rule\ tactic]$, and we shall arrange that the following become valid proofs of the above lemmas:

\statement{$
[ \mathbf{Proof\ of\ }
HeadNil''
\colon 
Rule\ tactic
]$}

\statement{$
[ \mathbf{Proof\ of\ }
Contra''
\colon 
Rule\ tactic
]$}

We define the rule tactic thus:

%
\index{rule tactic @\back $[
Rule\ tactic]$ rule tactic}%
%
\tex{$
[
Rule\ tactic
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Rule
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}tactic
\mbox{''}
]$}%
%
\display{$
[
Rule\ tactic
\mathrel {\dot {=}}
\lambda 
\mathsf {c}
.
\lambda 
\mathsf {p}
.
rule( 
\mathsf {c}
, 
\mathsf {p}
)
]$%
}
%

When invoked from the verifier, the tactic is applied to the cache $[
\mathsf {c}]$ of the current page and a pair $[
\mathsf {p}]$ whose first component is the identifier of the lemma to be proved and whose second component is the subcodex containing all aspects of that lemma. The rule tactic passes control to the function below.

%
\index{Rule @\back $[
rule( 
\mathsf{x}
, 
\mathsf{y}
)]$ rule x subcodex y end rule}%
%
\tex{$
[
rule( 
\mathsf {c}
, 
\mathsf {p}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline rule(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
rule( 
\mathsf {c}
, 
\mathsf {p}
)
\mathrel {\dot {=}}
\mathsf {c}
!
\newline 
\mathbf{let\ } 
\mathsf {s}
= 
\mathbf{aspect}( 
{<}stmt{>}
, 
\mathsf {p}
{}^t
)
{}^{3}
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {s}
\ {\bf then} \ 
\lceil 
\mbox{``}Rule
\linebreak [0]\ \hskip0em plus2.0em{}has
\linebreak [0]\ \hskip0em plus2.0em{}no
\linebreak [0]\ \hskip0em plus2.0em{}statement
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
\rceil 
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {s}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\vdash 
\mathsf{y}
\rceil 
\ {\bf then} \ 
error(
\mbox{``}Rule
\linebreak [0]\ \hskip0em plus2.0em{}has
\linebreak [0]\ \hskip0em plus2.0em{}invalid
\linebreak [0]\ \hskip0em plus2.0em{}statement
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
,
\mathsf {s}
)
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {t}
= 
\mathbf{aspect}( 
{<}stmt{>}
, 
\mathsf {s}
{}^{1}
, 
\mathsf {c}
)
{}^{3}
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {t}
\ {\bf then} \ 
\lceil 
\mbox{``}Theory
\linebreak [0]\ \hskip0em plus2.0em{}has
\linebreak [0]\ \hskip0em plus2.0em{}no
\linebreak [0]\ \hskip0em plus2.0em{}statement
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
\rceil 
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {r}
= 
rule_1( 
\mathsf {s}
{}^{2}
, 
\mathsf {t}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {r}
{}^c
\ {\bf then} \ 
error(
\mbox{``}The
\linebreak [0]\ \hskip0em plus2.0em{}theory
\linebreak [0]\ \hskip0em plus2.0em{}does
\linebreak [0]\ \hskip0em plus2.0em{}not
\linebreak [0]\ \hskip0em plus2.0em{}assert
\linebreak [0]\ \hskip0em plus2.0em{}the
\linebreak [0]\ \hskip0em plus2.0em{}given
\linebreak [0]\ \hskip0em plus2.0em{}rule
\mbox{''}
,
\mathsf {s}
; 
\mathsf {t}
)
\ {\bf else} \ 
\newline 
(
\mathsf {s}
{}^{1}
\vdash 
Cut( 
\mathsf {s}
{}^{1}
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
, 
\mathsf {r}
)
)
]$%
}
%

The function above finds out what the rule tactic is supposed to prove and then passes control to the function below for constructing the proofs.

%
\index{Rule 1 @\back $[
rule_1( 
\mathsf{x}
, 
\mathsf{y}
)]$ rule one x theory y end rule}%
%
\tex{$
[
rule_1( 
\mathsf {s}
, 
\mathsf {t}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline rule
\_1(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
rule_1( 
\mathsf {s}
, 
\mathsf {t}
)
\mathrel {\dot {=}}
\newline 
{\bf if} \ 
\mathsf {s}
\stackrel {t}{=}
\mathsf {t}
\ {\bf then} \ 
\mathsf {T}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\mathrel {\oplus} 
\mathsf{y}
\rceil 
\ {\bf then} \ 
0
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {p}
= 
rule_1( 
\mathsf {s}
, 
\mathsf {t}
{}^{1}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {p}
{}^c
\ {\bf then} \ 
Cut( 
Head_{\oplus} ( 
\mathsf {t}
)
, 
\mathsf {p}
)
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {p}
= 
rule_1( 
\mathsf {s}
, 
\mathsf {t}
{}^{2}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {p}
{}^c
\ {\bf then} \ 
Cut( 
Tail_{\oplus} ( 
\mathsf {t}
)
, 
\mathsf {p}
)
\ {\bf else} \ 
0
]$%
}
%

The function above searches for the given rule in the given theory. When found, it constructs a proof using the three proof constructors below.

%
\index{Cut @\back $[
Cut( 
\mathsf{x}
, 
\mathsf{y}
)]$ cut x and y end cut}%
%
\tex{$
[
Cut( 
\mathsf {a}
, 
\mathsf {b}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Cut(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
Cut( 
\mathsf {a}
, 
\mathsf {b}
)
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {b}
,\linebreak [0]
\mathsf {a}
,\linebreak [0]
\mathsf {a}
; 
\mathsf {b}
)
]$%
}
%

%
\index{Head @\back $[
Head_{\oplus} ( 
\mathsf{x}
)]$ head x end head}%
%
\tex{$
[
Head_{\oplus} ( 
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Head
\_
\{
\mbox {$\backslash $}oplus
\}
\linebreak [0]\ \hskip0em plus2.0em{}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline )
\mbox{''}
]$}%
%
\display{$
[
Head_{\oplus} ( 
\mathsf {s}
)
\mathrel {\dot {=}}
(
\mathsf {s}
{}^{1}
\vdash 
\mathsf {s}
{}^{2}
\vdash 
\mathsf {s}
{}^{1}
{} ^ { I }
{} ^ { \rhd }
)
{} ^ { + } 
{} ^ { \rhd }
]$%
}
%

%
\index{Tail @\back $[
Tail_{\oplus} ( 
\mathsf{x}
)]$ tail x end tail}%
%
\tex{$
[
Tail_{\oplus} ( 
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Tail
\_
\{
\mbox {$\backslash $}oplus
\}
\linebreak [0]\ \hskip0em plus2.0em{}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline )
\mbox{''}
]$}%
%
\display{$
[
Tail_{\oplus} ( 
\mathsf {s}
)
\mathrel {\dot {=}}
(
\mathsf {s}
{}^{1}
\vdash 
\mathsf {s}
{}^{2}
{} ^ { I }
)
{} ^ { + } 
{} ^ { \rhd }
]$%
}
%



\subsubsection{Stating rules}

The rule tactic of the previous section allows to prove that all rules of a theory are provable in the theory. The following macros allow to express lemma and proof in one go:

%
\index{in theory x rule y says z end rule $
[ 
\mathsf{x}
\mathbf{\ rule\ } 
\mathsf{y}
\colon 
\mathsf{z}
]$}%
%
\index{rule: $
[ 
\mathsf{x}
\mathbf{\ rule\ } 
\mathsf{y}
\colon 
\mathsf{z}
]$ in theory x rule y says z end rule}%
%
\tex{$
[
[ 
\mathsf{x}
\mathbf{\ rule\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}mathbf
\{
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}rule
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ]
\mbox{''}
]$}
%
\display{$
[
[ 
\mathsf{x}
\mathbf{\ rule\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
\mathrel {\ddot {=}}
[ 
\mathsf{x}
\mathbf{\ lemma\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
[ \mathbf{Proof\ of\ }
\mathsf{y}
\colon 
Rule\ tactic
]
]$%
}
%

%
\index{in theory x antirule y says z end antirule $
[ 
\mathsf{x}
\mathbf{\ antirule\ } 
\mathsf{y}
\colon 
\mathsf{z}
]$}%
%
\index{antirule: $
[ 
\mathsf{x}
\mathbf{\ antirule\ } 
\mathsf{y}
\colon 
\mathsf{z}
]$ in theory x antirule y says z end antirule}%
%
\tex{$
[
[ 
\mathsf{x}
\mathbf{\ antirule\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}mathbf
\{
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}antirule
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ]
\mbox{''}
]$}
%
\display{$
[
[ 
\mathsf{x}
\mathbf{\ antirule\ } 
\mathsf{y}
\colon 
\mathsf{z}
]
\mathrel {\ddot {=}}
[ 
\mathsf{x}
\mathbf{\ rule\ } 
\mathsf{y}
\colon 
\mathsf{z}
\vdash 
{\makebox [0mm][l]{$\bot $}\,{\bot }}
]
]$%
}
%

Having these constructs it is easy to state that all four rules of $[
T'_{E}]$ are provable in $[
T'_{E}]$:

\statement{$
[ 
T'_{E}
\mathbf{\ rule\ } 
HeadNil''
\colon 
\mathsf {T}
{}^h
=
\mathsf {T}
]$}

%
\index{example scheme lemma primed $[
HeadPair'']$}%
%
\index{HeadPair @\back $[
HeadPair'']$ example scheme lemma primed}%
%
\tex{$
[
HeadPair''
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline HeadPair
\mbox {'}
\mbox {'}
\mbox{''}
]$}%
%
\statement{$
[ 
T'_{E}
\mathbf{\ rule\ } 
HeadPair''
\colon 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
({\cal A}
\mathrel { : \, : }{\cal B}
)
{}^h
={\cal A}
]$%
}
%

%
\index{example rule lemma primed $[
Transitivity'']$}%
%
\index{Transitivity @\back $[
Transitivity'']$ example rule lemma primed}%
%
\tex{$
[
Transitivity''
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Transitivity
\mbox {'}
\mbox {'}
\mbox{''}
]$}%
%
\statement{$
[ 
T'_{E}
\mathbf{\ rule\ } 
Transitivity''
\colon 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
\forall {\cal C}
\colon {\cal A}
={\cal B}
\vdash {\cal A}
={\cal C}
\vdash {\cal B}
={\cal C}
]$%
}
%

\statement{$
[ 
T'_{E}
\mathbf{\ antirule\ } 
Contra''
\colon 
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}
]$}



\subsubsection{Stating theories}

We have now defined the theory $[
T'_{E}]$ and stated the four rule lemmas there are for that theory, namely one for each rule of the theory. Once the rules are stated, the definition if $[
T'_{E}]$ is a bit redundant since the four rules contain all information about the theory.

We now define the theory and the four rule lemmas once more, but in a more elegant way:

%
\index{example axiom lemma $[
HeadNil]$}%
%
\index{HeadNil @\back $[
HeadNil]$ example axiom lemma}%
%
\tex{$
[
HeadNil
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline HeadNil
\mbox{''}
]$}%
%
\statement{$
[ 
T_E
\mathbf{\ rule\ } 
HeadNil
\colon 
\mathsf {T}
{}^h
=
\mathsf {T}
]$%
}
%

%
\index{example scheme lemma $[
HeadPair]$}%
%
\index{HeadPair @\back $[
HeadPair]$ example scheme lemma}%
%
\tex{$
[
HeadPair
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline HeadPair
\mbox{''}
]$}%
%
\statement{$
[ 
T_E
\mathbf{\ rule\ } 
HeadPair
\colon 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
({\cal A}
\mathrel { : \, : }{\cal B}
)
{}^h
={\cal A}
]$%
}
%

%
\index{example rule lemma $[
Transitivity]$}%
%
\index{Transitivity @\back $[
Transitivity]$ example rule lemma}%
%
\tex{$
[
Transitivity
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Transitivity
\mbox{''}
]$}%
%
\statement{$
[ 
T_E
\mathbf{\ rule\ } 
Transitivity
\colon 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
\forall {\cal C}
\colon {\cal A}
={\cal B}
\vdash {\cal A}
={\cal C}
\vdash {\cal B}
={\cal C}
]$%
}
%

%
\index{Contra @\back $[
Contra]$ contraexample lemma}%
%
\tex{$
[
Contra
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Contra
\mbox{''}
]$}%
%
\statement{$
[ 
T_E
\mathbf{\ antirule\ } 
Contra
\colon 
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}
]$%
}
%

%
\index{example theory $[
T_E]$}%
%
\index{T @\back $[
T_E]$ example theory}%
%
\tex{$
[
T_E
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline T
\_E
\mbox{''}
]$}%
%
\statement{$
[ \mathbf{Theory\ } 
T_E
]$%
}
%

In the next section we define $(
[ \mathbf{Theory\ } 
\mathsf{x}
]
)^{\mathbf {p}}$ such that $(
[ \mathbf{Theory\ } 
T_E
]
)^{\mathbf {p}}$ macro expands into a definition which defines the statement aspect of $[
T_E]$ to be a conjunction of $[
\mathsf {T}
{}^h
=
\mathsf {T}]$, $[
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
({\cal A}
\mathrel { : \, : }{\cal B}
)
{}^h
={\cal A}]$, $[
\forall {\cal A}
\colon 
\forall {\cal B}
\colon 
\forall {\cal C}
\colon {\cal A}
={\cal B}
\vdash {\cal A}
={\cal C}
\vdash {\cal B}
={\cal C}]$, and $[
\mathsf {T}
\mathrel { : \, : }
\mathsf {T}
=
\mathsf {T}
\vdash 
{\makebox [0mm][l]{$\bot $}\,{\bot }}]$, in some, arbitrary order.

When $(
[ \mathbf{Theory\ } 
\mathsf{x}
]
)^{\mathbf {p}}$ is macro expanded, it scans the codex of the page it occurs on for rules that belong to the theory $[
\mathsf{x}]$, then forms a conjunction of the rules found, and then constructs a suitable definition for $[
\mathsf{x}]$.



\subsubsection{Rule collection}

Here is the macro for collecting all rules of a theory from the codex:

%
\index{Theory @\back $
[ \mathbf{Theory\ } 
\mathsf{x}
]$ theory x end theory}%
%
\tex{$
[
[ \mathbf{Theory\ } 
\mathsf {n}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}mathbf
\{Theory
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ]
\mbox{''}
]$}%
%
\display{$(
[
[ \mathbf{Theory\ } 
\mathsf {n}
]
\stackrel{
\mathrm {macro}
}{\rightarrow}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
theory_2( 
\mathsf {t}
, 
\mathsf {c}
)
]
)^{\mathbf {p}}$%
}
%

%
\index{Theory 2 @\back $[
theory_2( 
\mathsf{x}
, 
\mathsf{y}
)]$ theory two x cache y end theory}%
%
\tex{$
[
theory_2( 
\mathsf {t}
, 
\mathsf {c}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline theory
\_2(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
theory_2( 
\mathsf {t}
, 
\mathsf {c}
)
\mathrel {\dot {=}}
\newline 
\mathbf{let\ } 
\mathsf {n}
= 
\mathsf {t}
{}^{1}
\mathbf{\ in\ } 
\newline 
\mathbf{let\ } 
\mathsf {s}
= 
\langle 
\lceil 
\mathsf {n}
\rceil 
\mathrel { : \, : }
\mathsf {n}
,\linebreak [0] 
\lceil 
\mathsf{x}
\rceil 
\mathrel { : \, : }
theory_3( 
\mathsf {c}
, 
\mathsf {n}
)
\rangle 
\mathbf{\ in\ } 
\newline 
\tilde {{\cal Q}}(
\mathsf {t}
,
\lceil 
[
\mathsf {n}
\stackrel {stmt}{=}
\mathsf{x}
]
\rceil 
,
\mathsf {s}
)
]$%
}
%

%
\index{Theory 3 @\back $[
theory_3( 
\mathsf{x}
, 
\mathsf{y}
)]$ theory three x name y end theory}%
%
\tex{$
[
theory_3( 
\mathsf {c}
, 
\mathsf {n}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline theory
\_3(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
theory_3( 
\mathsf {c}
, 
\mathsf {n}
)
\mathrel {\dot {=}}
\mathsf {n}
!
\newline 
\mathbf{let\ } 
\mathsf {r}
= 
\mathsf {c}
{[}
0
{]}
\mathbf{\ in\ } 
\newline 
theory_4( 
\mathsf {c}
{[}
\mathsf {r}
{]}
{[}
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
{]}
{[}
\mathsf {r}
{]}
, 
\mathsf {n}
, 
\mathsf {T}
)
]$%
}
%

%
\index{Theory 4 @\back $[
theory_4( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ theory four x name var y sum z end theory}%
%
\tex{$
[
theory_4( 
\mathsf {c}
, 
\mathsf {n}
, 
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline theory
\_4(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
theory_4( 
\mathsf {c}
, 
\mathsf {n}
, 
\mathsf {s}
)
\mathrel {\dot {=}}
\mathsf {n}
!
\newline 
{\bf if} \ 
\mathsf {c}
\ {\bf then} \ 
\mathsf {s}
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathsf {c}
{}^h
{}^c
\ {\bf then} \ 
theory_4( 
\mathsf {c}
{}^t
, 
\mathsf {n}
, 
theory_4( 
\mathsf {c}
{}^h
, 
\mathsf {n}
, 
\mathsf {s}
)
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
{\neg }
\mathbf{aspect}( 
{<}proof{>}
, 
\mathsf {c}
{}^t
)
{}^{3}
\stackrel {t}{=}
\lceil 
Rule\ tactic
\rceil 
\ {\bf then} \ 
\mathsf {s}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {d}
= 
\mathbf{aspect}( 
{<}stmt{>}
, 
\mathsf {c}
{}^t
)
{}^{3}
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {d}
{}^{1}
\stackrel {t}{=}
\mathsf {n}
\ {\bf then} \ 
\mathsf {s}
\ {\bf else} \ 
\newline 
Plus( 
\mathsf {d}
{}^{2}
, 
\mathsf {s}
)
]$%
}
%

%
\index{Plus @\back $[
Plus( 
\mathsf{x}
, 
\mathsf{y}
)]$ plus x and y end plus}%
%
\tex{$
[
Plus( 
\mathsf {a}
, 
\mathsf {b}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Plus(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
Plus( 
\mathsf {a}
, 
\mathsf {b}
)
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {b}
,\linebreak [0]
\mathsf {a}
,\linebreak [0]
\mathsf {a}
\mathrel {\oplus} 
\mathsf {b}
)
]$%
}
%



\subsubsection{Example lemmas}\label{section:ExampleLemmas}

One may think of the Logiweb sequent calculus as an assembly language for expressing proofs. Proofs directly expressed in the calculus are somewhat obscure to read and write, but before we solve that problem in Section \ref{section:ProofGeneration}, we state and prove two lemmas the hard way. The first lemma proves reflexivity in the $[
T_E]$ theory:

%
\index{sequent reflexivity $[
Reflexivity]$}%
%
\index{Reflexivity @\back $[
Reflexivity]$ sequent reflexivity}%
%
\tex{$
[
Reflexivity
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Reflexivity
\mbox{''}
]$}%
%
\statement{$
[ 
T_E
\mathbf{\ lemma\ } 
Reflexivity
\colon 
\forall {\cal A}
\colon {\cal A}
={\cal A}
]$%
}
%

\statement{$
[ \mathbf{Proof\ of\ }
Reflexivity
\colon 
\lceil 
T_E
\vdash 
\forall {\cal A}
\colon 
(
\newline 
HeadPair
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
{} ^ { \rhd }
\mathop {\char64} {\cal A}
\mathop {\char64} {\cal A}
; 
\newline 
(
Transitivity
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
{} ^ { \rhd }
\mathop {\char64} 
({\cal A}
\mathrel { : \, : }{\cal A}
)
{}^h
\mathop {\char64} {\cal A}
\mathop {\char64} {\cal A}
)
{} ^ { \rhd }
{} ^ { \rhd }
)
\rceil 
]$}

Now that we have reflexivity available, we may use it to prove commutativity in $[
T_E]$:

%
\index{sequent commutativity $[
Commutativity]$}%
%
\index{Commutativity @\back $[
Commutativity]$ sequent commutativity}%
%
\tex{$
[
Commutativity
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Commutativity
\mbox{''}
]$}%
%
\statement{$
[ 
T_E
\mathbf{\ lemma\ } 
Commutativity
\colon 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon {\cal A}
={\cal B}
\vdash {\cal B}
={\cal A}
]$%
}
%

\statement{$
[ \mathbf{Proof\ of\ }
Commutativity
\colon 
\lceil 
T_E
\vdash 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon {\cal A}
={\cal B}
\vdash 
(
\newline 
Reflexivity
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
{} ^ { \rhd }
\mathop {\char64} {\cal A}
; 
\newline 
(
Transitivity
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
{} ^ { \rhd }
\mathop {\char64} {\cal A}
\mathop {\char64} {\cal B}
\mathop {\char64} {\cal A}
)
{} ^ { \rhd }
{} ^ { \rhd }
)
\rceil 
]$}

As can be seen on the diagnose hook of the present page, the proofs above are correct according the the machine check made by the verifier.



\subsection{Unification}\label{section:Unification}

The facilities defined in Section \ref{section:ProofGeneration} for expressing proofs in a human-tolerant style makes use of unification. Section \ref{section:Unification} implements unification.



\subsubsection{Parameter terms}

We shall refer to terms in which bound metavariables are replaced by cardinals as \index{term, parameter}\index{parameter term}\intro{parameter terms}. The function $[
parm(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {n}
)]$ converts an ordinary term $[
\mathsf {t}]$ into a parameter term in which numbers are constructed from $[
\mathsf {n}]$ using $[
\mathsf {b}
\mathrel { {+} 2 \ast }
\mathsf {n}]$ iteratively. When calling $[
parm(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {n}
)]$, $[
\mathsf {s}]$ should be $[
\mathsf {T}]$.

%
\index{parameter term x stack y seed z end parameter $[
parm(
\mathsf{x}
,
\mathsf{y}
,
\mathsf{z}
)]$}%
%
\index{parm @\back $[
parm(
\mathsf{x}
,
\mathsf{y}
,
\mathsf{z}
)]$ parameter term x stack y seed z end parameter}%
%
\tex{$
[
parm(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {n}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline parm(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
parm(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {n}
)
\mathrel {\dot {=}}
\mathsf {n}
!
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\forall 
\mathsf{x}
\colon 
\mathsf{y}
\rceil 
\ {\bf then} \ 
\forall 
\mathsf {n}
\colon 
parm(
\mathsf {t}
{}^{2}
,
(
\mathsf {t}
{}^{1}
\mathrel { : \, : }
\mathsf {n}
)
\mathrel { : \, : }
\mathsf {s}
,
\mathsf {T}
\mathrel { {+} 2 \ast }
\mathsf {n}
)
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {m}
= 
\mathbf {lookup}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {T}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {m}
\ {\bf then} \ 
\mathsf {m}
\ {\bf else} \ 
\mathsf {t}
{}^{R}
\mathrel { : \, : }
parm^*(
\mathsf {t}
{}^t
,
\mathsf {s}
,
\mathsf {n}
)
]$%
}
%

%
\index{parameter term star x stack y seed z end parameter $[
parm^*(
\mathsf{x}
,
\mathsf{y}
,
\mathsf{z}
)]$}%
%
\index{parm @\back $[
parm^*(
\mathsf{x}
,
\mathsf{y}
,
\mathsf{z}
)]$ parameter term star x stack y seed z end parameter}%
%
\tex{$
[
parm^*(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {n}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline parm
{\char94}
{*}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
parm^*(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {n}
)
\mathrel {\dot {=}}
\mathsf {s}
!
\mathsf {n}
!
\mathrm {If}(
\mathsf {t}
{}^a
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
parm(
\mathsf {t}
{}^h
,
\mathsf {s}
,
\mathsf {n}
)
\mathrel { : \, : }
parm^*(
\mathsf {t}
{}^t
,
\mathsf {s}
,
\mathsf {n}
)
)
]$%
}
%



\subsubsection{Substitutions}

We shall refer to an array of parameter terms as a substitution. The following function instantiates a parameter term $[
\mathsf {t}]$ using a substitution $[
\mathsf {s}]$:

%
\index{instantiate x with y end instantiate $[
inst(
\mathsf{x}
,
\mathsf{y}
)]$}%
%
\index{inst @\back $[
inst(
\mathsf{x}
,
\mathsf{y}
)]$ instantiate x with y end instantiate}%
%
\tex{$
[
inst(
\mathsf {t}
,
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline inst(
\#1.
\newline ,
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
inst(
\mathsf {t}
,
\mathsf {s}
)
\mathrel {\dot {=}}
\mathrm {If}(
\mathsf {t}
{}^c
,\linebreak [0]
inst(
\mathsf {s}
{[}
\mathsf {t}
{]}
,
\mathsf {s}
)
,\linebreak [0]
\mathsf {t}
{}^{R}
\mathrel { : \, : }
inst^*(
\mathsf {t}
{}^t
,
\mathsf {s}
)
)
]$%
}
%

%
\index{instantiate star x with y end instantiate $[
inst^*(
\mathsf{x}
,
\mathsf{y}
)]$}%
%
\index{inst @\back $[
inst^*(
\mathsf{x}
,
\mathsf{y}
)]$ instantiate star x with y end instantiate}%
%
\tex{$
[
inst^*(
\mathsf {t}
,
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline inst
{\char94}
{*}(
\#1.
\newline ,
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
inst^*(
\mathsf {t}
,
\mathsf {s}
)
\mathrel {\dot {=}}
\mathsf {s}
!
\mathrm {If}(
\mathsf {t}
{}^a
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
inst(
\mathsf {t}
{}^h
,
\mathsf {s}
)
\mathrel { : \, : }
inst^*(
\mathsf {t}
{}^t
,
\mathsf {s}
)
)
]$%
}
%

\test{$
\relax [ 
inst(
parm(
\lceil 
\forall 
\mathsf{x}
\colon 
\forall 
\mathsf{y}
\colon 
\mathsf{x}
+ 
\mathsf{y}
\rceil 
,
\mathsf {T}
,
4
)
,
\mathsf {T}
[ 
4
{\rightarrow} 
\lceil 
\mathsf {u}
\rceil 
]
[ 
8
{\rightarrow} 
\lceil 
\mathsf {v}
\rceil 
]
)
\stackrel {t}{=}
\lceil 
\forall 
\mathsf {u}
\colon 
\forall 
\mathsf {v}
\colon 
\mathsf {u}
+ 
\mathsf {v}
\rceil 
\relax ]^{\cdot} $}

Instantiation may loop indefinitely. As an example, a substitution which maps $[{\cal A}]$ to $[{\cal A}
\mathrel { : \, : }{\cal A}]$ will keep expanding $[{\cal A}]$ forever. We shall say that a substitution $[
\mathsf {s}]$ is \indexintro{circular} if there exists a term $[
\mathsf {t}]$ for which $[
inst(
\mathsf {t}
,
\mathsf {s}
)]$ loops indefinitely.



\subsubsection{Occurrence}

$[
occur(
\mathsf {t}
,
\mathsf {u}
,
\mathsf {s}
)]$ is true if the parameter $[
\mathsf {t}]$ occurs in $[
inst(
\mathsf {u}
,
\mathsf {s}
)]$. $[
occur(
\mathsf {t}
,
\mathsf {u}
,
\mathsf {s}
)]$ may loop indefinitely if the substitution $[
\mathsf {s}]$ is circular.

%
\index{occur x in y substitution z end occur $[
occur(
\mathsf{x}
,
\mathsf{y}
,
\mathsf{z}
)]$}%
%
\index{occur @\back $[
occur(
\mathsf{x}
,
\mathsf{y}
,
\mathsf{z}
)]$ occur x in y substitution z end occur}%
%
\tex{$
[
occur(
\mathsf {t}
,
\mathsf {u}
,
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline occur(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
occur(
\mathsf {t}
,
\mathsf {u}
,
\mathsf {s}
)
\mathrel {\dot {=}}
\mathsf {s}
!
\mathrm {If}(
\mathsf {u}
{}^c
,\linebreak [0]
\mathsf {t}
\approx 
\mathsf {u}
\mathrel{\ddot{\vee}} 
occur(
\mathsf {t}
,
\mathsf {s}
{[}
\mathsf {u}
{]}
,
\mathsf {s}
)
,\linebreak [0]
occur^*(
\mathsf {t}
,
\mathsf {u}
{}^t
,
\mathsf {s}
)
)
]$%
}
%

%
\index{occur star x in y substitution z end occur $[
occur^*(
\mathsf{x}
,
\mathsf{y}
,
\mathsf{z}
)]$}%
%
\index{occur @\back $[
occur^*(
\mathsf{x}
,
\mathsf{y}
,
\mathsf{z}
)]$ occur star x in y substitution z end occur}%
%
\tex{$
[
occur^*(
\mathsf {t}
,
\mathsf {u}
,
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline occur
{\char94}
{*}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
occur^*(
\mathsf {t}
,
\mathsf {u}
,
\mathsf {s}
)
\mathrel {\dot {=}}
\mathsf {t}
!
\mathsf {s}
!
\mathrm {If}(
\mathsf {u}
{}^a
,\linebreak [0]
\mathsf {F}
,\linebreak [0]
occur(
\mathsf {t}
,
\mathsf {u}
{}^h
,
\mathsf {s}
)
\mathrel{\ddot{\vee}} 
occur^*(
\mathsf {t}
,
\mathsf {u}
{}^t
,
\mathsf {s}
)
)
]$%
}
%

\test{math test occur eight in parameter term quote not all var x indeed var x end quote substitution true end occur end test end math}

\test{math false test occur nine in parameter term quote not all var x indeed var x end quote substitution true end occur end test end math}



\subsubsection{Unifications}

We shall refer to the result of applying a substitution to a parameter term as an \indexintro{instance} of the term. We shall refer to a common instance of two parameter terms as a \indexintro{unification} of the terms. As an example, $[{\cal A}
\mathrel { : \, : }
\mathsf {F}]$ and $[
\mathsf {T}
\mathrel { : \, : }{\cal B}]$ (where $[{\cal A}]$ and $[{\cal B}]$ denote numbers) have exactly one unification, namely $[
\mathsf {T}
\mathrel { : \, : }
\mathsf {F}]$. We shall say that two terms are \indexintro{compatible} if they have at least one unification and \indexintro{incompatible} otherwise.

A substitution which yields the same result when applied to two terms $[
\mathsf {u}]$ and $[
\mathsf {v}]$ is said to \indexintro{unify} the terms. As an example, the substitution which maps $[{\cal A}]$ to $[
\mathsf {T}]$ and $[{\cal B}]$ to $[
\mathsf {F}]$ unifies $[{\cal A}
\mathrel { : \, : }
\mathsf {F}]$ and $[
\mathsf {T}
\mathrel { : \, : }{\cal B}]$.

The \index{algorithm, unification}\indexintro{unification algorithm} presented in the following takes two terms as input and returns a unifying substitution if the terms are compatible. As an example, when applied to $[{\cal A}
\mathrel { : \, : }
\mathsf {F}]$ and $[
\mathsf {T}
\mathrel { : \, : }{\cal B}]$, the unification algorithm returns the substitution which maps $[{\cal A}]$ to $[
\mathsf {T}]$ and $[{\cal B}]$ to $[
\mathsf {F}]$.

There is more than one substitution which unifies $[{\cal A}
\mathrel { : \, : }
\mathsf {F}]$ and $[
\mathsf {T}
\mathrel { : \, : }{\cal B}]$. As an example the substitution that maps $[{\cal A}]$ to $[
\mathsf {T}]$, $[{\cal B}]$ to $[
\mathsf {F}]$, and $[{\cal C}]$ to some term $[
\mathsf{x}]$ also unifies $[{\cal A}
\mathrel { : \, : }
\mathsf {F}]$ and $[
\mathsf {T}
\mathrel { : \, : }{\cal B}]$.



\subsubsection{Unification algorithm}

The original unification algorithm by Robinson takes a set of equations (i.e.\ a set of pairs of parameter terms) as input and unifies all the pairs. In contrast, $[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ defined below adds the result of unifying $[
\mathsf {t}]$ and $[
\mathsf {u}]$ to the substitution $[
\mathsf {s}]$. To unify a set of equations one should start with the empty substitution $[
\mathsf {T}]$ and call $[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ once for each equation.

$[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ extends the substitution $[
\mathsf {s}]$ to a substitution that unifies $[
\mathsf {t}]$ with $[
\mathsf {u}]$ if such a substitution exists and returns $[
0]$ otherwise. In particular, $[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ returns zero if $[
\mathsf {s}]$ equals zero since in that case there is no substitution to extend.

$[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ calls to auxiliary functions, $[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ and $[
unify^*(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$. $[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ does the same as $[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ but only covers the special case where $[
\mathsf {t}]$ is a parameter. $[
unify^*(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ unifies two lists $[
\mathsf {t}]$ and $[
\mathsf {u}]$ of parameter terms.

$[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ errors out if $[
\mathsf {s}
\approx 
0]$, calls $[
unify_2(
\ast 
=
\ast 
,
\ast 
)]$ if $[
\mathsf {t}]$ or $[
\mathsf {u}]$ happens to be a parameter, and calls $[
unify^*(
\ast 
=
\ast 
,
\ast 
)]$ otherwise:

%
\index{unify x with y substitution z end unify $[
unify(
\mathsf{x}
=
\mathsf{y}
,
\mathsf{z}
)]$}%
%
\index{unify @\back $[
unify(
\mathsf{x}
=
\mathsf{y}
,
\mathsf{z}
)]$ unify x with y substitution z end unify}%
%
\tex{$
[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline unify(
\#1.
\newline 
{=}
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)
\mathrel {\dot {=}}
\mathsf {t}
!
\mathsf {u}
!
\newline 
{\bf if} \ 
\mathsf {s}
{}^c
\ {\bf then} \ 
\mathsf {s}
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
{}^c
\ {\bf then} \ 
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {u}
{}^c
\ {\bf then} \ 
unify_2(
\mathsf {u}
=
\mathsf {t}
,
\mathsf {s}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {t}
\stackrel{r}{=} 
\mathsf {u}
\ {\bf then} \ 
unify^*(
\mathsf {t}
{}^t
=
\mathsf {u}
{}^t
,
\mathsf {s}
)
\ {\bf else} \ 
0
]$%
}
%

$[
unify^*(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ iterates $[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$; it depends on the fact that $[
unify(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ equals zero if $[
\mathsf {s}]$ equals zero so that failure to find a unification propagates.

%
\index{unify star x with y substitution z end unify $[
unify^*(
\mathsf{x}
=
\mathsf{y}
,
\mathsf{z}
)]$}%
%
\index{unify @\back $[
unify^*(
\mathsf{x}
=
\mathsf{y}
,
\mathsf{z}
)]$ unify star x with y substitution z end unify}%
%
\tex{$
[
unify^*(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline unify
{\char94}
{*}(
\#1.
\newline 
{=}
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
unify^*(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)
\mathrel {\dot {=}}
\mathsf {u}
!
\mathrm {If}(
\mathsf {t}
{}^a
,\linebreak [0]
\mathsf {s}
,\linebreak [0]
unify^*(
\mathsf {t}
{}^t
=
\mathsf {u}
{}^t
,
unify(
\mathsf {t}
{}^h
=
\mathsf {u}
{}^h
,
\mathsf {s}
)
)
)
]$%
}
%

$[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ extends the substitution $[
\mathsf {s}]$ with the result of unifying the parameter $[
\mathsf {t}]$ with the parameter term $[
\mathsf {u}]$. $[
\mathsf {s}]$ is assumed to be a genuine substituion (i.e.\ not zero). Furthermore, $[
\mathsf {s}]$ is assumed to be non-circular.

$[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ first tests $[
\mathsf {t}]$ and $[
\mathsf {u}]$ for equality. If they are equal, they are already unified and $[
\mathsf {s}]$ is returned. Otherwise, if $[
\mathsf {s}]$ already associates the parameter $[
\mathsf {t}]$ with a term, then $[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ unifies $[
\mathsf {u}]$ with that term. Otherwise, $[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ extends the substitution $[
\mathsf {s}]$ with an association from $[
\mathsf {t}]$ to $[
\mathsf {u}]$. If $[
occur(
\mathsf {t}
,
\mathsf {u}
,
\mathsf {s}
)]$ is true, however, such an association would create a circular substitution. In that case no unification exists and $[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)]$ returns zero:

%
\index{unify two x with y substitution z end unify $[
unify_2(
\mathsf{x}
=
\mathsf{y}
,
\mathsf{z}
)]$}%
%
\index{unify @\back $[
unify_2(
\mathsf{x}
=
\mathsf{y}
,
\mathsf{z}
)]$ unify two x with y substitution z end unify}%
%
\tex{$
[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline unify
\_2(
\#1.
\newline 
{=}
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
unify_2(
\mathsf {t}
=
\mathsf {u}
,
\mathsf {s}
)
\mathrel {\dot {=}}
\newline 
{\bf if} \ 
\mathsf {t}
\approx 
\mathsf {u}
\ {\bf then} \ 
\mathsf {s}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {t}'
= 
\mathsf {s}
{[}
\mathsf {t}
{]}
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
{\neg }
\mathsf {t}'
\ {\bf then} \ 
unify(
\mathsf {t}'
=
\mathsf {u}
,
\mathsf {s}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
occur(
\mathsf {t}
,
\mathsf {u}
,
\mathsf {s}
)
\ {\bf then} \ 
0
\ {\bf else} \ 
\mathsf {s}
[ 
\mathsf {t}
{\rightarrow} 
\mathsf {u}
]
]$%
}
%

\test{$
\relax [ 
unify(
\lceil 
2
\rceil 
=
\lceil 
2
\rceil 
,
\mathsf {T}
)
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
\lceil 
2
\rceil 
=
\lceil 
3
\rceil 
,
\mathsf {T}
)
\approx 
0
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
\lceil 
2
+ 
3
\rceil 
=
\lceil 
2
+ 
3
\rceil 
,
\mathsf {T}
)
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
\lceil 
2
+ 
3
\rceil 
=
\lceil 
2
+ 
4
\rceil 
,
\mathsf {T}
)
\approx 
0
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
\lceil 
2
\rceil 
=
3
,
\mathsf {T}
)
{[}
3
{]}
\stackrel {t}{=}
\lceil 
2
\rceil 
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
3
=
\lceil 
2
\rceil 
,
\mathsf {T}
)
{[}
3
{]}
\stackrel {t}{=}
\lceil 
2
\rceil 
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
\langle 
\lceil 
\mathsf{x}
+ 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
1
,\linebreak [0] 
\lceil 
3
\rceil 
\rangle 
=
\lceil 
2
+ 
3
\rceil 
,
\mathsf {T}
)
{[}
1
{]}
\stackrel {t}{=}
\lceil 
2
\rceil 
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
\langle 
\lceil 
\mathsf{x}
+ 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
1
,\linebreak [0] 
\lceil 
3
\rceil 
\rangle 
=
\langle 
\lceil 
\mathsf{x}
+ 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\lceil 
2
\rceil 
,\linebreak [0] 
2
\rangle 
,
\mathsf {T}
)
{[}
1
{]}
\stackrel {t}{=}
\lceil 
2
\rceil 
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
parm(
\lceil {\cal A}
+ 
3
\rceil 
,
\langle 
\lceil {\cal A}
\rceil 
\mathrel { : \, : }
1
\rangle 
,
1
)
=
parm(
\lceil 
2
+ {\cal B}
\rceil 
,
\langle 
\lceil {\cal B}
\rceil 
\mathrel { : \, : }
2
\rangle 
,
1
)
,
\mathsf {T}
)
{[}
1
{]}
\stackrel {t}{=}
\lceil 
2
\rceil 
\relax ]^{\cdot} $}

\test{$
\relax [ 
unify(
parm(
\lceil {\cal A}
+ 
3
\rceil 
,
\langle 
\lceil {\cal A}
\rceil 
\mathrel { : \, : }
1
\rangle 
,
1
)
=
parm(
\lceil 
2
+ {\cal B}
\rceil 
,
\langle 
\lceil {\cal B}
\rceil 
\mathrel { : \, : }
2
\rangle 
,
1
)
,
\mathsf {T}
)
{[}
2
{]}
\stackrel {t}{=}
\lceil 
3
\rceil 
\relax ]^{\cdot} $}

\test{$
\relax [ 
inst(
parm(
\lceil {\cal A}
+ {\cal B}
\rceil 
,
\langle 
\lceil {\cal A}
\rceil 
\mathrel { : \, : }
1
,\linebreak [0] 
\lceil {\cal B}
\rceil 
\mathrel { : \, : }
2
\rangle 
,
1
)
,
unify(
parm(
\lceil {\cal A}
+ 
3
\rceil 
,
\langle 
\lceil {\cal A}
\rceil 
\mathrel { : \, : }
1
\rangle 
,
1
)
=
parm(
\lceil 
2
+ {\cal B}
\rceil 
,
\langle 
\lceil {\cal B}
\rceil 
\mathrel { : \, : }
2
\rangle 
,
1
)
,
\mathsf {T}
)
)
\stackrel {t}{=}
\lceil 
2
+ 
3
\rceil 
\relax ]^{\cdot} $}



\subsection{Proof generation}\label{section:ProofGeneration}

\subsubsection{Proof tactics}

Counted in sequent operators, proofs typically comprise a small amount of original thought and a lot of trivial derivations. Frequently, trivial derivations can be generated by computer programs. Such programs are typically called \index{tactic, proof}\intro{tactics} or \index{proof tactic}\intro{proof tactics} \cite{Gordon79}.

To support proof tactics, we introduce a \indexintro{tactic aspect} for defining them and a  \indexintro{proof expander} for evaluating them. The proof  evaluator evaluates proof tactics and generates sequent proofs, which the proof evaluator may then evaluate to sequents.

The proof expander is itself a tactic since it generates proofs. The proof expander is a value defined tactic like the rule lemma tactic defined previously. But the proof expander is a particularly general tactic which brings life to tactics that are defined using the ``tactic aspect'' which is introduced later.



\subsubsection{Medium level proofs}\label{section:MediumLevelProofs}

The proof tactics and the proof expander defined later can translate medium level proofs like those below to Logiweb sequent calculus proofs like those in Section \ref{section:ExampleLemmas}. Actually, the proofs below exactly translate to the proofs in Section \ref{section:ExampleLemmas}. We start out proving reflexivity:

%
\index{tactic reflexivity $[
Reflexivity_1]$}%
%
\index{Reflexivity @\back $[
Reflexivity_1]$ tactic reflexivity}%
%
\tex{$
[
Reflexivity_1
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Reflexivity
\_1
\mbox{''}
]$}%
%
\statement{$
[ 
T_E
\mathbf{\ lemma\ } 
Reflexivity_1
\colon 
\forall {\cal A}
\colon {\cal A}
={\cal A}
]$%
}
%

\statement{$
\if\relax\csname lgwprooflinep\endcsname
\def\lgwprooflinep{x}
\newcount\lgwproofline
\fi
\begingroup
\def\insideproof{x}
\lgwproofline=0 
T_E
\mathbf {\ proof\ of\ } 
Reflexivity_1
\colon 
\newline \makebox [0.1\textwidth ][l]{$
\if \relax \csname lgwprooflinep\endcsname L_? \else
\global \advance \lgwproofline by 1
L\ifnum \lgwproofline <10 0\fi \number \lgwproofline
\fi 
$:}\makebox [0.4\textwidth ][l]{$Arbitrary{}\gg{}$}\quad
\parbox [t]{0.4\textwidth }{${\cal A}
$\hfill \makebox [0mm][l]{\quad ;}}
\newline \makebox [0.1\textwidth]{}%
\parbox [b]{0.4\textwidth }{\raggedright
\setlength {\parindent }{-0.1\textwidth }%
\makebox [0.1\textwidth ][l]{$
\if \relax \csname lgwprooflinep\endcsname L_b \else
\if \relax \csname lgwellb\endcsname
\global \advance \lgwproofline by 1
\xdef \lgwellb {L\ifnum \lgwproofline <10 0\fi \number \lgwproofline }
\fi \lgwellb \fi 
$:}$
HeadPair
{}\gg {}$}\quad
\parbox [t]{0.4\textwidth }{$
({\cal A}
\mathrel { : \, : }{\cal A}
)
{}^h
={\cal A}
$\hfill \makebox [0mm][l]{\quad ;}}
\newline \makebox [0.1\textwidth]{}%
\parbox [b]{0.4\textwidth }{\raggedright
\setlength {\parindent }{-0.1\textwidth }%
\makebox [0.1\textwidth ][l]{$
\if \relax \csname lgwprooflinep\endcsname L_? \else
\global \advance \lgwproofline by 1
L\ifnum \lgwproofline <10 0\fi \number \lgwproofline
\fi 
$:}$
Transitivity
\rhd 
\if \relax \csname lgwprooflinep\endcsname L_b \else
\if \relax \csname lgwellb\endcsname
\global \advance \lgwproofline by 1
\xdef \lgwellb {L\ifnum \lgwproofline <10 0\fi \number \lgwproofline }
\fi \lgwellb \fi 
\rhd 
\if \relax \csname lgwprooflinep\endcsname L_b \else
\if \relax \csname lgwellb\endcsname
\global \advance \lgwproofline by 1
\xdef \lgwellb {L\ifnum \lgwproofline <10 0\fi \number \lgwproofline }
\fi \lgwellb \fi 
{}\gg {}$}\quad
\parbox [t]{0.4\textwidth }{${\cal A}
={\cal A}
$\hfill \makebox [0mm][l]{\quad \makebox[0mm]{$\Box$}}}
\gdef\lgwella{\relax}
\gdef\lgwellb{\relax}
\gdef\lgwellc{\relax}
\gdef\lgwelld{\relax}
\gdef\lgwelle{\relax}
\gdef\lgwellf{\relax}
\gdef\lgwellg{\relax}
\gdef\lgwellh{\relax}
\gdef\lgwelli{\relax}
\gdef\lgwellj{\relax}
\gdef\lgwellk{\relax}
\gdef\lgwelll{\relax}
\gdef\lgwellm{\relax}
\gdef\lgwelln{\relax}
\gdef\lgwello{\relax}
\gdef\lgwellp{\relax}
\gdef\lgwellq{\relax}
\gdef\lgwellr{\relax}
\gdef\lgwells{\relax}
\gdef\lgwellt{\relax}
\gdef\lgwellu{\relax}
\gdef\lgwellv{\relax}
\gdef\lgwellw{\relax}
\gdef\lgwellx{\relax}
\gdef\lgwelly{\relax}
\gdef\lgwellz{\relax}
\gdef\lgwellbiga{\relax}
\gdef\lgwellbigb{\relax}
\gdef\lgwellbigc{\relax}
\gdef\lgwellbigd{\relax}
\gdef\lgwellbige{\relax}
\gdef\lgwellbigf{\relax}
\gdef\lgwellbigg{\relax}
\gdef\lgwellbigh{\relax}
\gdef\lgwellbigi{\relax}
\gdef\lgwellbigj{\relax}
\gdef\lgwellbigk{\relax}
\gdef\lgwellbigl{\relax}
\gdef\lgwellbigm{\relax}
\gdef\lgwellbign{\relax}
\gdef\lgwellbigo{\relax}
\gdef\lgwellbigp{\relax}
\gdef\lgwellbigq{\relax}
\gdef\lgwellbigr{\relax}
\gdef\lgwellbigs{\relax}
\gdef\lgwellbigt{\relax}
\gdef\lgwellbigu{\relax}
\gdef\lgwellbigv{\relax}
\gdef\lgwellbigw{\relax}
\gdef\lgwellbigx{\relax}
\gdef\lgwellbigy{\relax}
\gdef\lgwellbigz{\relax}
\endgroup $}

In the proof above, the first line declares that $[{\cal A}]$ denotes an arbitrary term.

The second line uses $[
HeadPair]$ to prove $[
({\cal A}
\mathrel { : \, : }{\cal A}
)
{}^h
={\cal A}]$. In Section \ref{section:ExampleLemmas}, that statement is proved by $[
HeadPair
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
{} ^ { \rhd }
\mathop {\char64} {\cal A}
\mathop {\char64} {\cal A}]$. As we shall see, the tactic introduced in Section \ref{section:TheConclusionTactic} adds the $[
\ast 
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
{} ^ { \rhd }]$ formula for referencing lemmas. That tactic also adds the $[\cdots
\mathop {\char64} {\cal A}
\mathop {\char64} {\cal A}]$ for instantiating the meta-quantifiers in $[
HeadPair]$. The tactic uses unification and $[\cdots
\gg 
({\cal A}
\mathrel { : \, : }{\cal A}
)
{}^h
={\cal A}]$ to decide that both meta-quantifiers should be instantiated to an $[{\cal A}]$.

The third line uses $[
Transitivity]$ and the meta-modus-ponens operator $[
\ast 
\rhd 
\ast ]$ to prove $[{\cal A}
={\cal A}]$. The tactic defined in Section \ref{section:TheConclusionTactic} translates a meta-modus-ponens into a modus operation followed by a cut (c.f.\ the expanded proof in Section \ref{section:ExampleLemmas}).

The tactic can expand modus ponens $[
\ast 
\rhd 
\ast ]$ and modus probans $[
\ast 
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\ast ]$. Modus ponens says that if $[{\cal A}]$ is proved and $[{\cal A}]$ infers $[{\cal B}]$ then we may conclude $[{\cal B}]$. Modus probans (``probans'' for ``approve'') says that if $[{\cal A}]$ is known to evaluate to $[
\mathsf {T}]$ and the side condition $[{\cal A}]$ endorses $[{\cal B}]$ then we may conclude $[{\cal B}]$.

The tactic eliminates side conditions using modus probans when told to do so using $[
\ast 
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\ast ]$ and otherwise eliminates them using the $[
\ast 
{} ^ { V } ]$ sequent operation which actually evaluates the side condition. Modus probans is useful in situations where a lemma assumes some side condition to hold. Assumed side-conditions are introduced in proofs using a Side-condition operation which is similar to the Premise used in Line 3 of the proof of $[
Commutativity_1]$ stated in a moment.

Line 3 above contains two references to Line 2. Each reference expands into the conclusion of Line 2 at macro expansion time. Hence, Line 3 reads $[
Transitivity
\rhd 
({\cal A}
\mathrel { : \, : }{\cal A}
)
{}^h
={\cal A}
\rhd 
({\cal A}
\mathrel { : \, : }{\cal A}
)
{}^h
={\cal A}
\gg {\cal A}
={\cal A}]$ when the proof tactic is invoked.

Now let us turn to the proof of $[
Commutativity_1]$:

%
\index{tactic commutativity $[
Commutativity_1]$}%
%
\index{commutativity @\back $[
Commutativity_1]$ tactic commutativity}%
%
\tex{$
[
Commutativity_1
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline Commutativity
\_1
\mbox{''}
]$}%
%
\statement{$
[ 
T_E
\mathbf{\ lemma\ } 
Commutativity_1
\colon 
\forall {\cal A}
\colon 
\forall {\cal B}
\colon {\cal A}
={\cal B}
\vdash {\cal B}
={\cal A}
]$%
}
%

\statement{$
\if\relax\csname lgwprooflinep\endcsname
\def\lgwprooflinep{x}
\newcount\lgwproofline
\fi
\begingroup
\def\insideproof{x}
\lgwproofline=0 
T_E
\mathbf {\ proof\ of\ } 
Commutativity_1
\colon 
\newline \makebox [0.1\textwidth ][l]{$
\if \relax \csname lgwprooflinep\endcsname L_? \else
\global \advance \lgwproofline by 1
L\ifnum \lgwproofline <10 0\fi \number \lgwproofline
\fi 
$:}\makebox [0.4\textwidth ][l]{$Arbitrary{}\gg{}$}\quad
\parbox [t]{0.4\textwidth }{${\cal A}
$\hfill \makebox [0mm][l]{\quad ;}}
\newline \makebox [0.1\textwidth ][l]{$
\if \relax \csname lgwprooflinep\endcsname L_? \else
\global \advance \lgwproofline by 1
L\ifnum \lgwproofline <10 0\fi \number \lgwproofline
\fi 
$:}\makebox [0.4\textwidth ][l]{$Arbitrary{}\gg{}$}\quad
\parbox [t]{0.4\textwidth }{${\cal B}
$\hfill \makebox [0mm][l]{\quad ;}}
\newline \makebox [0.1\textwidth ][l]{$
\if \relax \csname lgwprooflinep\endcsname L_a \else
\if \relax \csname lgwella\endcsname
\global \advance \lgwproofline by 1
\xdef \lgwella {L\ifnum \lgwproofline <10 0\fi \number \lgwproofline }
\fi \lgwella \fi 
$:}\makebox [0.4\textwidth ][l]{$Premise{}\gg{}$}\quad
\parbox [t]{0.4\textwidth }{${\cal A}
={\cal B}
$\hfill \makebox [0mm][l]{\quad ;}}
\newline \makebox [0.1\textwidth]{}%
\parbox [b]{0.4\textwidth }{\raggedright
\setlength {\parindent }{-0.1\textwidth }%
\makebox [0.1\textwidth ][l]{$
\if \relax \csname lgwprooflinep\endcsname L_b \else
\if \relax \csname lgwellb\endcsname
\global \advance \lgwproofline by 1
\xdef \lgwellb {L\ifnum \lgwproofline <10 0\fi \number \lgwproofline }
\fi \lgwellb \fi 
$:}$
Reflexivity_1
{}\gg {}$}\quad
\parbox [t]{0.4\textwidth }{${\cal A}
={\cal A}
$\hfill \makebox [0mm][l]{\quad ;}}
\newline \makebox [0.1\textwidth]{}%
\parbox [b]{0.4\textwidth }{\raggedright
\setlength {\parindent }{-0.1\textwidth }%
\makebox [0.1\textwidth ][l]{$
\if \relax \csname lgwprooflinep\endcsname L_? \else
\global \advance \lgwproofline by 1
L\ifnum \lgwproofline <10 0\fi \number \lgwproofline
\fi 
$:}$
Transitivity
\rhd 
\if \relax \csname lgwprooflinep\endcsname L_a \else
\if \relax \csname lgwella\endcsname
\global \advance \lgwproofline by 1
\xdef \lgwella {L\ifnum \lgwproofline <10 0\fi \number \lgwproofline }
\fi \lgwella \fi 
\rhd 
\if \relax \csname lgwprooflinep\endcsname L_b \else
\if \relax \csname lgwellb\endcsname
\global \advance \lgwproofline by 1
\xdef \lgwellb {L\ifnum \lgwproofline <10 0\fi \number \lgwproofline }
\fi \lgwellb \fi 
{}\gg {}$}\quad
\parbox [t]{0.4\textwidth }{${\cal B}
={\cal A}
$\hfill \makebox [0mm][l]{\quad \makebox[0mm]{$\Box$}}}
\gdef\lgwella{\relax}
\gdef\lgwellb{\relax}
\gdef\lgwellc{\relax}
\gdef\lgwelld{\relax}
\gdef\lgwelle{\relax}
\gdef\lgwellf{\relax}
\gdef\lgwellg{\relax}
\gdef\lgwellh{\relax}
\gdef\lgwelli{\relax}
\gdef\lgwellj{\relax}
\gdef\lgwellk{\relax}
\gdef\lgwelll{\relax}
\gdef\lgwellm{\relax}
\gdef\lgwelln{\relax}
\gdef\lgwello{\relax}
\gdef\lgwellp{\relax}
\gdef\lgwellq{\relax}
\gdef\lgwellr{\relax}
\gdef\lgwells{\relax}
\gdef\lgwellt{\relax}
\gdef\lgwellu{\relax}
\gdef\lgwellv{\relax}
\gdef\lgwellw{\relax}
\gdef\lgwellx{\relax}
\gdef\lgwelly{\relax}
\gdef\lgwellz{\relax}
\gdef\lgwellbiga{\relax}
\gdef\lgwellbigb{\relax}
\gdef\lgwellbigc{\relax}
\gdef\lgwellbigd{\relax}
\gdef\lgwellbige{\relax}
\gdef\lgwellbigf{\relax}
\gdef\lgwellbigg{\relax}
\gdef\lgwellbigh{\relax}
\gdef\lgwellbigi{\relax}
\gdef\lgwellbigj{\relax}
\gdef\lgwellbigk{\relax}
\gdef\lgwellbigl{\relax}
\gdef\lgwellbigm{\relax}
\gdef\lgwellbign{\relax}
\gdef\lgwellbigo{\relax}
\gdef\lgwellbigp{\relax}
\gdef\lgwellbigq{\relax}
\gdef\lgwellbigr{\relax}
\gdef\lgwellbigs{\relax}
\gdef\lgwellbigt{\relax}
\gdef\lgwellbigu{\relax}
\gdef\lgwellbigv{\relax}
\gdef\lgwellbigw{\relax}
\gdef\lgwellbigx{\relax}
\gdef\lgwellbigy{\relax}
\gdef\lgwellbigz{\relax}
\endgroup $}

The proof above only contains one new thing: Line 3 assumes $[{\cal A}
={\cal B}]$.



\subsubsection{The ``tactic'' aspect}

We now return to the actual implementation of proof tactics and the proof expander. We make the $[
{<}tactic{>}]$ aspect self-evaluating and use $[
tactic]$ to denote it:

%
\index{tactic @\back $[
{<}tactic{>}]$ the tactic aspect}%
%
\index{the tactic aspect $[
{<}tactic{>}]$}%
%
\tex{$
[
{<}tactic{>}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
{<}
\}tactic
\{
{>}
\}
\mbox{''}
]$}%
%
\display{$
[
{<}tactic{>}
\mathrel {\dot {=}}
\lceil 
{<}tactic{>}
\rceil 
]$%
}
%

%
\index{tactic $[
tactic]$}%
%
\tex{$
[
tactic
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline tactic
\mbox{''}
]$}%
%
\display{$
[
tactic
\stackrel {msg}{=} 
{<}tactic{>}
]$%
}
%

For convenience, we define a construct for making tactic definitions:

\index{tactic define x as y end define $
[
\mathsf{x}
\stackrel {tactic}{=}
\mathsf{y}
]$}%
%
\index{tactic: $
[
\mathsf{x}
\stackrel {tactic}{=}
\mathsf{y}
]$}%
%
\tex{$
[
[
\mathsf{x}
\stackrel {tactic}{=}
\mathsf{y}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{tactic
\}
\{
{=}
\}
\#2.
\newline ]
\mbox{''}
]$}%
%
\display{%
$
[
[
\mathsf{x}
\stackrel {tactic}{=}
\mathsf{y}
]
\mathrel {\ddot {=}}
[(
\mathsf{x}
)^{\mathbf {p}}
\stackrel{
tactic
}{\rightarrow}
\mathsf{y}
]
]$%
}



\subsubsection{The proof expander}

The proof expander $[
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)]$ proof expands the term $[
\mathsf {t}]$ for the \indexintro{proof state} $[
\mathsf {s}]$ and the cache $[
\mathsf {c}]$ and returns the result as a semitagged map. The untagged version $[
{\cal U}(
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)
)]$ is the expansion itself.

The proof expander $[
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)]$ differs from the macro expander $[
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ in that it has no special treatment for page symbols and in that it uses the $[
tactic]$ aspect instead of the $[
\mathrm {macro}]$ aspect.

When proofs are expanded, they are first macro expanded and then proof expanded. Macro expansion is done iteratively until the codex reaches a fixed point whereas proof expansion is done only once. Furthermore, the result of macro expansion is kept in the codex whereas the result of proof expansion is discarded as soon as a proof is checked. Hence, proof expansion is a momentary burden to the computers memory whereas macro expansion is chronic.

The definition of $[
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)]$ is almost identical to that of $[
{\cal M}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$. But it is easier to express since we can use macros like the `let' macro when defining proof expansion. For obvious reasons, macros cannot be used when defining the notion of macro expansion. The definition of $[
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)]$ reads:

%
\index{p: $[
{\cal P}( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ proof expand x state y cache z end expand}%
%
\tex{$
[
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}P
\}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)
\mathrel {\dot {=}}
\mathsf {s}
!
\newline 
\mathbf{let\ } 
\mathsf {d}
= 
\mathbf{aspect}( 
{<}tactic{>}
, 
\mathsf {t}
, 
\mathsf {c}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {d}
\ {\bf then} \ 
\mathsf {t}
{}^h
\mathrel { : \, : }
{\cal P}^*( 
\mathsf {t}
{}^t
, 
\mathsf {s}
, 
\mathsf {c}
)
\ {\bf else} \ 
\newline 
{\cal U}^M(
{\cal E}(
\mathsf {d}
{}^{3}
,
\mathsf {T}
,
\mathsf {c}
)
\mathbin {\mbox {`}}
\mathsf {t}
\mathbin {\mbox {`}}
\mathsf {s}
\mathbin {\mbox {`}}
\mathsf {c}
)
]$%
}
%

%
\index{p: $[
{\cal P}^*( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ proof expand list x state y cache z end expand}%
%
\tex{$
[
{\cal P}^*( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}P
\}
{\char94}
{*}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
{\cal P}^*( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)
\mathrel {\dot {=}}
\mathsf {s}
!
\mathsf {c}
!
\mathrm {If}(
\mathsf {t}
,\linebreak [0]
\mathsf {T}
,\linebreak [0]
{\cal P}( 
\mathsf {t}
{}^h
, 
\mathsf {s}
, 
\mathsf {c}
)
\mathrel { : \, : }
{\cal P}^*( 
\mathsf {t}
{}^t
, 
\mathsf {s}
, 
\mathsf {c}
)
)
]$%
}
%



\subsubsection{The initial proof state}

Proof states have exactly the same format as macro states.

The \index{proof state, initial}\indexintro{initial proof state} $[
p_0]$ is useful for passing as the second parameter to $[
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)]$. $[
p_0]$ is a pair whose head is the proof expander itself and whose tail is left blank. The definition of $[
p_0]$ reads:

%
\index{p: $[
p_0]$ proof state}%
%
\tex{$
[
p_0
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline p
\_0
\mbox{''}
]$}%
%
\display{$
[
p_0
\stackrel{
\mathrm {val}
}{\rightarrow}
{\cal M}(
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
{\cal P}( 
\mathsf {t}
, 
\mathsf {s}
, 
\mathsf {c}
)
)
\mathrel { : \, : }
\mathsf {T}
]$%
}
%

The function $[
\tilde {{\cal M}}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ defined previously macro expands the term $[
\mathsf {t}]$ using the macro expander embedded in the macro state $[
\mathsf {s}]$ using the cache $[
\mathsf {c}]$. Since proof states have exactly the same syntax and semantics as macro states, we shall take the liberty to use $[
\tilde {{\cal M}}(
\mathsf {t}
,
\mathsf {s}
,
\mathsf {c}
)]$ for proof states also.



\subsubsection{The conclusion tactic}\label{section:TheConclusionTactic}

The \index{tactic, conclusion}\indexintro{conclusion tactic} $[
\mathsf{x}
\gg 
\mathsf{y}]$ constructs a proof of $[
\mathsf{y}]$ from the partial proof $[
\mathsf{x}]$ as described in Section \ref{section:MediumLevelProofs}.

Among other, the tactic tactic expands modus ponens $[
\mathsf{x}
\rhd 
\mathsf{y}]$ and modus probans $[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\mathsf{y}]$ which we make self-evaluating:

%
\index{\alpha x modus ponens y @\back $[
\mathsf{x}
\rhd 
\mathsf{y}]$ x modus ponens y}%
%
\tex{$
[
\mathsf{x}
\rhd 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}rhd
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\rhd 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
\rhd 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$%
}
%

%
\index{\alpha x modus probans y @\back $[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\mathsf{y}]$ x modus probans y}%
%
\tex{$
[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\$
\mbox {$\backslash $}rhd
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\}
\mbox {$\backslash $},
\{
\mbox {$\backslash $}rhd
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\mathsf{y}
\mathrel {\dot {=}}
\langle 
\lceil 
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\mathsf{y}
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf{x}
,\linebreak [0] 
\mathsf{y}
\rangle 
]$%
}
%

The conclusion tactic is defined thus:

%
\index{\alpha x conclude y @\back $[
\mathsf{x}
\gg 
\mathsf{y}]$ x conclude y}%
%
\tex{$
[
\mathsf{x}
\gg 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\display{$
[
\mathsf{x}
\gg 
\mathsf{y}
\stackrel {tactic}{=}
\lambda 
\mathsf {t}
.
\lambda 
\mathsf {s}
.
\lambda 
\mathsf {c}
.
conclude_1 ( 
\mathsf {t}
, 
\mathsf {c}
)
]$%
}
%

%
\index{conclude @\back $[
conclude_1 ( 
\mathsf{x}
, 
\mathsf{y}
)]$ conclude one x cache y end conclude}%
%
\tex{$
[
conclude_1 ( 
\mathsf {t}
, 
\mathsf {c}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline conclude
\_1
\linebreak [0]\ \hskip0em plus2.0em{}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
conclude_1 ( 
\mathsf {t}
, 
\mathsf {c}
)
\mathrel {\dot {=}}
\newline 
\mathbf{let\ } 
\mathsf {r}
= 
conclude_2 ( 
\mathsf {t}
{}^{1}
, 
\mathsf {t}
{}^{2}
, 
\mathsf {c}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {r}
{}^c
\ {\bf then} \ 
error(
\mbox{``}Unification
\linebreak [0]\ \hskip0em plus2.0em{}failed
\mbox{''}
,
\mathsf {t}
)
\ {\bf else} \ 
\mathsf {r}
]$%
}
%

%
\index{conclude @\back $[
conclude_2 ( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
)]$ conclude two x proves y cache z end conclude}%
%
\tex{$
[
conclude_2 ( 
\mathsf {a}
, 
\mathsf {t}
, 
\mathsf {c}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline conclude
\_2
\linebreak [0]\ \hskip0em plus2.0em{}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline )
\mbox{''}
]$}%
%
\display{$
[
conclude_2 ( 
\mathsf {a}
, 
\mathsf {t}
, 
\mathsf {c}
)
\mathrel {\dot {=}}
\mathsf {t}
!
\newline 
{\bf if} \ 
\mathsf {a}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\rhd 
\mathsf{y}
\rceil 
\ {\bf then} \ 
conclude_2 ( 
\mathsf {a}
{}^{1}
, 
\mathsf {a}
\mbox {-color}( 
\mathsf {t}
\rhd 
\mathsf {a}
{}^{2}
)
, 
\mathsf {c}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {a}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\mathsf{y}
\rceil 
\ {\bf then} \ 
conclude_2 ( 
\mathsf {a}
{}^{1}
, 
\mathsf {a}
\mbox {-color}( 
\mathsf {t}
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\mathsf {a}
{}^{2}
)
, 
\mathsf {c}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {a}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\mathop {\char64} 
\mathsf{y}
\rceil 
\ {\bf then} \ 
conclude_2 ( 
\mathsf {a}
{}^{1}
, 
\mathsf {a}
\mbox {-color}( 
\mathsf {t}
\mathop {\char64} 
\mathsf {a}
{}^{2}
)
, 
\mathsf {c}
)
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathbf{aspect}( 
{<}proof{>}
, 
\mathsf {a}
, 
\mathsf {c}
)
\ {\bf then} \ 
error(
\mbox{``}Lemma
\linebreak [0]\ \hskip0em plus2.0em{}expected
\mbox{''}
,
\mathsf {a}
)
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {d}
= 
\mathbf{aspect}( 
{<}stmt{>}
, 
\mathsf {a}
, 
\mathsf {c}
)
\mathbf{\ in\ } 
\newline 
conclude_3 ( 
\mathsf {a}
\mbox {-color}( 
conclude_4 ( 
\mathsf {a}
{} ^ { I }
{} ^ { \rhd }
{} ^ { \ast } 
{} ^ { \rhd }
, 
\mathsf {d}
{}^{3}
{}^{2}
)
)
, 
\mathsf {t}
, 
parm(
\mathsf {d}
{}^{3}
{}^{2}
,
\mathsf {T}
,
1
)
, 
\mathsf {T}
)
]$%
}
%

%
\index{conclude @\back $[
conclude_3 ( 
\mathsf{x}
, 
\mathsf{y}
, 
\mathsf{z}
, 
\mathsf {a}
)]$ conclude three x proves y lemma z substitution a end conclude}%
%
\tex{$
[
conclude_3 ( 
\mathsf {a}
, 
\mathsf {t}
, 
\mathsf {l}
, 
\mathsf {s}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline conclude
\_3
\linebreak [0]\ \hskip0em plus2.0em{}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\newline )
\mbox{''}
]$}%
%
\display{$
[
conclude_3 ( 
\mathsf {a}
, 
\mathsf {t}
, 
\mathsf {l}
, 
\mathsf {s}
)
\mathrel {\dot {=}}
\mathsf {a}
!
\mathsf {t}
!
\mathsf {l}
!
\mathsf {s}
!
\newline 
{\bf if} \ 
\mathsf {l}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\vdash 
\mathsf{y}
\rceil 
\ {\bf then} \ 
\newline 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\rhd 
\mathsf{y}
\rceil 
\left\{\protect \begin {array}{l}
conclude_3 ( 
\mathsf {a}
{} ^ { \rhd }
, 
\mathsf {t}
{}^{1}
, 
\mathsf {l}
{}^{2}
, 
unify(
\mathsf {l}
{}^{1}
=
\mathsf {t}
{}^{2}
,
\mathsf {s}
)
)
\\
conclude_3 ( 
\mathsf {a}
{} ^ { \rhd }
, 
\mathsf {t}
, 
\mathsf {l}
{}^{2}
, 
\mathsf {s}
)
\protect \end {array}\right.
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {l}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathsf{y}
\rceil 
\ {\bf then} \ 
\newline 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\mathsf{y}
\rceil 
\left\{\protect \begin {array}{l}
conclude_3 ( 
\mathsf {a}
{} ^ { \rhd }
, 
\mathsf {t}
{}^{1}
, 
\mathsf {l}
{}^{2}
, 
unify(
\mathsf {l}
{}^{1}
=
\mathsf {t}
{}^{2}
,
\mathsf {s}
)
)
\\
conclude_3 ( 
\mathsf {a}
{} ^ { V } 
, 
\mathsf {t}
, 
\mathsf {l}
{}^{2}
, 
\mathsf {s}
)
\protect \end {array}\right.
\ {\bf else} \ 
\newline 
{\bf if} \ 
\mathsf {l}
\stackrel{r}{=} 
\lceil 
\forall 
\mathsf{x}
\colon 
\mathsf{y}
\rceil 
\ {\bf then} \ 
\newline 
\mathsf {t}
\stackrel{r}{=} 
\lceil 
\mathsf{x}
\mathop {\char64} 
\mathsf{y}
\rceil 
\left\{\protect \begin {array}{l}
conclude_3 ( 
\mathsf {a}
\mathop {\char64} 
\mathsf {t}
{}^{2}
, 
\mathsf {t}
{}^{1}
, 
\mathsf {l}
{}^{2}
, 
unify(
\mathsf {l}
{}^{1}
=
\mathsf {t}
{}^{2}
,
\mathsf {s}
)
)
\\
conclude_3 ( 
\mathsf {a}
\mathop {\char64} 
\mathsf {l}
{}^{1}
, 
\mathsf {t}
, 
\mathsf {l}
{}^{2}
, 
\mathsf {s}
)
\protect \end {array}\right.
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {s}
= 
unify(
\mathsf {l}
=
\mathsf {t}
,
\mathsf {s}
)
\mathbf{\ in\ } 
\newline 
{\bf if} \ 
\mathsf {s}
{}^c
\ {\bf then} \ 
\mathsf {s}
\ {\bf else} \ 
\newline 
inst(
\mathsf {a}
,
\mathsf {s}
)
]$%
}
%

%
\index{conclude @\back $[
conclude_4 ( 
\mathsf{x}
, 
\mathsf{y}
)]$ conclude four x lemma y end conclude}%
%
\tex{$
[
conclude_4 ( 
\mathsf {a}
, 
\mathsf {l}
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline conclude
\_4
\linebreak [0]\ \hskip0em plus2.0em{}(
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ,
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline )
\mbox{''}
]$}%
%
\display{$
[
conclude_4 ( 
\mathsf {a}
, 
\mathsf {l}
)
\mathrel {\dot {=}}
\mathsf {a}
!
\mathsf {l}
!
\newline 
{\bf if} \ 
{\neg }
\mathsf {l}
\stackrel{r}{=} 
\lceil 
\forall 
\mathsf{x}
\colon 
\mathsf{y}
\rceil 
\ {\bf then} \ 
\mathsf {a}
\ {\bf else} \ 
\newline 
\mathbf{let\ } 
\mathsf {v}
= 
\langle 
\lceil \underline{
\ast }
\rceil 
{}^{R}
,\linebreak [0] 
\mathsf {l}
{}^{1}
\rangle 
\mathbf{\ in\ } 
\forall 
\mathsf {v}
\colon 
conclude_4 ( 
\mathsf {a}
\mathop {\char64} 
\mathsf {v}
, 
\mathsf {l}
{}^{2}
)
]$%
}
%



\subsubsection{Proof constructors}

The following macros make it easy to construct medium level proofs:

%
\index{\alpha x proof of y reads z @\back $[
\if\relax\csname lgwprooflinep\endcsname
\def\lgwprooflinep{x}
\newcount\lgwproofline
\fi
\begingroup
\def\insideproof{x}
\lgwproofline=0 
\mathsf{x}
\mathbf {\ proof\ of\ } 
\mathsf{y}
\colon 
\mathsf{z}
\gdef\lgwella{\relax}
\gdef\lgwellb{\relax}
\gdef\lgwellc{\relax}
\gdef\lgwelld{\relax}
\gdef\lgwelle{\relax}
\gdef\lgwellf{\relax}
\gdef\lgwellg{\relax}
\gdef\lgwellh{\relax}
\gdef\lgwelli{\relax}
\gdef\lgwellj{\relax}
\gdef\lgwellk{\relax}
\gdef\lgwelll{\relax}
\gdef\lgwellm{\relax}
\gdef\lgwelln{\relax}
\gdef\lgwello{\relax}
\gdef\lgwellp{\relax}
\gdef\lgwellq{\relax}
\gdef\lgwellr{\relax}
\gdef\lgwells{\relax}
\gdef\lgwellt{\relax}
\gdef\lgwellu{\relax}
\gdef\lgwellv{\relax}
\gdef\lgwellw{\relax}
\gdef\lgwellx{\relax}
\gdef\lgwelly{\relax}
\gdef\lgwellz{\relax}
\gdef\lgwellbiga{\relax}
\gdef\lgwellbigb{\relax}
\gdef\lgwellbigc{\relax}
\gdef\lgwellbigd{\relax}
\gdef\lgwellbige{\relax}
\gdef\lgwellbigf{\relax}
\gdef\lgwellbigg{\relax}
\gdef\lgwellbigh{\relax}
\gdef\lgwellbigi{\relax}
\gdef\lgwellbigj{\relax}
\gdef\lgwellbigk{\relax}
\gdef\lgwellbigl{\relax}
\gdef\lgwellbigm{\relax}
\gdef\lgwellbign{\relax}
\gdef\lgwellbigo{\relax}
\gdef\lgwellbigp{\relax}
\gdef\lgwellbigq{\relax}
\gdef\lgwellbigr{\relax}
\gdef\lgwellbigs{\relax}
\gdef\lgwellbigt{\relax}
\gdef\lgwellbigu{\relax}
\gdef\lgwellbigv{\relax}
\gdef\lgwellbigw{\relax}
\gdef\lgwellbigx{\relax}
\gdef\lgwellbigy{\relax}
\gdef\lgwellbigz{\relax}
\endgroup ]$ x proof of y reads z}%
%
\index{proof: $[
\if\relax\csname lgwprooflinep\endcsname
\def\lgwprooflinep{x}
\newcount\lgwproofline
\fi
\begingroup
\def\insideproof{x}
\lgwproofline=0 
\mathsf{x}
\mathbf {\ proof\ of\ } 
\mathsf{y}
\colon 
\mathsf{z}
\gdef\lgwella{\relax}
\gdef\lgwellb{\relax}
\gdef\lgwellc{\relax}
\gdef\lgwelld{\relax}
\gdef\lgwelle{\relax}
\gdef\lgwellf{\relax}
\gdef\lgwellg{\relax}
\gdef\lgwellh{\relax}
\gdef\lgwelli{\relax}
\gdef\lgwellj{\relax}
\gdef\lgwellk{\relax}
\gdef\lgwelll{\relax}
\gdef\lgwellm{\relax}
\gdef\lgwelln{\relax}
\gdef\lgwello{\relax}
\gdef\lgwellp{\relax}
\gdef\lgwellq{\relax}
\gdef\lgwellr{\relax}
\gdef\lgwells{\relax}
\gdef\lgwellt{\relax}
\gdef\lgwellu{\relax}
\gdef\lgwellv{\relax}
\gdef\lgwellw{\relax}
\gdef\lgwellx{\relax}
\gdef\lgwelly{\relax}
\gdef\lgwellz{\relax}
\gdef\lgwellbiga{\relax}
\gdef\lgwellbigb{\relax}
\gdef\lgwellbigc{\relax}
\gdef\lgwellbigd{\relax}
\gdef\lgwellbige{\relax}
\gdef\lgwellbigf{\relax}
\gdef\lgwellbigg{\relax}
\gdef\lgwellbigh{\relax}
\gdef\lgwellbigi{\relax}
\gdef\lgwellbigj{\relax}
\gdef\lgwellbigk{\relax}
\gdef\lgwellbigl{\relax}
\gdef\lgwellbigm{\relax}
\gdef\lgwellbign{\relax}
\gdef\lgwellbigo{\relax}
\gdef\lgwellbigp{\relax}
\gdef\lgwellbigq{\relax}
\gdef\lgwellbigr{\relax}
\gdef\lgwellbigs{\relax}
\gdef\lgwellbigt{\relax}
\gdef\lgwellbigu{\relax}
\gdef\lgwellbigv{\relax}
\gdef\lgwellbigw{\relax}
\gdef\lgwellbigx{\relax}
\gdef\lgwellbigy{\relax}
\gdef\lgwellbigz{\relax}
\endgroup ]$ x proof of y reads z}%
%
\tex{$
[
\mathsf {t}
\mathbf{\ proof\ of\ } 
\mathsf {s}
: 
\mathsf {p}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\mbox {$\backslash $}relax
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}def
\mbox {$\backslash $}lgwprooflinep
\{x
\}
\newline 
\mbox {$\backslash $}newcount
\mbox {$\backslash $}lgwproofline
\newline 
\mbox {$\backslash $}fi
\newline 
\mbox {$\backslash $}begingroup
\newline 
\mbox {$\backslash $}def
\mbox {$\backslash $}insideproof
\{x
\}
\newline 
\mbox {$\backslash $}lgwproofline
{=}0
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}proof
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}of
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwella
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellb
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellc
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwelld
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwelle
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellf
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellg
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellh
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwelli
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellj
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellk
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwelll
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellm
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwelln
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwello
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellp
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellq
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellr
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwells
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellt
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellu
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellv
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellw
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellx
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwelly
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellz
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbiga
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigb
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigc
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigd
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbige
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigf
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigg
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigh
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigi
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigj
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigk
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigl
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigm
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbign
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigo
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigp
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigq
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigr
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigs
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigt
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigu
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigv
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigw
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigx
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigy
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}gdef
\mbox {$\backslash $}lgwellbigz
\{
\mbox {$\backslash $}relax
\}
\newline 
\mbox {$\backslash $}endgroup
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
\tex{$
[
\mathsf {t}
\mathbf{\ proof\ of\ } 
\mathsf {s}
: 
\mathsf {p}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathbf
\{
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}proof
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}of
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\mbox{''}
]$}
%
\display{$
[
\mathsf {t}
\mathbf{\ proof\ of\ } 
\mathsf {s}
: 
\mathsf {p}
\mathrel {\ddot {=}}
[ \mathbf{Proof\ of\ }
\mathsf {s}
\colon 
\lambda 
\mathsf {c}
.
\lambda 
\mathsf{x}
.
{\cal P}( 
\lceil 
\mathsf {t}
\vdash 
\mathsf {p}
\rceil 
, 
p_0
, 
\mathsf {c}
)
]
]$%
}
%

%
\index{Line @\back $[
Line \, 
\mathsf{x}
: 
\mathsf{y}
\gg 
\mathsf{z}
; 
\mathsf {a}]$ line x because y indeed z end line a}%
%
\index{line x because y indeed z end line a $[
Line \, 
\mathsf{x}
: 
\mathsf{y}
\gg 
\mathsf{z}
; 
\mathsf {a}]$}%
%
\tex{$
[
Line \, 
\mathsf {l}
: 
\mathsf {a}
\gg 
\mathsf {i}
; 
\mathsf {p}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.1
\mbox {$\backslash $}textwidth]
\{
\}
\%
\newline 
\mbox {$\backslash $}parbox
\linebreak [0]\ \hskip0em plus2.0em{}[b]
\{0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\mbox {$\backslash $}raggedright
\newline 
\mbox {$\backslash $}setlength
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}parindent
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\mbox{-}0.1
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\%
\newline 
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.1
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}][l]
\{
\$
\#1.
\newline 
\$
{:}
\}
\$
\#2.
\newline 
\{
\}
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\}
\$
\}
\mbox {$\backslash $}quad
\newline 
\mbox {$\backslash $}parbox
\linebreak [0]\ \hskip0em plus2.0em{}[t]
\{0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\$
\#3.
\newline 
\$
\mbox {$\backslash $}hfill
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\mbox {$\backslash $}quad
\linebreak [0]\ \hskip0em plus2.0em{};
\}
\}
\#4.
\mbox{''}
]$}%
%
\tex{$
[
Line \, 
\mathsf {l}
: 
\mathsf {a}
\gg 
\mathsf {i}
; 
\mathsf {p}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline Line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\newline ;
\linebreak [0]\ \hskip0em plus2.0em{}
\#4.
\mbox{''}
]$}%
%
\display{$
[
Line \, 
\mathsf {l}
: 
\mathsf {a}
\gg 
\mathsf {i}
; 
\mathsf {p}
\mathrel {\ddot {=}}
(
\mathsf {a}
\gg 
\mathsf {i}
; 
\mathbf{let\ } 
\mathsf {l}
\mathrel{\ddot{=}} 
\mathsf {i}
\mathrel{\ in\ } 
\mathsf {p}
)
]$%
}
%

%
\index{Last line @\back $[
Last\ line \, 
\mathsf{x}
\gg 
\mathsf{y}
\,\Box]$ because x indeed y qed}%
%
\index{because x indeed y qed $[
Last\ line \, 
\mathsf{x}
\gg 
\mathsf{y}
\,\Box]$}%
%
\tex{$
[
Last\ line \, 
\mathsf {a}
\gg 
\mathsf {i}
\,\Box
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.1
\mbox {$\backslash $}textwidth]
\{
\}
\%
\newline 
\mbox {$\backslash $}parbox
\linebreak [0]\ \hskip0em plus2.0em{}[b]
\{0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\mbox {$\backslash $}raggedright
\newline 
\mbox {$\backslash $}setlength
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}parindent
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\mbox{-}0.1
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\%
\newline 
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.1
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}][l]
\{
\$
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_?
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\newline 
\$
{:}
\}
\$
\#1.
\newline 
\{
\}
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\}
\$
\}
\mbox {$\backslash $}quad
\newline 
\mbox {$\backslash $}parbox
\linebreak [0]\ \hskip0em plus2.0em{}[t]
\{0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\$
\#2.
\newline 
\$
\mbox {$\backslash $}hfill
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\mbox {$\backslash $}quad
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox[0mm]
\{
\$
\mbox {$\backslash $}Box
\$
\}
\}
\}
\mbox{''}
]$}%
%
\tex{$
[
Last\ line \, 
\mathsf {a}
\gg 
\mathsf {i}
\,\Box
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline Last
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\mbox {$\backslash $},
\mbox {$\backslash $}Box
\mbox{''}
]$}%
%
\display{$
[
Last\ line \, 
\mathsf {a}
\gg 
\mathsf {i}
\,\Box
\mathrel {\ddot {=}}
(
\mathsf {a}
\gg 
\mathsf {i}
)
]$%
}
%

%
\index{premise @\back $[
Line \, 
\mathsf{x}
: Premise \gg 
\mathsf{y}
;
\mathsf{z}]$ line x premise y end line z}%
%
\index{line x premise y end line z $[
Line \, 
\mathsf{x}
: Premise \gg 
\mathsf{y}
;
\mathsf{z}]$}%
%
\tex{$
[
Line \, 
\mathsf {l}
: Premise \gg 
\mathsf {i}
;
\mathsf {p}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.1
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}][l]
\{
\$
\#1.
\newline 
\$
{:}
\}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}][l]
\{
\$Premise
\{
\}
\mbox {$\backslash $}gg
\{
\}
\$
\}
\mbox {$\backslash $}quad
\newline 
\mbox {$\backslash $}parbox
\linebreak [0]\ \hskip0em plus2.0em{}[t]
\{0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\$
\#2.
\newline 
\$
\mbox {$\backslash $}hfill
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\mbox {$\backslash $}quad
\linebreak [0]\ \hskip0em plus2.0em{};
\}
\}
\#3.
\mbox{''}
]$}%
%
\tex{$
[
Line \, 
\mathsf {l}
: Premise \gg 
\mathsf {i}
;
\mathsf {p}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline Line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
{:}
\linebreak [0]\ \hskip0em plus2.0em{}Premise
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ;
\#3.
\mbox{''}
]$}%
%
\display{$
[
Line \, 
\mathsf {l}
: Premise \gg 
\mathsf {i}
;
\mathsf {p}
\mathrel {\ddot {=}}
(
\mathsf {i}
\vdash 
\mathbf{let\ } 
\mathsf {l}
\mathrel{\ddot{=}} 
\mathsf {i}
\mathrel{\ in\ } 
\mathsf {p}
)
]$%
}
%

%
\index{side condition @\back $[
Line \, 
\mathsf{x}
: \mbox{Side-condition} \gg 
\mathsf{y}
; 
\mathsf{z}]$ line x side condition y end line z}%
%
\index{line x side condition y end line z $[
Line \, 
\mathsf{x}
: \mbox{Side-condition} \gg 
\mathsf{y}
; 
\mathsf{z}]$}%
%
\tex{$
[
Line \, 
\mathsf {l}
: \mbox{Side-condition} \gg 
\mathsf {i}
; 
\mathsf {p}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.1
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}][l]
\{
\$
\#1.
\newline 
\$
{:}
\}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}][l]
\{
\%
\newline 
\$
\mbox {$\backslash $}mbox
\{Side
\mbox{-}condition
\}
\{
\}
\mbox {$\backslash $}gg
\{
\}
\$
\}
\mbox {$\backslash $}quad
\newline 
\mbox {$\backslash $}parbox
\linebreak [0]\ \hskip0em plus2.0em{}[t]
\{0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\$
\#2.
\newline 
\$
\mbox {$\backslash $}hfill
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\mbox {$\backslash $}quad
\linebreak [0]\ \hskip0em plus2.0em{};
\}
\}
\#3.
\mbox{''}
]$}%
%
\tex{$
[
Line \, 
\mathsf {l}
: \mbox{Side-condition} \gg 
\mathsf {i}
; 
\mathsf {p}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline Line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}mbox
\{Side
\mbox{-}condition
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ;
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\mbox{''}
]$}%
%
\display{$
[
Line \, 
\mathsf {l}
: \mbox{Side-condition} \gg 
\mathsf {i}
; 
\mathsf {p}
\mathrel {\ddot {=}}
(
\mathsf {i}
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\mathbf{let\ } 
\mathsf {l}
\mathrel{\ddot{=}} 
\mathsf {i}
\mathrel{\ in\ } 
\mathsf {p}
)
]$%
}
%

%
\index{arbitrary @\back $[
Arbitrary \gg 
\mathsf{y}
;
\mathsf{z}]$ arbitrary x end line y}%
%
\index{arbitrary x end line y $[
Arbitrary \gg 
\mathsf{x}
;
\mathsf{y}]$}%
%
\tex{$
[
Arbitrary \gg 
\mathsf {i}
;
\mathsf {p}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.1
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}][l]
\{
\$
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_?
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\newline 
\$
{:}
\}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}][l]
\{
\$Arbitrary
\{
\}
\mbox {$\backslash $}gg
\{
\}
\$
\}
\mbox {$\backslash $}quad
\newline 
\mbox {$\backslash $}parbox
\linebreak [0]\ \hskip0em plus2.0em{}[t]
\{0.4
\mbox {$\backslash $}textwidth
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\{
\$
\#1.
\newline 
\$
\mbox {$\backslash $}hfill
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}makebox
\linebreak [0]\ \hskip0em plus2.0em{}[0mm][l]
\{
\mbox {$\backslash $}quad
\linebreak [0]\ \hskip0em plus2.0em{};
\}
\}
\#2.
\mbox{''}
]$}%
%
\tex{$
[
Arbitrary \gg 
\mathsf {i}
;
\mathsf {p}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline Arbitrary
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline ;
\#2.
\mbox{''}
]$}%
%
\display{$
[
Arbitrary \gg 
\mathsf {i}
;
\mathsf {p}
\mathrel {\ddot {=}}
(
\forall 
\mathsf {i}
\colon 
\mathsf {p}
)
]$%
}
%

%
\index{local @\back $[
Local \gg 
\mathsf{x}
= 
\mathsf{y}
; 
\mathsf{z}]$ locally define x as y end line z}%
%
\index{locally define x as y end line z $[
Local \gg 
\mathsf{x}
= 
\mathsf{y}
; 
\mathsf{z}]$}%
%
\tex{$
[
Local \gg 
\mathsf {a}
= 
\mathsf {i}
; 
\mathsf {p}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\mbox {$\backslash $}makebox[0.1
\mbox {$\backslash $}textwidth][l]
\{
\$
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_?
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\newline 
\$
{:}
\}
\%
\newline 
\mbox {$\backslash $}makebox[0.4
\mbox {$\backslash $}textwidth][l]
\{
\$Local
\{
\}
\mbox {$\backslash $}gg
\{
\}
\$
\}
\%
\newline 
\mbox {$\backslash $}quad
\%
\newline 
\mbox {$\backslash $}parbox[t]
\{0.4
\mbox {$\backslash $}textwidth
\}
\{
\$
\#1.
\newline 
{=}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline 
\$
\mbox {$\backslash $}hfill
\mbox {$\backslash $}makebox[0mm][l]
\{
\mbox {$\backslash $}quad
\linebreak [0]\ \hskip0em plus2.0em{};
\}
\}
\#3.
\mbox{''}
]$}%
%
\tex{$
[
Local \gg 
\mathsf {a}
= 
\mathsf {i}
; 
\mathsf {p}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline Local
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}gg
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
{=}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\newline ;
\linebreak [0]\ \hskip0em plus2.0em{}
\#3.
\mbox{''}
]$}%
%
\display{$
[
Local \gg 
\mathsf {a}
= 
\mathsf {i}
; 
\mathsf {p}
\mathrel {\ddot {=}}
(
\mathbf{let\ } 
\mathsf {a}
\mathrel{\ddot{=}} 
\mathsf {i}
\mathrel{\ in\ } 
\mathsf {p}
)
]$%
}
%

Some of the constructs look different when used in proofs. As an example, the ``Arbitrary'' construct above gets a line number when used in a proof (or, more precisely, when typeset using the tex aspect instead of the tex name aspect).

Line numbers in proofs are generated automatically. As an example, one may write

\display{line ell a because tactic reflexivity indeed meta a math equal meta a end line ...}

in a pyk source text to get a numbered proof line saying $[
Reflexivity_1
\gg {\cal A}
={\cal A}]$. The line number is assigned automatically, and afterwards references to ``ell a'' will refer to that line number.



\appendix

\section{\TeX\ definitions}\label{appendix:TeXdefinitions}

\subsection{The \TeX\ language}

From the point of view of Logiweb, \TeX\ is an output format intended for the creation of beautiful Logiweb pages---and especially for Logiweb pages that contain a lot of mathematics (c.f.\ the preface of the \TeX book \cite{TeXbook}). The PDF version of the present page is produced by the \TeX\ system (including \LaTeX) and a program named dvipdfm.

\TeX\ is chosen for this purpose because of the high quality and great maturity of that system. Early version of Logiweb also used MathML, but support for that was removed for several reasons, one of which was a desire to reduce the number of output formats to exactly one.

One application of Logiweb could be straightforward translation of pyk to \TeX. A major purpose of Logiweb, however, is to allow the Logiweb system to understand the mathematics present on Logiweb pages. In particular, Logiweb is able to check proofs and execute programs defined on Logiweb pages.



\subsubsection{Use of newline characters}

As we shall see later,

\display{$
[
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\{x
\}
\mbox{''}
]$}

macro expands into

\display{$
[
\mathsf{x}
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\{x
\}
\mbox{''}
]$}

which in turn defines the tex aspect of $[
\mathsf{x}]$ to be a string that starts with a \indexintro{newline character} followed by $\backslash$mathsf\{x\}.

Internally, Logiweb consistently uses Unicode 10 for the newline character. Whenever Logiweb runs on a host operating system that uses another character or character sequence between lines of text, newline characters have to be translated in the interface between Logiweb and the operating system.

The tex definition above states that whenever Logiweb renders an $[
\mathsf{x}]$ using the \TeX\ system, it dumps ${\downarrow}{\backslash}$mathsf\{x\} to a file and runs it through \TeX\ (where the down arrow represents the newline character).

As another example, the pairing construct $[
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}]$ introduced later has the following tex aspect:

\display{$
[
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$}

Arguments are represented by double quotes in pyk aspects. In tex aspects, arguments are represented by sequences of characters that start with a hash mark and end with a period. As an example, \#117. denotes the 117'th argument of a construct. A hash mark immediately followed by a period as in ``\#.'' denotes a hash mark.

When sending text through \TeX\ one has to be careful about newline characters. Firstly, one should avoid making lines that are too long for \TeX\ or the host operating system. Secondly, one should avoid producing two newline characters in sequence since \TeX\ assigns a special meaning to repeated newline characters.

To fulfill both, the present page makes the following convention for tex aspects: A newline character is added in front of the string whenever the string starts with a character rather than an argument. Furthermore, a newline character is inserted whenever a character follows an argument. Newlines are omitted, however, if they disturb \TeX\ in achieving the intended rendering.



\subsubsection{Interpretation of the tex aspect}

Looking at the pyk source of the present page reveals that the tex aspect of the entire page looks like this:

\begin{verbatim}
        File page.tex
        ...
        End of file
        File page.bib
        ...
        End of file
        latex page
        makeindex page
        bibtex page
        latex page
        makeindex page
        latex page
        dvipdfm page
\end{verbatim}

The tex aspect above is not run directly through \TeX. Rather, it instructs an interpreter to place certain text in certain files and then run latex, bibtex, makeindex, and dvipdfm in a certain pattern.

For security reasons, the interpreter of the present system only allows execution of commands named tex, latex, bibtex, makeindex, and dvipdfm. Furthermore, the interpreter only accepts file names made up from the characters a to z, A to Z, 0 to 9, and dots.

At present, security holes in tex, latex, bibtex, makeindex, and dvipdfm may compromise security. For this and other reasons, these programs will run in a chroot gail in some future release of Logiweb.



\subsubsection{The tex name aspect}

Some constructs look different when using them and when talking about them.

As an example, consider ordinary typewriter text. When using a newline character, the character itself is invisible but has the effect that text following it starts on a new line. When talking about a newline character, one may call it ``the newline character''. This way, a newline character is invisible when using it and consists of 19 characters and two spaces when talking about it.

As another example, the \TeX\ bold face command may be called \verb+\bf+ when talking about it and changes the text that follows it to bold face when using it.

To cope with this, we introduce a \index{name, tex}\indexintro{tex name} or \intro{name} aspect to supplement the tex aspect:

\display{%
\tex{$
[
\mathrm{name}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{name
\}
\mbox{''}
]$}%
%
$
[
\mathrm{name}
\bowtie
\mbox{``}texname
\mbox{''}
]$}

The tex name aspect should be such that it can be typeset in \TeX\ math mode. The tex name aspect defaults to the tex aspect, so if the tex and tex name aspects of a construct are identical then one should only define the tex aspect. (The tex aspect in turn defaults to something that is constructed from the pyk aspect, and the pyk aspect in turn defaults to something semi-readable constructed from the reference and identifier of the construct).



\subsubsection{Uses of the tex name aspect}

As an example of a construct for which the tex and tex name aspects differ, consider the following:

\display{%
\index{math * end math}%
%
\tex{$
[
\ \$
\mathsf{x}\$\linebreak[0]\ 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$
\#1.
\$
\mbox{''}
]$}%
%
$
[
\ \$
\mathsf{x}\$\linebreak[0]\ 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$
\#1.
\$
\mbox{''}
]$}

\display{%
\tex{$
[
\ \$
\mathsf{x}\$\linebreak[0]\ 
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}
\$
\#1.
\mbox {$\backslash $}
\$
\mbox {$\backslash $}linebreak[0]
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
$
[
\ \$
\mathsf{x}\$\linebreak[0]\ 
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}
\$
\#1.
\mbox {$\backslash $}
\$
\mbox {$\backslash $}linebreak[0]
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}

The ``math * end math'' construct allows to insert mathematics in \TeX\ horizontal mode by changing to math mode temporarily. The tex name aspect allows to talk about the construct. The left hand sides of the three definitions above are typeset using the tex name aspect.

Elaborating the example from the previous section, the pyk source of a definition like

\display{$
[
[
\mathsf{y}
\stackrel{
\mathsf{x}
}{\rightarrow}
\mathsf{z}
]
\bowtie
\mbox{``}define
\mbox{''}
]$}

could read something like

\begin{quote}
math proclaim define var x of var y as var z end define as $\cdots$ end proclaim end math
\end{quote}

\noindent The ``math * end math'' construct is invisible in the definition above but certainly affects the typography; without it, \TeX\ would produce ugly error messages rather than beautiful typography.

By the way: note that ``math * end math'' changes to $\backslash$rm immediately after changing to math mode. That is because Logiweb formulas contain loads of text and because the typography of e.g.\ variables is under tight control of Logiweb, so the defaults of \TeX\ math mode are not the right ones for Logiweb.



\subsubsection{Brackets}

For completeness,

\display{\index{bracket * end bracket}%
%
\tex{$
[
\mbox{bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$[
\#1.]
\$
\mbox{''}
]$}%
%
\tex{$
[
\mbox{bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\{bracket
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\#1.
\$
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\}
\mbox{''}
]$}%
%
$
[
\mbox{bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$[
\#1.]
\$
\mbox{''}
]$%
}

and

\display{\index{big bracket * end bracket}%
%
\tex{$
[
\mbox{big bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$
\mbox {$\backslash $}left[
\#1.
\mbox {$\backslash $}right]
\$
\mbox{''}
]$}%
%
\tex{$
[
\mbox{big bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\{big
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\#1.
\$
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\}
\mbox{''}
]$}%
%
$
[
\mbox{big bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$
\mbox {$\backslash $}left[
\#1.
\mbox {$\backslash $}right]
\$
\mbox{''}
]$%
}

are versions of ``math * end math'' that add brackets around the formula.

The latter adds large brackets using the large bracket facility of \TeX, which is useful occasionally but which mainly leads to undesirable results. The large brackets in \cite{MathComp} adjust their height independently of their depth and allow line breaking of their argument. The brackets of \cite{MathComp} are not used here, however, because they would have an inconveniently large tex aspect.

By the way, two major Logiweb pages have been developed before Logiweb itself was developed. The first is \cite{MathComp} which is a three volume textbook on mathematics for first year computer science students used at the department of computer science at the University of Compenhagen as a replacement for discrete mathematics. The second is cite{grue02b} which contains a consistency proof for ZFC set theory expressed in Map theory. At the time of writing, these two are not yet published on Logiweb, but they have been drivers of the design of Logiweb.



\subsubsection{The tex aspect of definitions}

As stated in Appendix \ref{section:TeXdefinitions}, the \TeX\ definition of $
[
\mathsf{y}
\stackrel{
\mathsf{x}
}{\rightarrow}
\mathsf{z}
]$ reads:

\display{$
[
[
\mathsf{y}
\stackrel{
\mathsf{x}
}{\rightarrow}
\mathsf{z}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\{
\#1.
\newline 
\}
\{
\mbox {$\backslash $}rightarrow
\}
\#3.
\newline ]
\mbox{''}
]$}

In the definition, ``\#1.'' says ``insert the first argument (the aspect) here''. Likewise, ``\#3.'' says ``insert the third argument (the right hand side) here''.

The second argument (the left hand side), is more complicated. A definition talks about the left hand side rather than just using it. For that reason, the left hand side should be rendered using the tex name aspect instead of the tex aspect. On the other hand, if the left hand side has parameters, then those parameters should be rendered normally, i.e.\ using the tex aspect.

``\#2/tex name/tex.'' says ``insert the second argument (the left hand side) here using the tex name aspect for the left hand side, but revert to the tex aspect for the parameters of the left hand side.



\subsection{\TeX\ definitions}\label{section:TeXdefinitions}

%
% Things that might have disappeared during editing 2006-05-04
%
\tex{$
[
[
\mathsf{x}
\bowtie
\mathsf{y}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}bowtie
\#2.
\newline ]
\mbox{''}
]$}%
%
\tex{$
[
[
\mathsf{y}
\stackrel{
\mathsf{x}
}{\rightarrow}
\mathsf{z}
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\{
\#1.
\newline 
\}
\{
\mbox {$\backslash $}rightarrow
\}
\#3.
\newline ]
\mbox{''}
]$}
%
\tex{$
[
\mathrm{pyk}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{pyk
\}
\mbox{''}
]$}%
%
\tex{$
[
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\{x
\}
\mbox{''}
]$}%
%
\tex{$
[
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\{y
\}
\mbox{''}
]$}%
%
\tex{$
[
\mathsf{z}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\{z
\}
\mbox{''}
]$}%
%
\tex{$
[
\mathrm{tex}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{tex
\}
\mbox{''}
]$}%
%
\tex{$
[
\mathrm{name}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\{name
\}
\mbox{''}
]$}%
%
\tex{$
[
\ \$
\mathsf{x}\$\linebreak[0]\ 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$
\#1.
\$
\mbox{''}
]$}%
%
\tex{$
[
\ \$
\mathsf{x}\$\linebreak[0]\ 
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}
\$
\#1.
\mbox {$\backslash $}
\$
\mbox {$\backslash $}linebreak[0]
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$}%
%
\tex{$
[
\mbox{bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$[
\#1.]
\$
\mbox{''}
]$}%
%
\tex{$
[
\mbox{bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\{bracket
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\#1.
\$
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\}
\mbox{''}
]$}%
%
\tex{$
[
\mbox{big bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$
\mbox {$\backslash $}left[
\#1.
\mbox {$\backslash $}right]
\$
\mbox{''}
]$}%
%
\tex{$
[
\mbox{big bracket $
\mathsf{x}$ end bracket}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\{big
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\#1.
\$
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\}
\mbox{''}
]$}%
%

\begin{list}{}{
\setlength{\leftmargin}{5em}
\setlength{\itemindent}{-5em}}
\immediate\closeout\outex
\input{./page.otx}
\end{list}



\subsection{Further \TeX\ definitions}

This section contains tex definitions in an old style which the author has not yet turned into the style used in Appendix \ref{section:TeXdefinitions}

$
[
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}ast
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[
\ast 
\mathbin {\mbox {'}}
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathbin
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {'}
\}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\mathbin {\mbox {`}}
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathbin
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {`}
\}
\}
\#2.
\mbox{''}
]$

$
[
\lambda 
\ast 
.
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}lambda
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline .
\#2.
\mbox{''}
]$

$
[
\Lambda 
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}Lambda
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\mbox{''}
]$

$
[
\mathsf {T}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{T
\}
\mbox{''}
]$

$
[
\mathrm {if}(
\ast 
,\linebreak [0]
\ast 
,\linebreak [0]
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{if
\}(
\#1.
\newline ,
\mbox {$\backslash $}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}[0]
\#2.
\newline ,
\mbox {$\backslash $}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}[0]
\#3.
\newline )
\mbox{''}
]$

$
[
\mathrm {val}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{val
\}
\mbox{''}
]$

$
[
\mathrm {claim}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{claim
\}
\mbox{''}
]$

$
[
[
\ast 
\stackrel {
\ast 
}{\Rightarrow }
\ast 
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\#1.
\newline 
\}
\{
\mbox {$\backslash $}Rightarrow
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#3.
\newline ]
\mbox{''}
]$

$
[
\bot 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}bot
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[
f(
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline f(
\#1.
\newline )
\mbox{''}
]$

$
[
(
\ast 
){}^{I} 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline (
\#1.
\newline )
\{
\}
{\char94}
\{I
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[
\mathsf {F}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{F
\}
\mbox{''}
]$

$
[
\underline {0}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{0
\}
\mbox{''}
]$

$
[
\underline {1}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{1
\}
\mbox{''}
]$

$
[
\underline {2}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{2
\}
\mbox{''}
]$

$
[
\underline {3}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{3
\}
\mbox{''}
]$

$
[
\underline {4}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{4
\}
\mbox{''}
]$

$
[
\underline {5}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{5
\}
\mbox{''}
]$

$
[
\underline {6}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{6
\}
\mbox{''}
]$

$
[
\underline {7}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{7
\}
\mbox{''}
]$

$
[
\underline {8}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{8
\}
\mbox{''}
]$

$
[
\underline {9}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{9
\}
\mbox{''}
]$

$
[
0
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 0
\mbox{''}
]$

$
[
1
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 1
\mbox{''}
]$

$
[
2
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 2
\mbox{''}
]$

$
[
3
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 3
\mbox{''}
]$

$
[
4
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 4
\mbox{''}
]$

$
[
5
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 5
\mbox{''}
]$

$
[
6
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 6
\mbox{''}
]$

$
[
7
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 7
\mbox{''}
]$

$
[
8
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 8
\mbox{''}
]$

$
[
9
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 9
\mbox{''}
]$

$
[
\mathsf {a}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{a
\}
\mbox{''}
]$

$
[
\mathsf {b}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{b
\}
\mbox{''}
]$

$
[
\mathsf {c}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{c
\}
\mbox{''}
]$

$
[
\mathsf {d}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{d
\}
\mbox{''}
]$

$
[
\mathsf {e}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{e
\}
\mbox{''}
]$

$
[
\mathsf {f}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{f
\}
\mbox{''}
]$

$
[
\mathsf {g}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{g
\}
\mbox{''}
]$

$
[
\mathsf {h}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{h
\}
\mbox{''}
]$

$
[
\mathsf {i}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{i
\}
\mbox{''}
]$

$
[
\mathsf {j}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{j
\}
\mbox{''}
]$

$
[
\mathsf {k}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{k
\}
\mbox{''}
]$

$
[
\mathsf {l}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{l
\}
\mbox{''}
]$

$
[
\mathsf {m}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{m
\}
\mbox{''}
]$

$
[
\mathsf {n}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{n
\}
\mbox{''}
]$

$
[
\mathsf {o}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{o
\}
\mbox{''}
]$

$
[
\mathsf {p}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{p
\}
\mbox{''}
]$

$
[
\mathsf {q}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{q
\}
\mbox{''}
]$

$
[
\mathsf {r}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{r
\}
\mbox{''}
]$

$
[
\mathsf {s}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{s
\}
\mbox{''}
]$

$
[
\mathsf {t}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{t
\}
\mbox{''}
]$

$
[
\mathsf {u}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{u
\}
\mbox{''}
]$

$
[
\mathsf {v}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{v
\}
\mbox{''}
]$

$
[
\mathsf {w}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathsf
\linebreak [0]\ \hskip0em plus2.0em{}
\{w
\}
\mbox{''}
]$

$
[
(
\ast 
)^M
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline (
\#1.
\newline )
{\char94}M
\mbox{''}
]$

$
[
\mathrm {If}(
\ast 
,\linebreak [0]
\ast 
,\linebreak [0]
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{If
\}(
\#1.
\newline ,
\mbox {$\backslash $}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}[0]
\#2.
\newline ,
\mbox {$\backslash $}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}[0]
\#3.
\newline )
\mbox{''}
]$

$
[\mathrm {array}\{
\ast 
\}
\ast 
\mathrm {end\ array}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}begin
\linebreak [0]\ \hskip0em plus2.0em{}
\{array
\}
\{
\#1.
\newline 
\}
\#2.
\newline 
\mbox {$\backslash $}end
\linebreak [0]\ \hskip0em plus2.0em{}
\{array
\}
\mbox{''}
]$

$
[\mathrm {array}\{
\ast 
\}
\ast 
\mathrm {end\ array}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{array
\}
\mbox {$\backslash $}
\{
\#1.
\newline 
\mbox {$\backslash $}
\}
\#2.
\newline 
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{end
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}array
\}
\mbox{''}
]$

$
[
l
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline l
\mbox{''}
]$

$
[
c
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline c
\mbox{''}
]$

$
[
r
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline r
\mbox{''}
]$

$
[
\mathrm {empty}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox{''}
]$

$
[
\mathrm {empty}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{empty
\}
\mbox{''}
]$

$
[
\langle 
\ast 
\,{|}
\ast 
{:=}\,
\ast 
\rangle 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}langle
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $},
\{|
\}
\#2.
\newline 
\{
{:}
{=}
\}
\mbox {$\backslash $},
\#3.
\newline 
\mbox {$\backslash $}rangle
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[
{\cal M}(
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}(
\#1.
\newline )
\mbox{''}
]$

$
[
\mathbf {apply}(
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{apply
\}(
\#1.
\newline ,
\#2.
\newline )
\mbox{''}
]$

$
[
\mathbf {apply}_1(
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{apply
\}
\_1(
\#1.
\newline ,
\#2.
\newline )
\mbox{''}
]$

$
[
\ast 
{}^H
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}H
\mbox{''}
]$

$
[
\ast 
{}^T
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}T
\mbox{''}
]$

$
[
\ast 
{}^c
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}c
\mbox{''}
]$

$
[
\ast 
{}^d
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}d
\mbox{''}
]$

$
[
\ast 
{}^U
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}U
\mbox{''}
]$

$
[
\ast 
{}^h
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}h
\mbox{''}
]$

$
[
\ast 
{}^t
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}t
\mbox{''}
]$

$
[
\ast 
{}^s
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}s
\mbox{''}
]$

$
[
\ast 
{}^B
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}B
\mbox{''}
]$

$
[
\ast 
{}^C
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}C
\mbox{''}
]$

$
[
\ast 
{}^M
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}M
\mbox{''}
]$

$
[
\tilde {{\cal U}}(
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}U
\}
\}(
\#1.
\newline )
\mbox{''}
]$

$
[
{\cal U}(
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}U
\}(
\#1.
\newline )
\mbox{''}
]$

$
[
{\cal U}^M(
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}U
\}
{\char94}M(
\#1.
\newline )
\mbox{''}
]$

$
[
\ast 
\mathrel { \dot { . \, . } }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}dot
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}.
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}.
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\mathrel { \underline { \dot { . \, . } } }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}dot
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}.
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}.
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\mathrel { \underline { : \, : } }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\mathrel { \underline { {+} 2 \ast } }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}underline
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\{
{+}
\}
\linebreak [0]\ \hskip0em plus2.0em{}2
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}ast
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\mathsf{x}
\mathrel { : \, : }
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $},
\linebreak [0]\ \hskip0em plus2.0em{}
{:}
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\mathrel { {+} 2 \ast }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\linebreak [0]\ \hskip0em plus2.0em{}
\{
{+}
\}
\linebreak [0]\ \hskip0em plus2.0em{}2
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}ast
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\stackrel {B}{\approx }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{B
\}
\{
\mbox {$\backslash $}approx
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\stackrel {D}{\approx }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{D
\}
\{
\mbox {$\backslash $}approx
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\stackrel {C}{\approx }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{C
\}
\{
\mbox {$\backslash $}approx
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\stackrel {P}{\approx }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{P
\}
\{
\mbox {$\backslash $}approx
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\approx 
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}approx
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\ast 
=
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
{=}
\#2.
\mbox{''}
]$

$
[
\ast 
\stackrel {+}{\rightarrow }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
{+}
\}
\{
\mbox {$\backslash $}rightarrow
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#2.
\mbox{''}
]$

$
[
{\neg }
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}neg
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\#1.
\mbox{''}
]$

$
[
\ast 
\wedge 
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}wedge
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\ast 
\vee 
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}vee
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\ast 
\parallel 
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}parallel
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\ast 
:
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
{:}
\#2.
\mbox{''}
]$

$
[
\ast 
!
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline !
\#2.
\mbox{''}
]$

$
[
\ast 
\left\{\protect \begin {array}{l}
\ast 
\\
\ast 
\protect \end {array}\right.
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}left
\mbox {$\backslash $}
\{
\mbox {$\backslash $}protect
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}begin
\linebreak [0]\ \hskip0em plus2.0em{}
\{array
\}
\{l
\}
\#2.
\newline 
\mbox {$\backslash $}
\mbox {$\backslash $}
\#3.
\newline 
\mbox {$\backslash $}protect
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}end
\linebreak [0]\ \hskip0em plus2.0em{}
\{array
\}
\mbox {$\backslash $}right.
\mbox{''}
]$

$
[
\ast 
\& 
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\&
\#2.
\mbox{''}
]$

$
[
\ast 
\& 
\ast 
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}
\&
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\ast 
\backslash \backslash 
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\ast 
\backslash \backslash 
\ast 
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}backslash
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}backslash
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$

$
[
\mathrm {macro}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{macro
\}
\mbox{''}
]$

$
[
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{value
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$

$
[
\mbox {\tt \char34}\mathrm {macro}\mbox {\tt \char34}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{macro
\}
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\mbox{''}
]$

$
[
{\cal E}(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}E
\}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
{\cal E}_2(
\ast 
,
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}E
\}
\_2(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline ,
\#5.
\newline )
\mbox{''}
]$

$
[
{\cal E}_3(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}E
\}
\_3(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline )
\mbox{''}
]$

$
[
{\cal E}_4(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}E
\}
\_4(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline )
\mbox{''}
]$

$
[
\mathbf {lookup}(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{lookup
\}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
\mathbf {abstract}(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{abstract
\}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline )
\mbox{''}
]$

$
[
\ast 
{}^a
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{
\}
{\char94}a
\mbox{''}
]$

$
[
\lceil 
\ast 
\rceil 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}lceil
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\newline 
\mbox {$\backslash $}rceil
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[
\ast 
0
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 0
\mbox{''}
]$

$
[
\ast 
1
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 1
\mbox{''}
]$

$
[
0 \mathrm {b}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 0
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{b
\}
\mbox{''}
]$

$
[
\ast 
\stackrel {t}{=}
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{t
\}
\{
{=}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
\stackrel {t^*}{=}
\ast 
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{t
{\char94}
{*}
\}
\{
{=}
\}
\#2.
\mbox{''}
]$

$
[
\ast 
{[}
\ast 
{]}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\{[
\}
\#2.
\newline 
\{]
\}
\mbox{''}
]$

$
[
{\cal M}(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
{\cal M}_2(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}
\_2(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline )
\mbox{''}
]$

$
[
s_0
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline s
\_0
\mbox{''}
]$

$
[
{\cal M}^*(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}
{\char94}
{*}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
\mathbf {zip}(
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{zip
\}(
\#1.
\newline ,
\#2.
\newline )
\mbox{''}
]$

$
[
\mathbf {assoc}_1(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{assoc
\}
\_1(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
\ast 
\_\{
\ast 
\}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\_
\{
\#2.
\newline 
\}
\mbox{''}
]$

$
[
\ast 
\_\{
\ast 
\}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}
\_
\mbox {$\backslash $}
\{
\#2.
\newline 
\mbox {$\backslash $}
\}
\mbox{''}
]$

$
[(
\ast 
)^{\mathbf {p}}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}(
\#1.
\newline )
{\char94}
\{
\mbox {$\backslash $}mathbf
\linebreak [0]\ \hskip0em plus2.0em{}
\{p
\}
\}
\mbox{''}
]$

$(
[
[
\ast 
\mathrel {\ddot {=}}
\ast 
]
\stackrel{
\mathrm{tex}
}{\rightarrow}
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}ddot
\linebreak [0]\ \hskip0em plus2.0em{}
\{
{=}
\}
\}
\#2.
\newline ]
\mbox{''}
]
)^{\mathbf {p}}$

$
[
[
\ast 
\mathrel {\dot {=}}
\ast 
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}dot
\linebreak [0]\ \hskip0em plus2.0em{}
\{
{=}
\}
\}
\#2.
\newline ]
\mbox{''}
]$

$
[
[
\ast 
\mathrel {\acute {=}}
\ast 
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}mathrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}acute
\linebreak [0]\ \hskip0em plus2.0em{}
\{
{=}
\}
\}
\#2.
\newline ]
\mbox{''}
]$

$
[
[
\ast 
\stackrel {\mathrm {pyk}}{=} 
\ast 
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{pyk
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\mbox{''}
]$

$
[
[
\ast 
\stackrel {\mathrm {tex}}{=} 
\ast 
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{tex
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\mbox{''}
]$

$
[
[
\ast 
\stackrel {\mathrm {name}}{=} 
\ast 
]
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline [
\#1/tex
\linebreak [0]\ \hskip0em plus2.0em{}name/tex.
\newline 
\mbox {$\backslash $}stackrel
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}mathrm
\linebreak [0]\ \hskip0em plus2.0em{}
\{name
\}
\}
\{
{=}
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2/tex
\linebreak [0]\ \hskip0em plus2.0em{}name.
\newline ]
\mbox{''}
]$

$
[
\tilde {{\cal M}}_1
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}
\}
\_1
\mbox{''}
]$

$
[
\tilde {{\cal M}}_2(
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}
\}
\_2(
\#1.
\newline )
\mbox{''}
]$

$
[
\tilde {{\cal M}}_3(
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}
\}
\_3(
\#1.
\newline )
\mbox{''}
]$

$
[
\tilde {{\cal M}}_4(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}
\}
\_4(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline )
\mbox{''}
]$

$
[
\tilde {{\cal M}}(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}M
\}
\}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
\tilde {{\cal Q}}(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}Q
\}
\}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
\tilde {{\cal Q}}_2(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}Q
\}
\}
\_2(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
\tilde {{\cal Q}}_3(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}Q
\}
\}
\_3(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline ,
\#4.
\newline )
\mbox{''}
]$

$
[
\tilde {{\cal Q}}^*(
\ast 
,
\ast 
,
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\{
\mbox {$\backslash $}cal
\linebreak [0]\ \hskip0em plus2.0em{}Q
\}
\}
{\char94}
{*}(
\#1.
\newline ,
\#2.
\newline ,
\#3.
\newline )
\mbox{''}
]$

$
[
(
\ast 
)
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline (
\#1.
\newline )
\mbox{''}
]$



\subsection{Line numbers}

The following definitions are experimental definitions of line numbers named ``ell a'', ``ell b'', etc.\ which expand into $[L_{01}]$, $[L_{02}]$, etc.\ in such a way that proof lines are numbered in succession. The ``ell dummy'' operator expands into different line numbers each time it is used and can be used for lines that are never referenced.

\begin{flushleft}
$
[L_a
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_a
\mbox{''}
]$
$
[L_b
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_b
\mbox{''}
]$
$
[L_c
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_c
\mbox{''}
]$
$
[L_d
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_d
\mbox{''}
]$
$
[L_e
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_e
\mbox{''}
]$
$
[L_f
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_f
\mbox{''}
]$
$
[L_g
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_g
\mbox{''}
]$
$
[L_h
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_h
\mbox{''}
]$
$
[L_i
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_i
\mbox{''}
]$
$
[L_j
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_j
\mbox{''}
]$
$
[L_k
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_k
\mbox{''}
]$
$
[L_l
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_l
\mbox{''}
]$
$
[L_m
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_m
\mbox{''}
]$
$
[L_n
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_n
\mbox{''}
]$
$
[L_o
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_o
\mbox{''}
]$
$
[L_p
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_p
\mbox{''}
]$
$
[L_q
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_q
\mbox{''}
]$
$
[L_r
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_r
\mbox{''}
]$
$
[L_s
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_s
\mbox{''}
]$
$
[L_t
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_t
\mbox{''}
]$
$
[L_u
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_u
\mbox{''}
]$
$
[L_v
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_v
\mbox{''}
]$
$
[L_w
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_w
\mbox{''}
]$
$
[L_x
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_x
\mbox{''}
]$
$
[L_y
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_y
\mbox{''}
]$
$
[L_z
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_z
\mbox{''}
]$
$
[L_A
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_A
\mbox{''}
]$
$
[L_B
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_B
\mbox{''}
]$
$
[L_C
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_C
\mbox{''}
]$
$
[L_D
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_D
\mbox{''}
]$
$
[L_E
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_E
\mbox{''}
]$
$
[L_F
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_F
\mbox{''}
]$
$
[L_G
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_G
\mbox{''}
]$
$
[L_H
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_H
\mbox{''}
]$
$
[L_I
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_I
\mbox{''}
]$
$
[L_J
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_J
\mbox{''}
]$
$
[L_K
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_K
\mbox{''}
]$
$
[L_L
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_L
\mbox{''}
]$
$
[L_M
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_M
\mbox{''}
]$
$
[L_N
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_N
\mbox{''}
]$
$
[L_O
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_O
\mbox{''}
]$
$
[L_P
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_P
\mbox{''}
]$
$
[L_Q
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_Q
\mbox{''}
]$
$
[L_R
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_R
\mbox{''}
]$
$
[L_S
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_S
\mbox{''}
]$
$
[L_T
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_T
\mbox{''}
]$
$
[L_U
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_U
\mbox{''}
]$
$
[L_V
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_V
\mbox{''}
]$
$
[L_W
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_W
\mbox{''}
]$
$
[L_X
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_X
\mbox{''}
]$
$
[L_Y
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_Y
\mbox{''}
]$
$
[L_Z
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_Z
\mbox{''}
]$
$
[L_?
\stackrel {\mathrm {name}}{=} 
\mbox{``}L
\_?
\mbox{''}
]$
\end{flushleft}

$
[L_a
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_a
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwella
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwella
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwella
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_b
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_b
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellb
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellb
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellb
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_c
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_c
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellc
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellc
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellc
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_d
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_d
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwelld
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelld
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelld
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_e
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_e
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwelle
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelle
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelle
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_f
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_f
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellf
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellf
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellf
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_g
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_g
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellg
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellg
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellg
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_h
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_h
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellh
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellh
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellh
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_i
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_i
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwelli
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelli
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelli
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_j
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_j
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellj
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellj
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellj
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_k
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_k
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellk
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellk
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_l
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_l
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwelll
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelll
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelll
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_m
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_m
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellm
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellm
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellm
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_n
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_n
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwelln
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelln
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelln
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_o
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_o
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwello
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwello
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwello
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_p
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_p
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellp
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellp
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellp
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_q
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_q
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellq
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellq
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellq
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_r
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_r
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellr
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellr
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellr
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_s
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_s
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwells
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwells
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwells
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_t
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_t
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellt
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellt
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_u
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_u
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellu
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellu
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellu
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_v
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_v
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellv
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellv
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellv
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_w
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_w
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellw
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellw
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellw
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_x
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_x
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellx
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellx
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellx
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_y
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_y
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwelly
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelly
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwelly
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_z
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_z
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellz
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellz
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellz
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_A
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_A
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbiga
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbiga
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbiga
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_B
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_B
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigb
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigb
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigb
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_C
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_C
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigc
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigc
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigc
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_D
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_D
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigd
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigd
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigd
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_E
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_E
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbige
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbige
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbige
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_F
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_F
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigf
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigf
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigf
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_G
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_G
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigg
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigg
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigg
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_H
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_H
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigh
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigh
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigh
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_I
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_I
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigi
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigi
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_J
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_J
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigj
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigj
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigj
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_K
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_K
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigk
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigk
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_L
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_L
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigl
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigl
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigl
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_M
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_M
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigm
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigm
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigm
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_N
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_N
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbign
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbign
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbign
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_O
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_O
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigo
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigo
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigo
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_P
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_P
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigp
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigp
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigp
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_Q
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_Q
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigq
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigq
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigq
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_R
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_R
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigr
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigr
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigr
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_S
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_S
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigs
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigs
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigs
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_T
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_T
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigt
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigt
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_U
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_U
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigu
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigu
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigu
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_V
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_V
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigv
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigv
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigv
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_W
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_W
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigw
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigw
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigw
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_X
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_X
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigx
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigx
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigx
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_Y
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_Y
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigy
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigy
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigy
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_Z
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_Z
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwellbigz
\mbox {$\backslash $}endcsname
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline 
\mbox {$\backslash $}xdef
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigz
\linebreak [0]\ \hskip0em plus2.0em{}
\{L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
\}
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwellbigz
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$

$
[L_?
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}relax
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}csname
\linebreak [0]\ \hskip0em plus2.0em{}lgwprooflinep
\mbox {$\backslash $}endcsname
\linebreak [0]\ \hskip0em plus2.0em{}L
\_?
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}else
\newline 
\mbox {$\backslash $}global
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}advance
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}by
\linebreak [0]\ \hskip0em plus2.0em{}1
\newline L
\mbox {$\backslash $}ifnum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\linebreak [0]\ \hskip0em plus2.0em{}
{<}10
\linebreak [0]\ \hskip0em plus2.0em{}0
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}number
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}lgwproofline
\newline 
\mbox {$\backslash $}fi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox{''}
]$



\subsection{Characters}

\subsubsection{Tex aspects of characters}

$
[
\newline 
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\newline 
\#1.
\mbox{''}
]$

$
[
\linebreak [0]\ \hskip0em plus2.0em{}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\mbox{''}
]$

$
[!
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}!
\#1.
\mbox{''}
]$

$
[
\mbox {\tt \char34}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox {\tt \char34}
\#1.
\mbox{''}
]$

$
[
\#
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#.
\#1.
\mbox{''}
]$

$
[
\$
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\$
\#1.
\mbox{''}
]$

$
[
\%
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\%
\#1.
\mbox{''}
]$

$
[
\&
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\&
\#1.
\mbox{''}
]$

$
[
\mbox {'}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox {'}
\#1.
\mbox{''}
]$

$
[(
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}(
\#1.
\mbox{''}
]$

$
[)
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``})
\#1.
\mbox{''}
]$

$
[
{*}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
{*}
\#1.
\mbox{''}
]$

$
[
{+}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
{+}
\#1.
\mbox{''}
]$

$
[,
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``},
\#1.
\mbox{''}
]$

$
[
\mbox{-}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox{-}
\#1.
\mbox{''}
]$

$
[.
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}.
\#1.
\mbox{''}
]$

$
[/
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}/
\#1.
\mbox{''}
]$

$
[0
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}0
\#1.
\mbox{''}
]$

$
[1
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}1
\#1.
\mbox{''}
]$

$
[2
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}2
\#1.
\mbox{''}
]$

$
[3
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}3
\#1.
\mbox{''}
]$

$
[4
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}4
\#1.
\mbox{''}
]$

$
[5
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}5
\#1.
\mbox{''}
]$

$
[6
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}6
\#1.
\mbox{''}
]$

$
[7
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}7
\#1.
\mbox{''}
]$

$
[8
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}8
\#1.
\mbox{''}
]$

$
[9
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}9
\#1.
\mbox{''}
]$

$
[
{:}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
{:}
\#1.
\mbox{''}
]$

$
[;
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``};
\#1.
\mbox{''}
]$

$
[
{<}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
{<}
\#1.
\mbox{''}
]$

$
[
{=}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
{=}
\#1.
\mbox{''}
]$

$
[
{>}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
{>}
\#1.
\mbox{''}
]$

$
[?
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}?
\#1.
\mbox{''}
]$

$
[@
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}@
\#1.
\mbox{''}
]$

$
[A
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}A
\#1.
\mbox{''}
]$

$
[B
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}B
\#1.
\mbox{''}
]$

$
[C
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}C
\#1.
\mbox{''}
]$

$
[D
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}D
\#1.
\mbox{''}
]$

$
[E
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}E
\#1.
\mbox{''}
]$

$
[F
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}F
\#1.
\mbox{''}
]$

$
[G
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}G
\#1.
\mbox{''}
]$

$
[H
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}H
\#1.
\mbox{''}
]$

$
[I
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}I
\#1.
\mbox{''}
]$

$
[J
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}J
\#1.
\mbox{''}
]$

$
[K
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}K
\#1.
\mbox{''}
]$

$
[L
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}L
\#1.
\mbox{''}
]$

$
[M
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}M
\#1.
\mbox{''}
]$

$
[N
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}N
\#1.
\mbox{''}
]$

$
[O
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}O
\#1.
\mbox{''}
]$

$
[P
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}P
\#1.
\mbox{''}
]$

$
[Q
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}Q
\#1.
\mbox{''}
]$

$
[R
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}R
\#1.
\mbox{''}
]$

$
[S
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}S
\#1.
\mbox{''}
]$

$
[T
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}T
\#1.
\mbox{''}
]$

$
[U
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}U
\#1.
\mbox{''}
]$

$
[V
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}V
\#1.
\mbox{''}
]$

$
[W
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}W
\#1.
\mbox{''}
]$

$
[X
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}X
\#1.
\mbox{''}
]$

$
[Y
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}Y
\#1.
\mbox{''}
]$

$
[Z
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}Z
\#1.
\mbox{''}
]$

$
[[
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}[
\#1.
\mbox{''}
]$

$
[
\mbox {$\backslash $}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox {$\backslash $}
\#1.
\mbox{''}
]$

$
[]
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}]
\#1.
\mbox{''}
]$

$
[
{\char94}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
{\char94}
\#1.
\mbox{''}
]$

$
[
\_
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\_
\#1.
\mbox{''}
]$

$
[a
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}a
\#1.
\mbox{''}
]$

$
[b
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}b
\#1.
\mbox{''}
]$

$
[c
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}c
\#1.
\mbox{''}
]$

$
[d
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}d
\#1.
\mbox{''}
]$

$
[e
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}e
\#1.
\mbox{''}
]$

$
[f
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}f
\#1.
\mbox{''}
]$

$
[g
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}g
\#1.
\mbox{''}
]$

$
[h
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}h
\#1.
\mbox{''}
]$

$
[i
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}i
\#1.
\mbox{''}
]$

$
[j
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}j
\#1.
\mbox{''}
]$

$
[k
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}k
\#1.
\mbox{''}
]$

$
[l
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}l
\#1.
\mbox{''}
]$

$
[m
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}m
\#1.
\mbox{''}
]$

$
[n
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}n
\#1.
\mbox{''}
]$

$
[o
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}o
\#1.
\mbox{''}
]$

$
[p
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}p
\#1.
\mbox{''}
]$

$
[q
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}q
\#1.
\mbox{''}
]$

$
[r
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}r
\#1.
\mbox{''}
]$

$
[s
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}s
\#1.
\mbox{''}
]$

$
[t
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}t
\#1.
\mbox{''}
]$

$
[u
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}u
\#1.
\mbox{''}
]$

$
[v
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}v
\#1.
\mbox{''}
]$

$
[w
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}w
\#1.
\mbox{''}
]$

$
[x
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}x
\#1.
\mbox{''}
]$

$
[y
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}y
\#1.
\mbox{''}
]$

$
[z
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}z
\#1.
\mbox{''}
]$

$
[
\mbox {`}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\mbox {`}
\#1.
\mbox{''}
]$

$
[
\{
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\{
\#1.
\mbox{''}
]$

$
[|
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}|
\#1.
\mbox{''}
]$

$
[
\}
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\}
\#1.
\mbox{''}
]$

$
[
\char126 
\mathsf{x}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\char126 
\#1.
\mbox{''}
]$



\subsubsection{Tex name aspects of characters}

$
[
\newline 
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\mbox{''}
]$

$
[
\linebreak [0]\ \hskip0em plus2.0em{}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}[0]
\mbox {$\backslash $}
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}hskip0em
\linebreak [0]\ \hskip0em plus2.0em{}plus2.0em
\{
\}
\#1.
\mbox{''}
]$

$
[
\mbox {\tt \char34}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {$\backslash $}tt
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {$\backslash $}char34
\}
\#1.
\mbox{''}
]$

$
[
\#
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\#.
\#1.
\mbox{''}
]$

$
[
\$
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\$
\#1.
\mbox{''}
]$

$
[
\%
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\%
\#1.
\mbox{''}
]$

$
[
\&
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\&
\#1.
\mbox{''}
]$

$
[
\mbox {'}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {'}
\}
\#1.
\mbox{''}
]$

$
[
{*}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\{
{*}
\}
\#1.
\mbox{''}
]$

$
[
{+}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\{
{+}
\}
\#1.
\mbox{''}
]$

$
[
\mbox{-}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\{
\mbox{-}
\}
\#1.
\mbox{''}
]$

$
[
{:}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\{
{:}
\}
\#1.
\mbox{''}
]$

$
[
{<}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\{
{<}
\}
\#1.
\mbox{''}
]$

$
[
{=}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\{
{=}
\}
\#1.
\mbox{''}
]$

$
[
{>}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\{
{>}
\}
\#1.
\mbox{''}
]$

$
[
\mbox {$\backslash $}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\$
\mbox {$\backslash $}backslash
\linebreak [0]\ \hskip0em plus2.0em{}
\$
\}
\#1.
\mbox{''}
]$

$
[
{\char94}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\{
\mbox {$\backslash $}char94
\}
\#1.
\mbox{''}
]$

$
[
\_
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\_
\#1.
\mbox{''}
]$

$
[
\mbox {`}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}mbox
\linebreak [0]\ \hskip0em plus2.0em{}
\{
\mbox {`}
\}
\#1.
\mbox{''}
]$

$
[
\{
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\{
\#1.
\mbox{''}
]$

$
[
\}
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}
\}
\#1.
\mbox{''}
]$

$
[
\char126 
\mathsf{x}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\newline 
\mbox {$\backslash $}char126
\linebreak [0]\ \hskip0em plus2.0em{}
\#1.
\mbox{''}
]$



\section{Pyk definitions}\label{section:PykDefinitions}

\subsection{The pyk language}

From the point of view of Logiweb, the \indexintro{pyk} language is a source language. A user may express a Logiweb page in pyk and then run the pyk source through the pyk compiler to obtain a Logiweb page.

A good way to learn the pyk language is to locate the pyk source of the present page and study it. The pyk source is likely to be in a file named ``base.pyk''. Plentiful comments in the pyk source explain what is going on.

The name ``pyk'' is constructed from the name ``Volapyk'' in the same way that Rene Thom construct the word ``versal'' from ``universal'': ``pyk'' is constructed by removing ``Vola'' from ``Volapyk''.

Volapyk was an artificial language constructed from several other languages by simplifying their words and their grammar. As an example, the name of the language itself is constructed from ``Vola'' which is a simplification of ``World'' and ``pyk'' which is a simplification of ``speak''.

The pyk language may be used for ``spoken mathematics'' and may, among other, be entered through a microphone when editing mathematical text. The language is partly called ``pyk'' because of this speach aspect, partly because it looks like Volapyk in the other sense of that word. As an example, in a proper setup, the pyk phrase

\begin{quote}

parenthesis var x plus var y end parenthesis square equals var x square plus two times var x times var y plus var y square

\end{quote}

\noindent may correspond to the formula

\[ ( x + y ) ^ 2 = x ^ 2 + 2 x y + y ^ 2 \]

Originally, the pyk language was restricted to use the letters from a to z plus spaces in order to ensure than anything could be entered through a microphone. Upon request, however, support for other characters has been added so that one may instead setup pyk such that the pyk phrase

\begin{verbatim}
( x + y ) ^ 2 = x ^ 2 + 2 x y + y ^ 2
\end{verbatim}

\noindent generates the formula above or such that the pyk phrase

\begin{verbatim}
All A: All B: A => B => A
\end{verbatim}

\noindent generates the formula

\[ \Pi {\cal A}: \Pi {\cal B}: {\cal A} \Rightarrow {\cal B} \Rightarrow {\cal A} \]



\subsection{Uses of pyk}

In principle, the pyk language is not part of Logiweb. The Logiweb standard merely defines how to interpret Logiweb vectors, i.e.\ Logiweb pages on binary format. The only formal link between Logiweb and pyk is the fact that Logiweb has a predefined concept that is proclaimable under the name of ``pyk''. The pyk language and compiler are just means for producing Logiweb pages. One could imagine other means for producing Logiweb pages that were completely independent of pyk.

Nevertheless, authors who publish on Logiweb are encouraged to give a pyk definition of each and every construct that is introduced on the page. In the future, the pyk definitions may be used for entering mathematics through a microphone or for reading mathematics e.g.\ for blind people.

At the time of writing, pyk definitions have a much more immediate use as explained in the following.

At the time of writing, the pyk compiler is the only realistic means for producing Logiweb pages. The pyk compiler takes a pyk source text as input and produces a Logiweb page as output. The pyk compiler also has facilities for rendering pages, for making various soundness checks, and for printing warnings and error messages.

A pyk source consists of a preamble and a body. The preamble defines the bibliography and dictionary of the page. The bibliography is a list of referenced pages and the dictionary is the list of all constructs introduced on the page. The preamble also defines other things like the priority and associativity of constructs and preliminary pyk definitions for all constructs.

When the pyk compiler reads the preamble, it loads all pages referenced in the bibliography. Then it extracts all pyk definitions from all referenced pages, merge them with the preliminary pyk definitions of the preamble, and use the resulting grammar for parsing the body of the page.

The pyk compiler does not care whether or not the resulting grammar is ambiguous as long as the body of the page has one and only one possible interpretation.

When the pyk compiler generates the Logiweb page, all the preliminary pyk definitions from the preamble are lost. Only pyk definitions explicitly included in the body by the author make their way to the resulting Logiweb page.

Hence, if you publish a Logiweb page and want to make the life easy for people who want to build on your work, you'd better include pyk definitions of each and every construct on your page. Do not omit constructs you think are unimportant or ``internal to the page'' in an information hiding sense. In the context of proof checking there is no such thing as an unimportant construct or an ``internal construct'' that one should not look at.



\subsection{Autogeneration of pyk definitions}

The preamble of a pyk source text lists the pyk definitions of all constructs introduced on the page defined by the source text. When the pyk compiler sees the keyword 'Pyk' (or whatever the keyword has been changed to by the -keyword option of the compiler) then it generates a list of pyk definitions, one for each construct.

The pyk compiler separates pyk definitions with construct 17 of the bed page. Construct 17 of the present page reads
%
\tex{$
[
\mathsf{x}
\mathrel{linebreak[4]} 
\mathsf{y}
\stackrel {\mathrm {tex}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}linebreak[4]
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
\tex{$
[
\mathsf{x}
\mathrel{linebreak[4]} 
\mathsf{y}
\stackrel {\mathrm {name}}{=} 
\mbox{``}
\#1.
\newline 
\mbox {$\backslash $}mathrel
\{linebreak[4]
\}
\linebreak [0]\ \hskip0em plus2.0em{}
\#2.
\mbox{''}
]$}%
%
$
\mathsf{x}
\mathrel{linebreak[4]} 
\mathsf{y}$.



\subsection{Autogenerated pyk definitions}

\begin{flushleft}
$(
[
\mbox{bracket $
\ast $ end bracket}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}bracket
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\mbox{''}
]
\linebreak[4] 
[
\mbox{big bracket $
\ast $ end bracket}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}big
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\mbox{''}
]
\linebreak[4] 
[
\ \$
\ast \$\linebreak[0]\ 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}math
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}math
\mbox{''}
]
\linebreak[4] 
[
\mathbf{flush\ left\ }[ 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}flush
\linebreak [0]\ \hskip0em plus2.0em{}left
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}left
\mbox{''}
]
\linebreak[4] 
[
\mathsf{x}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}x
\mbox{''}
]
\linebreak[4] 
[
\mathsf{y}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}y
\mbox{''}
]
\linebreak[4] 
[
\mathsf{z}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}z
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\bowtie
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proclaim
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}proclaim
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel{
\ast 
}{\rightarrow}
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
\mathrm{pyk}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}pyk
\mbox{''}
]
\linebreak[4] 
[
\mathrm{tex}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tex
\mbox{''}
]
\linebreak[4] 
[
\mathrm{name}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tex
\linebreak [0]\ \hskip0em plus2.0em{}name
\mbox{''}
]
\linebreak[4] 
[
\mathrm{prio}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}priority
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}x
\mbox{''}
]
\linebreak[4] 
[
\mathsf {T}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}true
\mbox{''}
]
\linebreak[4] 
[
\mathrm {if}(
\ast 
,\linebreak [0]
\ast 
,\linebreak [0]
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}then
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}else
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}if
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel {
\ast 
}{\Rightarrow }
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}introduce
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}introduce
\mbox{''}
]
\linebreak[4] 
[
\mathrm {val}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}value
\mbox{''}
]
\linebreak[4] 
[
\mathrm {claim}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}claim
\mbox{''}
]
\linebreak[4] 
[
\bot 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}bottom
\mbox{''}
]
\linebreak[4] 
[
f(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}function
\linebreak [0]\ \hskip0em plus2.0em{}f
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}function
\mbox{''}
]
\linebreak[4] 
[
(
\ast 
){}^{I} 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}identity
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}identity
\mbox{''}
]
\linebreak[4] 
[
\mathsf {F}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}false
\mbox{''}
]
\linebreak[4] 
[
\underline {0}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}zero
\mbox{''}
]
\linebreak[4] 
[
\underline {1}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}one
\mbox{''}
]
\linebreak[4] 
[
\underline {2}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}two
\mbox{''}
]
\linebreak[4] 
[
\underline {3}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}three
\mbox{''}
]
\linebreak[4] 
[
\underline {4}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}four
\mbox{''}
]
\linebreak[4] 
[
\underline {5}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}five
\mbox{''}
]
\linebreak[4] 
[
\underline {6}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}six
\mbox{''}
]
\linebreak[4] 
[
\underline {7}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}seven
\mbox{''}
]
\linebreak[4] 
[
\underline {8}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}eight
\mbox{''}
]
\linebreak[4] 
[
\underline {9}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}untagged
\linebreak [0]\ \hskip0em plus2.0em{}nine
\mbox{''}
]
\linebreak[4] 
[
0
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}zero
\mbox{''}
]
\linebreak[4] 
[
1
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}one
\mbox{''}
]
\linebreak[4] 
[
2
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}two
\mbox{''}
]
\linebreak[4] 
[
3
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}three
\mbox{''}
]
\linebreak[4] 
[
4
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}four
\mbox{''}
]
\linebreak[4] 
[
5
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}five
\mbox{''}
]
\linebreak[4] 
[
6
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}six
\mbox{''}
]
\linebreak[4] 
[
7
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seven
\mbox{''}
]
\linebreak[4] 
[
8
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}eight
\mbox{''}
]
\linebreak[4] 
[
9
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}nine
\mbox{''}
]
\linebreak[4] 
[
\mathsf {a}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}a
\mbox{''}
]
\linebreak[4] 
[
\mathsf {b}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}b
\mbox{''}
]
\linebreak[4] 
[
\mathsf {c}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}c
\mbox{''}
]
\linebreak[4] 
[
\mathsf {d}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}d
\mbox{''}
]
\linebreak[4] 
[
\mathsf {e}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}e
\mbox{''}
]
\linebreak[4] 
[
\mathsf {f}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}f
\mbox{''}
]
\linebreak[4] 
[
\mathsf {g}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}g
\mbox{''}
]
\linebreak[4] 
[
\mathsf {h}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}h
\mbox{''}
]
\linebreak[4] 
[
\mathsf {i}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}i
\mbox{''}
]
\linebreak[4] 
[
\mathsf {j}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}j
\mbox{''}
]
\linebreak[4] 
[
\mathsf {k}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}k
\mbox{''}
]
\linebreak[4] 
[
\mathsf {l}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}l
\mbox{''}
]
\linebreak[4] 
[
\mathsf {m}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}m
\mbox{''}
]
\linebreak[4] 
[
\mathsf {n}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}n
\mbox{''}
]
\linebreak[4] 
[
\mathsf {o}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}o
\mbox{''}
]
\linebreak[4] 
[
\mathsf {p}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}p
\mbox{''}
]
\linebreak[4] 
[
\mathsf {q}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}q
\mbox{''}
]
\linebreak[4] 
[
\mathsf {r}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}r
\mbox{''}
]
\linebreak[4] 
[
\mathsf {s}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}s
\mbox{''}
]
\linebreak[4] 
[
\mathsf {t}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}t
\mbox{''}
]
\linebreak[4] 
[
\mathsf {u}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}u
\mbox{''}
]
\linebreak[4] 
[
\mathsf {v}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}v
\mbox{''}
]
\linebreak[4] 
[
\mathsf {w}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}var
\linebreak [0]\ \hskip0em plus2.0em{}w
\mbox{''}
]
\linebreak[4] 
[
(
\ast 
)^M
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tagged
\linebreak [0]\ \hskip0em plus2.0em{}parenthesis
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}tagged
\mbox{''}
]
\linebreak[4] 
[
\mathrm {If}(
\ast 
,\linebreak [0]
\ast 
,\linebreak [0]
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tagged
\linebreak [0]\ \hskip0em plus2.0em{}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}then
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}else
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}if
\mbox{''}
]
\linebreak[4] 
[\mathrm {array}\{
\ast 
\}
\ast 
\mathrm {end\ array}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}array
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}array
\mbox{''}
]
\linebreak[4] 
[
l
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}left
\mbox{''}
]
\linebreak[4] 
[
c
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}center
\mbox{''}
]
\linebreak[4] 
[
r
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}right
\mbox{''}
]
\linebreak[4] 
[
\mathrm {empty}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}empty
\mbox{''}
]
\linebreak[4] 
[
\langle 
\ast 
\,{|}
\ast 
{:=}\,
\ast 
\rangle 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}substitute
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}set
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}substitute
\mbox{''}
]
\linebreak[4] 
[
{\cal M}(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}map
\linebreak [0]\ \hskip0em plus2.0em{}tag
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}tag
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal U}}(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}raw
\linebreak [0]\ \hskip0em plus2.0em{}map
\linebreak [0]\ \hskip0em plus2.0em{}untag
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}untag
\mbox{''}
]
\linebreak[4] 
[
{\cal U}(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}map
\linebreak [0]\ \hskip0em plus2.0em{}untag
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}untag
\mbox{''}
]
\linebreak[4] 
[
{\cal U}^M(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}normalizing
\linebreak [0]\ \hskip0em plus2.0em{}untag
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}untag
\mbox{''}
]
\linebreak[4] 
[
\mathbf {apply}(
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}apply
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}apply
\mbox{''}
]
\linebreak[4] 
[
\mathbf {apply}_1(
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}apply
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}apply
\mbox{''}
]
\linebreak[4] 
[
identifier( 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}identifier
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
identifier_{1}( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}identifier
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}id
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
array\mbox{-}\linebreak[0]plus( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}array
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}and
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}plus
\mbox{''}
]
\linebreak[4] 
[
array\mbox{-}\linebreak[0]remove( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}array
\linebreak [0]\ \hskip0em plus2.0em{}remove
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}array
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}level
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}remove
\mbox{''}
]
\linebreak[4] 
[
array\mbox{-}\linebreak[0]put( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}array
\linebreak [0]\ \hskip0em plus2.0em{}put
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}value
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}array
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}level
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}put
\mbox{''}
]
\linebreak[4] 
[
array\mbox{-}\linebreak[0]add( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}array
\linebreak [0]\ \hskip0em plus2.0em{}add
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}value
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}index
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}value
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}level
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}add
\mbox{''}
]
\linebreak[4] 
[
bit( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}bit
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}bit
\mbox{''}
]
\linebreak[4] 
[
bit_1( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}bit
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}bit
\mbox{''}
]
\linebreak[4] 
[
rack
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}rack
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {vector}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}vector
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {bibliography}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}bibliography
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {dictionary}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}dictionary
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {body}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}body
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}codex
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {expansion}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}expansion
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}code
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}cache
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {diagnose}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}diagnose
\linebreak [0]\ \hskip0em plus2.0em{}hook
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {pyk}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}pyk
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {tex}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tex
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {texname}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}texname
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}value
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {message}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}message
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {macro}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {definition}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}definition
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {unpack}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unpack
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {claim}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}claim
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {priority}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}priority
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {lambda}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}lambda
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {apply}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}apply
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {true}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}true
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {if}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}if
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {quote}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}quote
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {proclaim}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proclaim
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {define}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}define
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {introduce}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}introduce
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {hide}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}hide
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {pre}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}pre
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}\mathrm {post}\mbox {\tt \char34}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}post
\linebreak [0]\ \hskip0em plus2.0em{}identifier
\mbox{''}
]
\linebreak[4] 
[
{\cal E}(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}eval
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal E}_2(
\ast 
,
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}eval
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ref
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}id
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal E}_3(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}eval
\linebreak [0]\ \hskip0em plus2.0em{}three
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}function
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal E}_4(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}eval
\linebreak [0]\ \hskip0em plus2.0em{}four
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}arguments
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
\mathbf {lookup}(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}lookup
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}default
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}lookup
\mbox{''}
]
\linebreak[4] 
[
\mathbf {abstract}(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}abstract
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}abstract
\mbox{''}
]
\linebreak[4] 
[
\lceil 
\ast 
\rceil 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}quote
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}quote
\mbox{''}
]
\linebreak[4] 
[
{\cal M}(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}expand
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}state
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
{\cal M}_2(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}expand
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}definition
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}state
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
{\cal M}^*(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}expand
\linebreak [0]\ \hskip0em plus2.0em{}list
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}state
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
\mathrm {macro}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\mbox{''}
]
\linebreak[4] 
[
s_0
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\linebreak [0]\ \hskip0em plus2.0em{}state
\mbox{''}
]
\linebreak[4] 
[
\mathbf {zip}(
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}zip
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}with
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}zip
\mbox{''}
]
\linebreak[4] 
[
\mathbf {assoc}_1(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}assoc
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}address
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}index
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}assoc
\mbox{''}
]
\linebreak[4] 
[(
\ast 
)^{\mathbf {p}}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}protect
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}protect
\mbox{''}
]
\linebreak[4] 
[
\mbox{self}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}self
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\mathrel {\ddot {=}}
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\mathrel {\dot {=}}
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}value
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\mathrel {\acute {=}}
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}intro
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel {\mathrm {pyk}}{=} 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}pyk
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel {\mathrm {tex}}{=} 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tex
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel {\mathrm {name}}{=} 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tex
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
\mathbf{Priority\ table} [ 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}priority
\linebreak [0]\ \hskip0em plus2.0em{}table
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}table
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal M}}_1
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}one
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal M}}_2(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal M}}_3(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}three
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal M}}_4(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}four
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}state
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}definition
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal M}}(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}state
\linebreak [0]\ \hskip0em plus2.0em{}expand
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}state
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal Q}}(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}quote
\linebreak [0]\ \hskip0em plus2.0em{}expand
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal Q}}_2(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}quote
\linebreak [0]\ \hskip0em plus2.0em{}expand
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal Q}}_3(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}quote
\linebreak [0]\ \hskip0em plus2.0em{}expand
\linebreak [0]\ \hskip0em plus2.0em{}three
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}value
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
\tilde {{\cal Q}}^*(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}quote
\linebreak [0]\ \hskip0em plus2.0em{}expand
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}parenthesis
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}parenthesis
\mbox{''}
]
\linebreak[4] 
[
\left( 
\ast 
\right) 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}big
\linebreak [0]\ \hskip0em plus2.0em{}parenthesis
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}parenthesis
\mbox{''}
]
\linebreak[4] 
[
display(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}display
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}display
\mbox{''}
]
\linebreak[4] 
[
statement(
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}statement
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}statement
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
]^{\cdot}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}spying
\linebreak [0]\ \hskip0em plus2.0em{}test
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}test
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
]^-
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}false
\linebreak [0]\ \hskip0em plus2.0em{}spying
\linebreak [0]\ \hskip0em plus2.0em{}test
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}test
\mbox{''}
]
\linebreak[4] 
[
\mathbf{aspect}( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}aspect
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}subcodex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\mathbf{aspect}( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}aspect
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
\langle 
\ast 
\rangle 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tuple
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}tuple
\mbox{''}
]
\linebreak[4] 
[
\mathbf {tuple}_1( 
\ast 
) 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tuple
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}tuple
\mbox{''}
]
\linebreak[4] 
[
\mathbf {tuple}_2( 
\ast 
) 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tuple
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}tuple
\mbox{''}
]
\linebreak[4] 
[
let_2( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}let
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}apply
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}let
\mbox{''}
]
\linebreak[4] 
[
let_1( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}let
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}apply
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}let
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel {claim}{=}
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}claim
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
\mbox{checker}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}checker
\mbox{''}
]
\linebreak[4] 
[
\mathbf{check}( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}check
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}check
\mbox{''}
]
\linebreak[4] 
[
\mathbf{check}_2( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}check
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}def
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}check
\mbox{''}
]
\linebreak[4] 
[
\mathbf{check}_3( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}check
\linebreak [0]\ \hskip0em plus2.0em{}three
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}def
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}check
\mbox{''}
]
\linebreak[4] 
[
\mathbf{check}^*( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}check
\linebreak [0]\ \hskip0em plus2.0em{}list
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}check
\mbox{''}
]
\linebreak[4] 
[
\mathbf{check}^*_2( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}check
\linebreak [0]\ \hskip0em plus2.0em{}list
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}value
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}check
\mbox{''}
]
\linebreak[4] 
[
\relax [ 
\ast 
\relax ]^{\cdot} 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}test
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}test
\mbox{''}
]
\linebreak[4] 
[
\relax [ 
\ast 
\relax ]^{-} 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}false
\linebreak [0]\ \hskip0em plus2.0em{}test
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}test
\mbox{''}
]
\linebreak[4] 
[
\relax [ 
\ast 
\relax ]^{\circ} 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}raw
\linebreak [0]\ \hskip0em plus2.0em{}test
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}test
\mbox{''}
]
\linebreak[4] 
[
msg
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}message
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel {msg}{=} 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}message
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
{<}stmt{>}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}the
\linebreak [0]\ \hskip0em plus2.0em{}statement
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
stmt
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}statement
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel {stmt}{=}
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}statement
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
HeadNil'
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}axiom
\mbox{''}
]
\linebreak[4] 
[
HeadPair'
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}scheme
\mbox{''}
]
\linebreak[4] 
[
Transitivity'
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}rule
\mbox{''}
]
\linebreak[4] 
[
{\makebox [0mm][l]{$\bot $}\,{\bot }}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}absurdity
\mbox{''}
]
\linebreak[4] 
[
Contra'
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}contraexample
\mbox{''}
]
\linebreak[4] 
[
T'_{E}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}theory
\linebreak [0]\ \hskip0em plus2.0em{}primed
\mbox{''}
]
\linebreak[4] 
[
L_{1}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
]
\linebreak[4] 
[\underline{
\ast }
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}metavar
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}metavar
\mbox{''}
]
\linebreak[4] 
[{\cal A}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}a
\mbox{''}
]
\linebreak[4] 
[{\cal B}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}b
\mbox{''}
]
\linebreak[4] 
[{\cal C}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}c
\mbox{''}
]
\linebreak[4] 
[{\cal D}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}d
\mbox{''}
]
\linebreak[4] 
[{\cal E}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}e
\mbox{''}
]
\linebreak[4] 
[{\cal F}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}f
\mbox{''}
]
\linebreak[4] 
[{\cal G}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}g
\mbox{''}
]
\linebreak[4] 
[{\cal H}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}h
\mbox{''}
]
\linebreak[4] 
[{\cal I}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}i
\mbox{''}
]
\linebreak[4] 
[{\cal J}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}j
\mbox{''}
]
\linebreak[4] 
[{\cal K}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}k
\mbox{''}
]
\linebreak[4] 
[{\cal L}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}l
\mbox{''}
]
\linebreak[4] 
[{\cal M}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}m
\mbox{''}
]
\linebreak[4] 
[{\cal N}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}n
\mbox{''}
]
\linebreak[4] 
[{\cal O}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}o
\mbox{''}
]
\linebreak[4] 
[{\cal P}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}p
\mbox{''}
]
\linebreak[4] 
[{\cal Q}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}q
\mbox{''}
]
\linebreak[4] 
[{\cal R}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}r
\mbox{''}
]
\linebreak[4] 
[{\cal S}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}s
\mbox{''}
]
\linebreak[4] 
[{\cal T}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}t
\mbox{''}
]
\linebreak[4] 
[{\cal U}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}u
\mbox{''}
]
\linebreak[4] 
[{\cal V}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}v
\mbox{''}
]
\linebreak[4] 
[{\cal W}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}w
\mbox{''}
]
\linebreak[4] 
[{\cal X}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}x
\mbox{''}
]
\linebreak[4] 
[{\cal Y}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}y
\mbox{''}
]
\linebreak[4] 
[{\cal Z}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}meta
\linebreak [0]\ \hskip0em plus2.0em{}z
\mbox{''}
]
\linebreak[4] 
[
\langle 
\ast 
\,{\protect\vert}
\ast 
{:=}\,
\ast 
\rangle 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}sub
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}set
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}sub
\mbox{''}
]
\linebreak[4] 
[
\langle ^ { \ast } 
\ast 
\,{\protect\vert}
\ast 
{:=}\,
\ast 
\rangle 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}sub
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}set
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}sub
\mbox{''}
]
\linebreak[4] 
[
\emptyset 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}the
\linebreak [0]\ \hskip0em plus2.0em{}empty
\linebreak [0]\ \hskip0em plus2.0em{}set
\mbox{''}
]
\linebreak[4] 
[
Remainder
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}remainder
\mbox{''}
]
\linebreak[4] 
[
( 
\ast 
)^{\bf v}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}make
\linebreak [0]\ \hskip0em plus2.0em{}visible
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}visible
\mbox{''}
]
\linebreak[4] 
[
intro(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}intro
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}index
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]
\linebreak[4] 
[
intro(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}intro
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]
\linebreak[4] 
[
error(
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}error
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}error
\mbox{''}
]
\linebreak[4] 
[
error_{2}(
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}error
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}error
\mbox{''}
]
\linebreak[4] 
[
proof( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proof
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}proof
\mbox{''}
]
\linebreak[4] 
[
proof_{2}( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proof
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}proof
\mbox{''}
]
\linebreak[4] 
[
{\cal S}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}sequent
\linebreak [0]\ \hskip0em plus2.0em{}eval
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{I}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}init
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{\rhd}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}modus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{\rhd}(
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}modus
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{E}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}verify
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{E}(
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}verify
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{+}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}sequent
\linebreak [0]\ \hskip0em plus2.0em{}eval
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{+}(
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{-}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}minus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{-}(
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}minus
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{\ast}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}deref
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{\ast}(
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}deref
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{2}^{\ast}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}deref
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}def
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{\char64}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}at
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{\char64}(
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}at
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{\vdash}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}infer
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{\vdash}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}infer
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}premise
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}endorse
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}endorse
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}side
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{i.e.}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}est
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{i.e.}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}est
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{2}^{i.e.}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}est
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}def
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{\forall}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}all
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{\forall}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}all
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}variable
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}^{;}(
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}cut
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{1}^{;}(
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}cut
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}forerunner
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal S}_{2}^{;}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}seqeval
\linebreak [0]\ \hskip0em plus2.0em{}cut
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}forerunner
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}eval
\mbox{''}
]
\linebreak[4] 
[
{\cal T}( 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}computably
\linebreak [0]\ \hskip0em plus2.0em{}true
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}true
\mbox{''}
]
\linebreak[4] 
[
claims( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}claims
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ref
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}claims
\mbox{''}
]
\linebreak[4] 
[
claims_2( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}claims
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ref
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}claims
\mbox{''}
]
\linebreak[4] 
[
{<}proof{>}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}the
\linebreak [0]\ \hskip0em plus2.0em{}proof
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
proof
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proof
\mbox{''}
]
\linebreak[4] 
[
[ \mathbf{Lemma\ } 
\ast 
\colon 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}lemma
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}says
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
]
\linebreak[4] 
[
[ \mathbf{Proof\ of\ }
\ast 
\colon 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proof
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}reads
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}proof
\mbox{''}
]
\linebreak[4] 
[
[ 
\ast 
\mathbf{\ lemma\ } 
\ast 
\colon 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}in
\linebreak [0]\ \hskip0em plus2.0em{}theory
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}says
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
]
\linebreak[4] 
[
[ 
\ast 
\mathbf{\ antilemma\ } 
\ast 
\colon 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}in
\linebreak [0]\ \hskip0em plus2.0em{}theory
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}antilemma
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}says
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}antilemma
\mbox{''}
]
\linebreak[4] 
[
[ 
\ast 
\mathbf{\ rule\ } 
\ast 
\colon 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}in
\linebreak [0]\ \hskip0em plus2.0em{}theory
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}rule
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}says
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}rule
\mbox{''}
]
\linebreak[4] 
[
[ 
\ast 
\mathbf{\ antirule\ } 
\ast 
\colon 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}in
\linebreak [0]\ \hskip0em plus2.0em{}theory
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}antirule
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}says
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}antirule
\mbox{''}
]
\linebreak[4] 
[
\mbox{verifier}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}verifier
\mbox{''}
]
\linebreak[4] 
[
{\cal V}_1( 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}verify
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}verify
\mbox{''}
]
\linebreak[4] 
[
{\cal V}_2( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}verify
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}proofs
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}verify
\mbox{''}
]
\linebreak[4] 
[
{\cal V}_3( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}verify
\linebreak [0]\ \hskip0em plus2.0em{}three
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ref
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequents
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}diagnose
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}verify
\mbox{''}
]
\linebreak[4] 
[
{\cal V}_4( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}verify
\linebreak [0]\ \hskip0em plus2.0em{}four
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}premises
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}verify
\mbox{''}
]
\linebreak[4] 
[
{\cal V}_5( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}verify
\linebreak [0]\ \hskip0em plus2.0em{}five
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ref
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}array
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequents
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}verify
\mbox{''}
]
\linebreak[4] 
[
{\cal V}_6( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}verify
\linebreak [0]\ \hskip0em plus2.0em{}six
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ref
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}list
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequents
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}verify
\mbox{''}
]
\linebreak[4] 
[
{\cal V}_7( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}verify
\linebreak [0]\ \hskip0em plus2.0em{}seven
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ref
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}id
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequents
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}verify
\mbox{''}
]
\linebreak[4] 
[
Cut( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}cut
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}and
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}cut
\mbox{''}
]
\linebreak[4] 
[
Head_{\oplus} ( 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}head
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}head
\mbox{''}
]
\linebreak[4] 
[
Tail_{\oplus} ( 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tail
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}tail
\mbox{''}
]
\linebreak[4] 
[
rule_1( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}rule
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}theory
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}rule
\mbox{''}
]
\linebreak[4] 
[
rule( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}rule
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}subcodex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}rule
\mbox{''}
]
\linebreak[4] 
[
Rule\ tactic
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}rule
\linebreak [0]\ \hskip0em plus2.0em{}tactic
\mbox{''}
]
\linebreak[4] 
[
Plus( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}plus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}and
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}plus
\mbox{''}
]
\linebreak[4] 
[
[ \mathbf{Theory\ } 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}theory
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}theory
\mbox{''}
]
\linebreak[4] 
[
theory_2( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}theory
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}theory
\mbox{''}
]
\linebreak[4] 
[
theory_3( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}theory
\linebreak [0]\ \hskip0em plus2.0em{}three
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}theory
\mbox{''}
]
\linebreak[4] 
[
theory_4( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}theory
\linebreak [0]\ \hskip0em plus2.0em{}four
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sum
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}theory
\mbox{''}
]
\linebreak[4] 
[
HeadNil''
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}axiom
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\linebreak [0]\ \hskip0em plus2.0em{}primed
\mbox{''}
]
\linebreak[4] 
[
HeadPair''
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}scheme
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\linebreak [0]\ \hskip0em plus2.0em{}primed
\mbox{''}
]
\linebreak[4] 
[
Transitivity''
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}rule
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\linebreak [0]\ \hskip0em plus2.0em{}primed
\mbox{''}
]
\linebreak[4] 
[
Contra''
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}contraexample
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\linebreak [0]\ \hskip0em plus2.0em{}primed
\mbox{''}
]
\linebreak[4] 
[
HeadNil
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}axiom
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
]
\linebreak[4] 
[
HeadPair
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}scheme
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
]
\linebreak[4] 
[
Transitivity
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}rule
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
]
\linebreak[4] 
[
Contra
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}contraexample
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\mbox{''}
]
\linebreak[4] 
[
T_E
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}example
\linebreak [0]\ \hskip0em plus2.0em{}theory
\mbox{''}
]
\linebreak[4] 
[
ragged\ right
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ragged
\linebreak [0]\ \hskip0em plus2.0em{}right
\mbox{''}
]
\linebreak[4] 
[
ragged\ right\ expansion\ 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ragged
\linebreak [0]\ \hskip0em plus2.0em{}right
\linebreak [0]\ \hskip0em plus2.0em{}expansion
\mbox{''}
]
\linebreak[4] 
[
parm(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}parameter
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}seed
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}parameter
\mbox{''}
]
\linebreak[4] 
[
parm^*(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}parameter
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}stack
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}seed
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}parameter
\mbox{''}
]
\linebreak[4] 
[
inst(
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}instantiate
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}with
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}instantiate
\mbox{''}
]
\linebreak[4] 
[
inst^*(
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}instantiate
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}with
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}instantiate
\mbox{''}
]
\linebreak[4] 
[
occur(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}occur
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}substitution
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}occur
\mbox{''}
]
\linebreak[4] 
[
occur^*(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}occur
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}substitution
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}occur
\mbox{''}
]
\linebreak[4] 
[
unify(
\ast 
=
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unify
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}with
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}substitution
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}unify
\mbox{''}
]
\linebreak[4] 
[
unify^*(
\ast 
=
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unify
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}with
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}substitution
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}unify
\mbox{''}
]
\linebreak[4] 
[
unify_2(
\ast 
=
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unify
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}with
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}substitution
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}unify
\mbox{''}
]
\linebreak[4] 
[L_a
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}a
\mbox{''}
]
\linebreak[4] 
[L_b
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}b
\mbox{''}
]
\linebreak[4] 
[L_c
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}c
\mbox{''}
]
\linebreak[4] 
[L_d
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}d
\mbox{''}
]
\linebreak[4] 
[L_e
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}e
\mbox{''}
]
\linebreak[4] 
[L_f
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}f
\mbox{''}
]
\linebreak[4] 
[L_g
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}g
\mbox{''}
]
\linebreak[4] 
[L_h
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}h
\mbox{''}
]
\linebreak[4] 
[L_i
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}i
\mbox{''}
]
\linebreak[4] 
[L_j
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}j
\mbox{''}
]
\linebreak[4] 
[L_k
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}k
\mbox{''}
]
\linebreak[4] 
[L_l
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}l
\mbox{''}
]
\linebreak[4] 
[L_m
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}m
\mbox{''}
]
\linebreak[4] 
[L_n
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}n
\mbox{''}
]
\linebreak[4] 
[L_o
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}o
\mbox{''}
]
\linebreak[4] 
[L_p
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}p
\mbox{''}
]
\linebreak[4] 
[L_q
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}q
\mbox{''}
]
\linebreak[4] 
[L_r
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}r
\mbox{''}
]
\linebreak[4] 
[L_s
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}s
\mbox{''}
]
\linebreak[4] 
[L_t
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}t
\mbox{''}
]
\linebreak[4] 
[L_u
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}u
\mbox{''}
]
\linebreak[4] 
[L_v
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}v
\mbox{''}
]
\linebreak[4] 
[L_w
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}w
\mbox{''}
]
\linebreak[4] 
[L_x
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}x
\mbox{''}
]
\linebreak[4] 
[L_y
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}y
\mbox{''}
]
\linebreak[4] 
[L_z
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}z
\mbox{''}
]
\linebreak[4] 
[L_A
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}a
\mbox{''}
]
\linebreak[4] 
[L_B
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}b
\mbox{''}
]
\linebreak[4] 
[L_C
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}c
\mbox{''}
]
\linebreak[4] 
[L_D
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}d
\mbox{''}
]
\linebreak[4] 
[L_E
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}e
\mbox{''}
]
\linebreak[4] 
[L_F
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}f
\mbox{''}
]
\linebreak[4] 
[L_G
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}g
\mbox{''}
]
\linebreak[4] 
[L_H
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}h
\mbox{''}
]
\linebreak[4] 
[L_I
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}i
\mbox{''}
]
\linebreak[4] 
[L_J
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}j
\mbox{''}
]
\linebreak[4] 
[L_K
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}k
\mbox{''}
]
\linebreak[4] 
[L_L
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}l
\mbox{''}
]
\linebreak[4] 
[L_M
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}m
\mbox{''}
]
\linebreak[4] 
[L_N
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}n
\mbox{''}
]
\linebreak[4] 
[L_O
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}o
\mbox{''}
]
\linebreak[4] 
[L_P
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}p
\mbox{''}
]
\linebreak[4] 
[L_Q
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}q
\mbox{''}
]
\linebreak[4] 
[L_R
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}r
\mbox{''}
]
\linebreak[4] 
[L_S
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}s
\mbox{''}
]
\linebreak[4] 
[L_T
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}t
\mbox{''}
]
\linebreak[4] 
[L_U
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}u
\mbox{''}
]
\linebreak[4] 
[L_V
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}v
\mbox{''}
]
\linebreak[4] 
[L_W
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}w
\mbox{''}
]
\linebreak[4] 
[L_X
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}x
\mbox{''}
]
\linebreak[4] 
[L_Y
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}y
\mbox{''}
]
\linebreak[4] 
[L_Z
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}big
\linebreak [0]\ \hskip0em plus2.0em{}z
\mbox{''}
]
\linebreak[4] 
[L_?
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}ell
\linebreak [0]\ \hskip0em plus2.0em{}dummy
\mbox{''}
]
\linebreak[4] 
[
Reflexivity
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}sequent
\linebreak [0]\ \hskip0em plus2.0em{}reflexivity
\mbox{''}
]
\linebreak[4] 
[
Reflexivity_1
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tactic
\linebreak [0]\ \hskip0em plus2.0em{}reflexivity
\mbox{''}
]
\linebreak[4] 
[
Commutativity
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}sequent
\linebreak [0]\ \hskip0em plus2.0em{}commutativity
\mbox{''}
]
\linebreak[4] 
[
Commutativity_1
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tactic
\linebreak [0]\ \hskip0em plus2.0em{}commutativity
\mbox{''}
]
\linebreak[4] 
[
{<}tactic{>}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}the
\linebreak [0]\ \hskip0em plus2.0em{}tactic
\linebreak [0]\ \hskip0em plus2.0em{}aspect
\mbox{''}
]
\linebreak[4] 
[
tactic
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tactic
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
\stackrel {tactic}{=}
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tactic
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}define
\mbox{''}
]
\linebreak[4] 
[
{\cal P}( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proof
\linebreak [0]\ \hskip0em plus2.0em{}expand
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}state
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
{\cal P}^*( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proof
\linebreak [0]\ \hskip0em plus2.0em{}expand
\linebreak [0]\ \hskip0em plus2.0em{}list
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}state
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}expand
\mbox{''}
]
\linebreak[4] 
[
p_0
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}proof
\linebreak [0]\ \hskip0em plus2.0em{}state
\mbox{''}
]
\linebreak[4] 
[
conclude_1 ( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}conclude
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}conclude
\mbox{''}
]
\linebreak[4] 
[
conclude_2 ( 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}conclude
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}proves
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cache
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}conclude
\mbox{''}
]
\linebreak[4] 
[
conclude_3 ( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}conclude
\linebreak [0]\ \hskip0em plus2.0em{}three
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}proves
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}substitution
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}conclude
\mbox{''}
]
\linebreak[4] 
[
conclude_4 ( 
\ast 
, 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}conclude
\linebreak [0]\ \hskip0em plus2.0em{}four
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}lemma
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}conclude
\mbox{''}
]
\linebreak[4] 
[
\ast 
\_\{
\ast 
\}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sub
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}sub
\mbox{''}
]
\linebreak[4] 
[
\ast 
/indexintro(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}intro
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}index
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]
\linebreak[4] 
[
\ast 
/intro(
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}intro
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]
\linebreak[4] 
[
\ast 
/bothintro(
\ast 
,
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}intro
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}index
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]
\linebreak[4] 
[
\ast 
/nameintro(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}intro
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}pyk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}name
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}intro
\mbox{''}
]
\linebreak[4] 
[
\ast '
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}prime
\mbox{''}
]
\linebreak[4] 
[
\ast 
{[}
\ast 
{]}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}assoc
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}assoc
\mbox{''}
]
\linebreak[4] 
[
\ast 
[ 
\ast 
{\rightarrow} 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}set
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}set
\mbox{''}
]
\linebreak[4] 
[
\ast 
[ 
\ast 
{\Rightarrow} 
\ast 
]
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}set
\linebreak [0]\ \hskip0em plus2.0em{}multi
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}set
\mbox{''}
]
\linebreak[4] 
[
\ast 
0
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}bit
\linebreak [0]\ \hskip0em plus2.0em{}nil
\mbox{''}
]
\linebreak[4] 
[
\ast 
1
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}bit
\linebreak [0]\ \hskip0em plus2.0em{}one
\mbox{''}
]
\linebreak[4] 
[
0 \mathrm {b}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}binary
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mbox {-color}( 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}color
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}color
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mbox {-color}^{\ast}( 
\ast 
)
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}color
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}color
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^H
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}raw
\linebreak [0]\ \hskip0em plus2.0em{}head
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^T
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}raw
\linebreak [0]\ \hskip0em plus2.0em{}tail
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^U
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cardinal
\linebreak [0]\ \hskip0em plus2.0em{}untag
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^h
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}head
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^t
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tail
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^s
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}singular
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^c
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}cardinal
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^d
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}data
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^a
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}atomic
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^C
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cardinal
\linebreak [0]\ \hskip0em plus2.0em{}retract
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^M
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tagged
\linebreak [0]\ \hskip0em plus2.0em{}retract
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^B
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}boolean
\linebreak [0]\ \hskip0em plus2.0em{}retract
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{r}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ref
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{i}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}id
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{d}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}debug
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{R}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}root
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{0}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}zeroth
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{1}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}first
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{2}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}second
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{3}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}third
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{4}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}fourth
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{5}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}fifth
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{6}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sixth
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{7}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}seventh
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{8}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}eighth
\mbox{''}
]
\linebreak[4] 
[
\ast 
{}^{9}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}ninth
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ { E }
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}error
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ {\cal V}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}metavar
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ {\cal C}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}metaclosed
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ {{\cal C} ^ { \ast }}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}is
\linebreak [0]\ \hskip0em plus2.0em{}metaclosed
\linebreak [0]\ \hskip0em plus2.0em{}star
\mbox{''}
]
\linebreak[4] 
[
\mbox{``}
\ast 
\mbox{''}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}start
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}text
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}unicode
\linebreak [0]\ \hskip0em plus2.0em{}text
\mbox{''}
]
\linebreak[4] 
[
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}text
\mbox{''}
]
\linebreak[4] 
[
(
\ast 
)^{\bf t}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}text
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}text
\mbox{''}
]
\linebreak[4] 
[
\mbox{string}(
\ast 
)+
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}text
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[\mbox{string}(
\ast 
)\mathrel{++}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}text
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}indent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\newline 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\linebreak [0]\ \hskip0em plus2.0em{}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}space
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[!
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}exclamation
\linebreak [0]\ \hskip0em plus2.0em{}mark
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mbox {\tt \char34}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}quotation
\linebreak [0]\ \hskip0em plus2.0em{}mark
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\#
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}number
\linebreak [0]\ \hskip0em plus2.0em{}sign
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\$
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}dollar
\linebreak [0]\ \hskip0em plus2.0em{}sign
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\%
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}percent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\&
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}ampersand
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mbox {'}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}apostrophe
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[(
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}left
\linebreak [0]\ \hskip0em plus2.0em{}parenthesis
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[)
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}right
\linebreak [0]\ \hskip0em plus2.0em{}parenthesis
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{*}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}asterisk
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{+}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}sign
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[,
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}comma
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mbox{-}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}hyphen
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[.
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}period
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[/
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}slash
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[0
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}zero
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[1
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[2
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}two
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[3
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}three
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[4
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}four
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[5
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}five
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[6
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}six
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[7
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}seven
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[8
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}eight
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[9
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}nine
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{:}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}colon
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[;
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}semicolon
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{<}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}less
\linebreak [0]\ \hskip0em plus2.0em{}than
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{=}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}sign
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{>}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}greater
\linebreak [0]\ \hskip0em plus2.0em{}than
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[?
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}question
\linebreak [0]\ \hskip0em plus2.0em{}mark
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[@
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}commercial
\linebreak [0]\ \hskip0em plus2.0em{}at
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[A
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}a
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[B
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}b
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[C
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}c
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[D
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}d
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[E
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}e
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[F
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}f
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[G
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}g
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[H
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}h
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[I
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}i
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[J
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}j
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[K
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}k
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[L
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}l
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[M
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}m
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[N
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}n
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[O
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}o
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[P
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}p
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[Q
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}q
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[R
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}r
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[S
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}s
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[T
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}t
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[U
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}u
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[V
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}v
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[W
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}w
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[X
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}x
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[Y
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}y
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[Z
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}capital
\linebreak [0]\ \hskip0em plus2.0em{}z
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[[
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}left
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mbox {$\backslash $}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}backslash
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[]
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}right
\linebreak [0]\ \hskip0em plus2.0em{}bracket
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{\char94}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}circumflex
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\_
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}underscore
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mbox {`}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}grave
\linebreak [0]\ \hskip0em plus2.0em{}accent
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[a
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}a
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[b
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}b
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[c
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}c
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[d
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}d
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[e
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}e
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[f
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}f
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[g
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}g
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[h
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}h
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[i
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}i
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[j
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}j
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[k
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}k
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[l
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}l
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[m
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}m
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[n
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}n
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[o
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}o
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[p
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}p
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[q
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}q
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[r
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}r
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[s
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}s
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[t
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}t
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[u
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}u
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[v
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}v
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[w
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}w
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[x
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}x
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[y
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}y
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[z
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}small
\linebreak [0]\ \hskip0em plus2.0em{}z
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\{
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}left
\linebreak [0]\ \hskip0em plus2.0em{}brace
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[|
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}vertical
\linebreak [0]\ \hskip0em plus2.0em{}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}right
\linebreak [0]\ \hskip0em plus2.0em{}brace
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\char126 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}unicode
\linebreak [0]\ \hskip0em plus2.0em{}tilde
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mathbf{Preassociative}\,
\ast 
; 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}preassociative
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}greater
\linebreak [0]\ \hskip0em plus2.0em{}than
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mathbf{Postassociative}\,
\ast 
; 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}postassociative
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}greater
\linebreak [0]\ \hskip0em plus2.0em{}than
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
[
\ast 
] , \linebreak [0] 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}priority
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mathrm{priority} \,
\ast 
\, \mathrm{end}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}priority
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}priority
\mbox{''}
]
\linebreak[4] 
[
newline\ 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
macro\ newline\ 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}macro
\linebreak [0]\ \hskip0em plus2.0em{}newline
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathbin {\mbox {'}}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}apply
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathbin {\mbox {`}}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tagged
\linebreak [0]\ \hskip0em plus2.0em{}apply
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\cdot 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}times
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\cdot_0 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}times
\linebreak [0]\ \hskip0em plus2.0em{}zero
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
+ 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathop{+_0} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}zero
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathop{+_1} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
- 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}minus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathop{-_0} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}minus
\linebreak [0]\ \hskip0em plus2.0em{}zero
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathop{-_1} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}minus
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\cup \{ 
\ast 
\}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}plus
\mbox{''}
]
\linebreak[4] 
[
\ast 
\cup 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}union
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\backslash \{ 
\ast 
\}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}minus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}minus
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel { \dot { . \, . } }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}raw
\linebreak [0]\ \hskip0em plus2.0em{}pair
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel { \underline { \dot { . \, . } } }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}eager
\linebreak [0]\ \hskip0em plus2.0em{}pair
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel { \underline { : \, : } }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tagged
\linebreak [0]\ \hskip0em plus2.0em{}pair
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel { \underline { {+} 2 \ast } }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}untagged
\linebreak [0]\ \hskip0em plus2.0em{}double
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel { : \, : }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}pair
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel { {+} 2 \ast }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}double
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
,\linebreak [0] 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}comma
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel {B}{\approx }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}boolean
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel {D}{\approx }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}data
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel {C}{\approx }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cardinal
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel {P}{\approx }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}peano
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\approx 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tagged
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
=
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}math
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel {+}{\rightarrow }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}reduce
\linebreak [0]\ \hskip0em plus2.0em{}to
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel {t}{=}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel {t^*}{=}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}list
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel{r}{=} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}root
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\in_t 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\subseteq_T 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}subset
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel{T}{=} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}term
\linebreak [0]\ \hskip0em plus2.0em{}set
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\stackrel{s}{=} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}sequent
\linebreak [0]\ \hskip0em plus2.0em{}equal
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel {free\ in} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}free
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel {free\ in}^{\ast} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}free
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel {free\ for} 
\ast 
\mathrel {in} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}free
\linebreak [0]\ \hskip0em plus2.0em{}for
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel {free\ for}^{\ast} 
\ast 
\mathrel {in} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}free
\linebreak [0]\ \hskip0em plus2.0em{}for
\linebreak [0]\ \hskip0em plus2.0em{}star
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\in_c 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}claim
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
< 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}less
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
<' 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}less
\linebreak [0]\ \hskip0em plus2.0em{}zero
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\le' 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}less
\linebreak [0]\ \hskip0em plus2.0em{}one
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{\neg }
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}not
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\wedge 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}and
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel{\ddot{\wedge}} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}macro
\linebreak [0]\ \hskip0em plus2.0em{}and
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel{\tilde{\wedge}} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}simple
\linebreak [0]\ \hskip0em plus2.0em{}and
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\wedge_c 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}claim
\linebreak [0]\ \hskip0em plus2.0em{}and
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\vee 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}or
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\parallel 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}parallel
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel{\ddot{\vee}} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}macro
\linebreak [0]\ \hskip0em plus2.0em{}or
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel{\ddot{\Rightarrow}} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}macro
\linebreak [0]\ \hskip0em plus2.0em{}imply
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
:
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}guard
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel{spy}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}spy
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
!
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tagged
\linebreak [0]\ \hskip0em plus2.0em{}guard
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\left\{\protect \begin {array}{l}
\ast 
\\
\ast 
\protect \end {array}\right.
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}select
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}else
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}select
\mbox{''}
]
\linebreak[4] 
[
\lambda 
\ast 
.
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}lambda
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}dot
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\Lambda 
\ast 
. 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tagged
\linebreak [0]\ \hskip0em plus2.0em{}lambda
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}dot
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\Lambda 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}tagging
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
{\bf if} \ 
\ast 
\ {\bf then} \ 
\ast 
\ {\bf else} \ 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}open
\linebreak [0]\ \hskip0em plus2.0em{}if
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}then
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}else
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mathbf{let\ } 
\ast 
= 
\ast 
\mathbf{\ in\ } 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}let
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}be
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mathbf{let\ } 
\ast 
\mathrel{\ddot{=}} 
\ast 
\mathrel{\ in\ } 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}let
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}abbreviate
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}in
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ { I }
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}init
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ { \rhd }
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}modus
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ { V } 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}verify
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ { + } 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}curry
\linebreak [0]\ \hskip0em plus2.0em{}plus
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ { - } 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}curry
\linebreak [0]\ \hskip0em plus2.0em{}minus
\mbox{''}
]
\linebreak[4] 
[
\ast 
{} ^ { \ast } 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}dereference
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathop {\char64} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}at
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\rhd 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}modus
\linebreak [0]\ \hskip0em plus2.0em{}ponens
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}modus
\linebreak [0]\ \hskip0em plus2.0em{}probans
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\gg 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}conclude
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\vdash 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}infer
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}endorse
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel {i.e.} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}id
\linebreak [0]\ \hskip0em plus2.0em{}est
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\forall 
\ast 
\colon 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}all
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}indeed
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel {\oplus} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}rule
\linebreak [0]\ \hskip0em plus2.0em{}plus
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
; 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}cut
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\ proves\ 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}proves
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathbf{\ proof\ of\ } 
\ast 
: 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}proof
\linebreak [0]\ \hskip0em plus2.0em{}of
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}reads
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
Line \, 
\ast 
: 
\ast 
\gg 
\ast 
; 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}because
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}indeed
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
Last\ line \, 
\ast 
\gg 
\ast 
\,\Box
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}because
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}indeed
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}qed
\mbox{''}
]
\linebreak[4] 
[
Line \, 
\ast 
: Premise \gg 
\ast 
;
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}premise
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
Line \, 
\ast 
: \mbox{Side-condition} \gg 
\ast 
; 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}side
\linebreak [0]\ \hskip0em plus2.0em{}condition
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
Arbitrary \gg 
\ast 
;
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}arbitrary
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
Local \gg 
\ast 
= 
\ast 
; 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}locally
\linebreak [0]\ \hskip0em plus2.0em{}define
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}as
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}end
\linebreak [0]\ \hskip0em plus2.0em{}line
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel{\mathrm{,}}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{},
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
{[}
\ast 
{]}
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}[
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}]
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\& 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}tab
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\backslash \backslash 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}row
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\ast 
\mathrel{linebreak[4]} 
\ast 
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}
\mbox {\tt \char34}
\linebreak [0]\ \hskip0em plus2.0em{}linebreak
\linebreak [0]\ \hskip0em plus2.0em{}
\mbox {\tt \char34}
\mbox{''}
]
\linebreak[4] 
[
\mbox{base}
\stackrel{
\mathrm{pyk}
}{\rightarrow}
\mbox{``}base
\mbox{''}
]
\linebreak[4] 
)^{\mathbf {p}}$
\end{flushleft}



\section{Test}

\begin{list}{}{
\setlength{\leftmargin}{5em}
\setlength{\itemindent}{-5em}}
\immediate\closeout\outest
\input{./page.tst}
\end{list}



\section{Priority table}\label{section:PriorityTable}


\begin {flushleft}$(
[
\mbox{base}
\stackrel{
\mathrm{prio}
}{\rightarrow}
\newline \mathbf {Preassociative} \newline 
[
\mbox{base}
] , \linebreak [0] 
[
\mbox{bracket $
\ast $ end bracket}
] , \linebreak [0] 
[
\mbox{big bracket $
\ast $ end bracket}
] , \linebreak [0] 
[
\ \$
\ast \$\linebreak[0]\ 
] , \linebreak [0] 
[
\mathbf{flush\ left\ }[ 
\ast 
]
] , \linebreak [0] 
[
\mathsf{x}
] , \linebreak [0] 
[
\mathsf{y}
] , \linebreak [0] 
[
\mathsf{z}
] , \linebreak [0] 
[
[
\ast 
\bowtie
\ast 
]
] , \linebreak [0] 
[
[
\ast 
\stackrel{
\ast 
}{\rightarrow}
\ast 
]
] , \linebreak [0] 
[
\mathrm{pyk}
] , \linebreak [0] 
[
\mathrm{tex}
] , \linebreak [0] 
[
\mathrm{name}
] , \linebreak [0] 
[
\mathrm{prio}
] , \linebreak [0] 
[
\ast 
] , \linebreak [0] 
[
\mathsf {T}
] , \linebreak [0] 
[
\mathrm {if}(
\ast 
,\linebreak [0]
\ast 
,\linebreak [0]
\ast 
)
] , \linebreak [0] 
[
[
\ast 
\stackrel {
\ast 
}{\Rightarrow }
\ast 
]
] , \linebreak [0] 
[
\mathrm {val}
] , \linebreak [0] 
[
\mathrm {claim}
] , \linebreak [0] 
[
\bot 
] , \linebreak [0] 
[
f(
\ast 
)
] , \linebreak [0] 
[
(
\ast 
){}^{I} 
] , \linebreak [0] 
[
\mathsf {F}
] , \linebreak [0] 
[
\underline {0}
] , \linebreak [0] 
[
\underline {1}
] , \linebreak [0] 
[
\underline {2}
] , \linebreak [0] 
[
\underline {3}
] , \linebreak [0] 
[
\underline {4}
] , \linebreak [0] 
[
\underline {5}
] , \linebreak [0] 
[
\underline {6}
] , \linebreak [0] 
[
\underline {7}
] , \linebreak [0] 
[
\underline {8}
] , \linebreak [0] 
[
\underline {9}
] , \linebreak [0] 
[
0
] , \linebreak [0] 
[
1
] , \linebreak [0] 
[
2
] , \linebreak [0] 
[
3
] , \linebreak [0] 
[
4
] , \linebreak [0] 
[
5
] , \linebreak [0] 
[
6
] , \linebreak [0] 
[
7
] , \linebreak [0] 
[
8
] , \linebreak [0] 
[
9
] , \linebreak [0] 
[
\mathsf {a}
] , \linebreak [0] 
[
\mathsf {b}
] , \linebreak [0] 
[
\mathsf {c}
] , \linebreak [0] 
[
\mathsf {d}
] , \linebreak [0] 
[
\mathsf {e}
] , \linebreak [0] 
[
\mathsf {f}
] , \linebreak [0] 
[
\mathsf {g}
] , \linebreak [0] 
[
\mathsf {h}
] , \linebreak [0] 
[
\mathsf {i}
] , \linebreak [0] 
[
\mathsf {j}
] , \linebreak [0] 
[
\mathsf {k}
] , \linebreak [0] 
[
\mathsf {l}
] , \linebreak [0] 
[
\mathsf {m}
] , \linebreak [0] 
[
\mathsf {n}
] , \linebreak [0] 
[
\mathsf {o}
] , \linebreak [0] 
[
\mathsf {p}
] , \linebreak [0] 
[
\mathsf {q}
] , \linebreak [0] 
[
\mathsf {r}
] , \linebreak [0] 
[
\mathsf {s}
] , \linebreak [0] 
[
\mathsf {t}
] , \linebreak [0] 
[
\mathsf {u}
] , \linebreak [0] 
[
\mathsf {v}
] , \linebreak [0] 
[
\mathsf {w}
] , \linebreak [0] 
[
(
\ast 
)^M
] , \linebreak [0] 
[
\mathrm {If}(
\ast 
,\linebreak [0]
\ast 
,\linebreak [0]
\ast 
)
] , \linebreak [0] 
[\mathrm {array}\{
\ast 
\}
\ast 
\mathrm {end\ array}
] , \linebreak [0] 
[
l
] , \linebreak [0] 
[
c
] , \linebreak [0] 
[
r
] , \linebreak [0] 
[
\mathrm {empty}
] , \linebreak [0] 
[
\langle 
\ast 
\,{|}
\ast 
{:=}\,
\ast 
\rangle 
] , \linebreak [0] 
[
{\cal M}(
\ast 
)
] , \linebreak [0] 
[
\tilde {{\cal U}}(
\ast 
)
] , \linebreak [0] 
[
{\cal U}(
\ast 
)
] , \linebreak [0] 
[
{\cal U}^M(
\ast 
)
] , \linebreak [0] 
[
\mathbf {apply}(
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\mathbf {apply}_1(
\ast 
,
\ast 
)
] , \linebreak [0] 
[
identifier( 
\ast 
)
] , \linebreak [0] 
[
identifier_{1}( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
array\mbox{-}\linebreak[0]plus( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
array\mbox{-}\linebreak[0]remove( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
array\mbox{-}\linebreak[0]put( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
array\mbox{-}\linebreak[0]add( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
bit( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
bit_1( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
rack
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {vector}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {bibliography}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {dictionary}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {body}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {codex}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {expansion}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {code}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {cache}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {diagnose}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {pyk}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {tex}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {texname}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {value}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {message}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {macro}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {definition}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {unpack}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {claim}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {priority}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {lambda}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {apply}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {true}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {if}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {quote}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {proclaim}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {define}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {introduce}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {hide}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {pre}\mbox {\tt \char34}
] , \linebreak [0] 
[
\mbox {\tt \char34}\mathrm {post}\mbox {\tt \char34}
] , \linebreak [0] 
[
{\cal E}(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
{\cal E}_2(
\ast 
,
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
{\cal E}_3(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
{\cal E}_4(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\mathbf {lookup}(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\mathbf {abstract}(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\lceil 
\ast 
\rceil 
] , \linebreak [0] 
[
{\cal M}(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
{\cal M}_2(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
{\cal M}^*(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\mathrm {macro}
] , \linebreak [0] 
[
s_0
] , \linebreak [0] 
[
\mathbf {zip}(
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\mathbf {assoc}_1(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[(
\ast 
)^{\mathbf {p}}
] , \linebreak [0] 
[
\mbox{self}
] , \linebreak [0] 
[
[
\ast 
\mathrel {\ddot {=}}
\ast 
]
] , \linebreak [0] 
[
[
\ast 
\mathrel {\dot {=}}
\ast 
]
] , \linebreak [0] 
[
[
\ast 
\mathrel {\acute {=}}
\ast 
]
] , \linebreak [0] 
[
[
\ast 
\stackrel {\mathrm {pyk}}{=} 
\ast 
]
] , \linebreak [0] 
[
[
\ast 
\stackrel {\mathrm {tex}}{=} 
\ast 
]
] , \linebreak [0] 
[
[
\ast 
\stackrel {\mathrm {name}}{=} 
\ast 
]
] , \linebreak [0] 
[
\mathbf{Priority\ table} [ 
\ast 
]
] , \linebreak [0] 
[
\tilde {{\cal M}}_1
] , \linebreak [0] 
[
\tilde {{\cal M}}_2(
\ast 
)
] , \linebreak [0] 
[
\tilde {{\cal M}}_3(
\ast 
)
] , \linebreak [0] 
[
\tilde {{\cal M}}_4(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\tilde {{\cal M}}(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\tilde {{\cal Q}}(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\tilde {{\cal Q}}_2(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\tilde {{\cal Q}}_3(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\tilde {{\cal Q}}^*(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
(
\ast 
)
] , \linebreak [0] 
[
\left( 
\ast 
\right) 
] , \linebreak [0] 
[
display(
\ast 
)
] , \linebreak [0] 
[
statement(
\ast 
)
] , \linebreak [0] 
[
[
\ast 
]^{\cdot}
] , \linebreak [0] 
[
[
\ast 
]^-
] , \linebreak [0] 
[
\mathbf{aspect}( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
\mathbf{aspect}( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
\langle 
\ast 
\rangle 
] , \linebreak [0] 
[
\mathbf {tuple}_1( 
\ast 
) 
] , \linebreak [0] 
[
\mathbf {tuple}_2( 
\ast 
) 
] , \linebreak [0] 
[
let_2( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
let_1( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
[
\ast 
\stackrel {claim}{=}
\ast 
]
] , \linebreak [0] 
[
\mbox{checker}
] , \linebreak [0] 
[
\mathbf{check}( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
\mathbf{check}_2( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
\mathbf{check}_3( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
\mathbf{check}^*( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
\mathbf{check}^*_2( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
\relax [ 
\ast 
\relax ]^{\cdot} 
] , \linebreak [0] 
[
\relax [ 
\ast 
\relax ]^{-} 
] , \linebreak [0] 
[
\relax [ 
\ast 
\relax ]^{\circ} 
] , \linebreak [0] 
[
msg
] , \linebreak [0] 
[
[
\ast 
\stackrel {msg}{=} 
\ast 
]
] , \linebreak [0] 
[
{<}stmt{>}
] , \linebreak [0] 
[
stmt
] , \linebreak [0] 
[
[
\ast 
\stackrel {stmt}{=}
\ast 
]
] , \linebreak [0] 
[
HeadNil'
] , \linebreak [0] 
[
HeadPair'
] , \linebreak [0] 
[
Transitivity'
] , \linebreak [0] 
[
{\makebox [0mm][l]{$\bot $}\,{\bot }}
] , \linebreak [0] 
[
Contra'
] , \linebreak [0] 
[
T'_{E}
] , \linebreak [0] 
[
L_{1}
] , \linebreak [0] 
[\underline{
\ast }
] , \linebreak [0] 
[{\cal A}
] , \linebreak [0] 
[{\cal B}
] , \linebreak [0] 
[{\cal C}
] , \linebreak [0] 
[{\cal D}
] , \linebreak [0] 
[{\cal E}
] , \linebreak [0] 
[{\cal F}
] , \linebreak [0] 
[{\cal G}
] , \linebreak [0] 
[{\cal H}
] , \linebreak [0] 
[{\cal I}
] , \linebreak [0] 
[{\cal J}
] , \linebreak [0] 
[{\cal K}
] , \linebreak [0] 
[{\cal L}
] , \linebreak [0] 
[{\cal M}
] , \linebreak [0] 
[{\cal N}
] , \linebreak [0] 
[{\cal O}
] , \linebreak [0] 
[{\cal P}
] , \linebreak [0] 
[{\cal Q}
] , \linebreak [0] 
[{\cal R}
] , \linebreak [0] 
[{\cal S}
] , \linebreak [0] 
[{\cal T}
] , \linebreak [0] 
[{\cal U}
] , \linebreak [0] 
[{\cal V}
] , \linebreak [0] 
[{\cal W}
] , \linebreak [0] 
[{\cal X}
] , \linebreak [0] 
[{\cal Y}
] , \linebreak [0] 
[{\cal Z}
] , \linebreak [0] 
[
\langle 
\ast 
\,{\protect\vert}
\ast 
{:=}\,
\ast 
\rangle 
] , \linebreak [0] 
[
\langle ^ { \ast } 
\ast 
\,{\protect\vert}
\ast 
{:=}\,
\ast 
\rangle 
] , \linebreak [0] 
[
\emptyset 
] , \linebreak [0] 
[
Remainder
] , \linebreak [0] 
[
( 
\ast 
)^{\bf v}
] , \linebreak [0] 
[
intro(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
intro(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
error(
\ast 
,
\ast 
)
] , \linebreak [0] 
[
error_{2}(
\ast 
,
\ast 
)
] , \linebreak [0] 
[
proof( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
proof_{2}( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{I}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{\rhd}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{\rhd}(
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{E}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{E}(
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{+}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{+}(
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{-}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{-}(
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{\ast}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{\ast}(
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{2}^{\ast}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{\char64}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{\char64}(
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{\vdash}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{\vdash}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{\makebox [0mm][l]{\scriptsize $\vdash $}\,{\vdash }}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{i.e.}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{i.e.}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{2}^{i.e.}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{\forall}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{\forall}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}^{;}(
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{1}^{;}(
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal S}_{2}^{;}(
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal T}( 
\ast 
)
] , \linebreak [0] 
[
claims( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
claims_2( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{<}proof{>}
] , \linebreak [0] 
[
proof
] , \linebreak [0] 
[
[ \mathbf{Lemma\ } 
\ast 
\colon 
\ast 
]
] , \linebreak [0] 
[
[ \mathbf{Proof\ of\ }
\ast 
\colon 
\ast 
]
] , \linebreak [0] 
[
[ 
\ast 
\mathbf{\ lemma\ } 
\ast 
\colon 
\ast 
]
] , \linebreak [0] 
[
[ 
\ast 
\mathbf{\ antilemma\ } 
\ast 
\colon 
\ast 
]
] , \linebreak [0] 
[
[ 
\ast 
\mathbf{\ rule\ } 
\ast 
\colon 
\ast 
]
] , \linebreak [0] 
[
[ 
\ast 
\mathbf{\ antirule\ } 
\ast 
\colon 
\ast 
]
] , \linebreak [0] 
[
\mbox{verifier}
] , \linebreak [0] 
[
{\cal V}_1( 
\ast 
)
] , \linebreak [0] 
[
{\cal V}_2( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal V}_3( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal V}_4( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal V}_5( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal V}_6( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal V}_7( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
Cut( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
Head_{\oplus} ( 
\ast 
)
] , \linebreak [0] 
[
Tail_{\oplus} ( 
\ast 
)
] , \linebreak [0] 
[
rule_1( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
rule( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
Rule\ tactic
] , \linebreak [0] 
[
Plus( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
[ \mathbf{Theory\ } 
\ast 
]
] , \linebreak [0] 
[
theory_2( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
theory_3( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
theory_4( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
HeadNil''
] , \linebreak [0] 
[
HeadPair''
] , \linebreak [0] 
[
Transitivity''
] , \linebreak [0] 
[
Contra''
] , \linebreak [0] 
[
HeadNil
] , \linebreak [0] 
[
HeadPair
] , \linebreak [0] 
[
Transitivity
] , \linebreak [0] 
[
Contra
] , \linebreak [0] 
[
T_E
] , \linebreak [0] 
[
ragged\ right
] , \linebreak [0] 
[
ragged\ right\ expansion\ 
] , \linebreak [0] 
[
parm(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
parm^*(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
inst(
\ast 
,
\ast 
)
] , \linebreak [0] 
[
inst^*(
\ast 
,
\ast 
)
] , \linebreak [0] 
[
occur(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
occur^*(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
unify(
\ast 
=
\ast 
,
\ast 
)
] , \linebreak [0] 
[
unify^*(
\ast 
=
\ast 
,
\ast 
)
] , \linebreak [0] 
[
unify_2(
\ast 
=
\ast 
,
\ast 
)
] , \linebreak [0] 
[L_a
] , \linebreak [0] 
[L_b
] , \linebreak [0] 
[L_c
] , \linebreak [0] 
[L_d
] , \linebreak [0] 
[L_e
] , \linebreak [0] 
[L_f
] , \linebreak [0] 
[L_g
] , \linebreak [0] 
[L_h
] , \linebreak [0] 
[L_i
] , \linebreak [0] 
[L_j
] , \linebreak [0] 
[L_k
] , \linebreak [0] 
[L_l
] , \linebreak [0] 
[L_m
] , \linebreak [0] 
[L_n
] , \linebreak [0] 
[L_o
] , \linebreak [0] 
[L_p
] , \linebreak [0] 
[L_q
] , \linebreak [0] 
[L_r
] , \linebreak [0] 
[L_s
] , \linebreak [0] 
[L_t
] , \linebreak [0] 
[L_u
] , \linebreak [0] 
[L_v
] , \linebreak [0] 
[L_w
] , \linebreak [0] 
[L_x
] , \linebreak [0] 
[L_y
] , \linebreak [0] 
[L_z
] , \linebreak [0] 
[L_A
] , \linebreak [0] 
[L_B
] , \linebreak [0] 
[L_C
] , \linebreak [0] 
[L_D
] , \linebreak [0] 
[L_E
] , \linebreak [0] 
[L_F
] , \linebreak [0] 
[L_G
] , \linebreak [0] 
[L_H
] , \linebreak [0] 
[L_I
] , \linebreak [0] 
[L_J
] , \linebreak [0] 
[L_K
] , \linebreak [0] 
[L_L
] , \linebreak [0] 
[L_M
] , \linebreak [0] 
[L_N
] , \linebreak [0] 
[L_O
] , \linebreak [0] 
[L_P
] , \linebreak [0] 
[L_Q
] , \linebreak [0] 
[L_R
] , \linebreak [0] 
[L_S
] , \linebreak [0] 
[L_T
] , \linebreak [0] 
[L_U
] , \linebreak [0] 
[L_V
] , \linebreak [0] 
[L_W
] , \linebreak [0] 
[L_X
] , \linebreak [0] 
[L_Y
] , \linebreak [0] 
[L_Z
] , \linebreak [0] 
[L_?
] , \linebreak [0] 
[
Reflexivity
] , \linebreak [0] 
[
Reflexivity_1
] , \linebreak [0] 
[
Commutativity
] , \linebreak [0] 
[
Commutativity_1
] , \linebreak [0] 
[
{<}tactic{>}
] , \linebreak [0] 
[
tactic
] , \linebreak [0] 
[
[
\ast 
\stackrel {tactic}{=}
\ast 
]
] , \linebreak [0] 
[
{\cal P}( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
{\cal P}^*( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
p_0
] , \linebreak [0] 
[
conclude_1 ( 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
conclude_2 ( 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
conclude_3 ( 
\ast 
, 
\ast 
, 
\ast 
, 
\ast 
)
] , \linebreak [0] 
[
conclude_4 ( 
\ast 
, 
\ast 
)
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\_\{
\ast 
\}
] , \linebreak [0] 
[
\ast 
/indexintro(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\ast 
/intro(
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\ast 
/bothintro(
\ast 
,
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\ast 
/nameintro(
\ast 
,
\ast 
,
\ast 
,
\ast 
)
] , \linebreak [0] 
[
\ast '
] , \linebreak [0] 
[
\ast 
{[}
\ast 
{]}
] , \linebreak [0] 
[
\ast 
[ 
\ast 
{\rightarrow} 
\ast 
]
] , \linebreak [0] 
[
\ast 
[ 
\ast 
{\Rightarrow} 
\ast 
]
] , \linebreak [0] 
[
\ast 
0
] , \linebreak [0] 
[
\ast 
1
] , \linebreak [0] 
[
0 \mathrm {b}
] , \linebreak [0] 
[
\ast 
\mbox {-color}( 
\ast 
)
] , \linebreak [0] 
[
\ast 
\mbox {-color}^{\ast}( 
\ast 
)
] , \linebreak [0] 
[
\ast 
{}^H
] , \linebreak [0] 
[
\ast 
{}^T
] , \linebreak [0] 
[
\ast 
{}^U
] , \linebreak [0] 
[
\ast 
{}^h
] , \linebreak [0] 
[
\ast 
{}^t
] , \linebreak [0] 
[
\ast 
{}^s
] , \linebreak [0] 
[
\ast 
{}^c
] , \linebreak [0] 
[
\ast 
{}^d
] , \linebreak [0] 
[
\ast 
{}^a
] , \linebreak [0] 
[
\ast 
{}^C
] , \linebreak [0] 
[
\ast 
{}^M
] , \linebreak [0] 
[
\ast 
{}^B
] , \linebreak [0] 
[
\ast 
{}^{r}
] , \linebreak [0] 
[
\ast 
{}^{i}
] , \linebreak [0] 
[
\ast 
{}^{d}
] , \linebreak [0] 
[
\ast 
{}^{R}
] , \linebreak [0] 
[
\ast 
{}^{0}
] , \linebreak [0] 
[
\ast 
{}^{1}
] , \linebreak [0] 
[
\ast 
{}^{2}
] , \linebreak [0] 
[
\ast 
{}^{3}
] , \linebreak [0] 
[
\ast 
{}^{4}
] , \linebreak [0] 
[
\ast 
{}^{5}
] , \linebreak [0] 
[
\ast 
{}^{6}
] , \linebreak [0] 
[
\ast 
{}^{7}
] , \linebreak [0] 
[
\ast 
{}^{8}
] , \linebreak [0] 
[
\ast 
{}^{9}
] , \linebreak [0] 
[
\ast 
{} ^ { E }
] , \linebreak [0] 
[
\ast 
{} ^ {\cal V}
] , \linebreak [0] 
[
\ast 
{} ^ {\cal C}
] , \linebreak [0] 
[
\ast 
{} ^ {{\cal C} ^ { \ast }}
]
; 
\newline \mathbf {Preassociative} \newline 
[
\mbox{``}
\ast 
\mbox{''}
] , \linebreak [0] 
[
] , \linebreak [0] 
[
(
\ast 
)^{\bf t}
] , \linebreak [0] 
[
\mbox{string}(
\ast 
)+
\ast 
] , \linebreak [0] 
[\mbox{string}(
\ast 
)\mathrel{++}
\ast 
] , \linebreak [0] 
[
\newline 
\ast 
] , \linebreak [0] 
[
\linebreak [0]\ \hskip0em plus2.0em{}
\ast 
] , \linebreak [0] 
[!
\ast 
] , \linebreak [0] 
[
\mbox {\tt \char34}
\ast 
] , \linebreak [0] 
[
\#
\ast 
] , \linebreak [0] 
[
\$
\ast 
] , \linebreak [0] 
[
\%
\ast 
] , \linebreak [0] 
[
\&
\ast 
] , \linebreak [0] 
[
\mbox {'}
\ast 
] , \linebreak [0] 
[(
\ast 
] , \linebreak [0] 
[)
\ast 
] , \linebreak [0] 
[
{*}
\ast 
] , \linebreak [0] 
[
{+}
\ast 
] , \linebreak [0] 
[,
\ast 
] , \linebreak [0] 
[
\mbox{-}
\ast 
] , \linebreak [0] 
[.
\ast 
] , \linebreak [0] 
[/
\ast 
] , \linebreak [0] 
[0
\ast 
] , \linebreak [0] 
[1
\ast 
] , \linebreak [0] 
[2
\ast 
] , \linebreak [0] 
[3
\ast 
] , \linebreak [0] 
[4
\ast 
] , \linebreak [0] 
[5
\ast 
] , \linebreak [0] 
[6
\ast 
] , \linebreak [0] 
[7
\ast 
] , \linebreak [0] 
[8
\ast 
] , \linebreak [0] 
[9
\ast 
] , \linebreak [0] 
[
{:}
\ast 
] , \linebreak [0] 
[;
\ast 
] , \linebreak [0] 
[
{<}
\ast 
] , \linebreak [0] 
[
{=}
\ast 
] , \linebreak [0] 
[
{>}
\ast 
] , \linebreak [0] 
[?
\ast 
] , \linebreak [0] 
[@
\ast 
] , \linebreak [0] 
[A
\ast 
] , \linebreak [0] 
[B
\ast 
] , \linebreak [0] 
[C
\ast 
] , \linebreak [0] 
[D
\ast 
] , \linebreak [0] 
[E
\ast 
] , \linebreak [0] 
[F
\ast 
] , \linebreak [0] 
[G
\ast 
] , \linebreak [0] 
[H
\ast 
] , \linebreak [0] 
[I
\ast 
] , \linebreak [0] 
[J
\ast 
] , \linebreak [0] 
[K
\ast 
] , \linebreak [0] 
[L
\ast 
] , \linebreak [0] 
[M
\ast 
] , \linebreak [0] 
[N
\ast 
] , \linebreak [0] 
[O
\ast 
] , \linebreak [0] 
[P
\ast 
] , \linebreak [0] 
[Q
\ast 
] , \linebreak [0] 
[R
\ast 
] , \linebreak [0] 
[S
\ast 
] , \linebreak [0] 
[T
\ast 
] , \linebreak [0] 
[U
\ast 
] , \linebreak [0] 
[V
\ast 
] , \linebreak [0] 
[W
\ast 
] , \linebreak [0] 
[X
\ast 
] , \linebreak [0] 
[Y
\ast 
] , \linebreak [0] 
[Z
\ast 
] , \linebreak [0] 
[[
\ast 
] , \linebreak [0] 
[
\mbox {$\backslash $}
\ast 
] , \linebreak [0] 
[]
\ast 
] , \linebreak [0] 
[
{\char94}
\ast 
] , \linebreak [0] 
[
\_
\ast 
] , \linebreak [0] 
[
\mbox {`}
\ast 
] , \linebreak [0] 
[a
\ast 
] , \linebreak [0] 
[b
\ast 
] , \linebreak [0] 
[c
\ast 
] , \linebreak [0] 
[d
\ast 
] , \linebreak [0] 
[e
\ast 
] , \linebreak [0] 
[f
\ast 
] , \linebreak [0] 
[g
\ast 
] , \linebreak [0] 
[h
\ast 
] , \linebreak [0] 
[i
\ast 
] , \linebreak [0] 
[j
\ast 
] , \linebreak [0] 
[k
\ast 
] , \linebreak [0] 
[l
\ast 
] , \linebreak [0] 
[m
\ast 
] , \linebreak [0] 
[n
\ast 
] , \linebreak [0] 
[o
\ast 
] , \linebreak [0] 
[p
\ast 
] , \linebreak [0] 
[q
\ast 
] , \linebreak [0] 
[r
\ast 
] , \linebreak [0] 
[s
\ast 
] , \linebreak [0] 
[t
\ast 
] , \linebreak [0] 
[u
\ast 
] , \linebreak [0] 
[v
\ast 
] , \linebreak [0] 
[w
\ast 
] , \linebreak [0] 
[x
\ast 
] , \linebreak [0] 
[y
\ast 
] , \linebreak [0] 
[z
\ast 
] , \linebreak [0] 
[
\{
\ast 
] , \linebreak [0] 
[|
\ast 
] , \linebreak [0] 
[
\}
\ast 
] , \linebreak [0] 
[
\char126 
\ast 
] , \linebreak [0] 
[
\mathbf{Preassociative}\,
\ast 
; 
\ast 
] , \linebreak [0] 
[
\mathbf{Postassociative}\,
\ast 
; 
\ast 
] , \linebreak [0] 
[
[
\ast 
] , \linebreak [0] 
\ast 
] , \linebreak [0] 
[
\mathrm{priority} \,
\ast 
\, \mathrm{end}
] , \linebreak [0] 
[
newline\ 
\ast 
] , \linebreak [0] 
[
macro\ newline\ 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\mathbin {\mbox {'}}
\ast 
] , \linebreak [0] 
[
\ast 
\mathbin {\mbox {`}}
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\cdot 
\ast 
] , \linebreak [0] 
[
\ast 
\cdot_0 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
+ 
\ast 
] , \linebreak [0] 
[
\ast 
\mathop{+_0} 
\ast 
] , \linebreak [0] 
[
\ast 
\mathop{+_1} 
\ast 
] , \linebreak [0] 
[
\ast 
- 
\ast 
] , \linebreak [0] 
[
\ast 
\mathop{-_0} 
\ast 
] , \linebreak [0] 
[
\ast 
\mathop{-_1} 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\cup \{ 
\ast 
\}
] , \linebreak [0] 
[
\ast 
\cup 
\ast 
] , \linebreak [0] 
[
\ast 
\backslash \{ 
\ast 
\}
]
; 
\newline\mathbf{Postassociative} \newline 
[
\ast 
\mathrel { \dot { . \, . } }
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel { \underline { \dot { . \, . } } }
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel { \underline { : \, : } }
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel { \underline { {+} 2 \ast } }
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel { : \, : }
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel { {+} 2 \ast }
\ast 
]
; 
\newline\mathbf{Postassociative} \newline 
[
\ast 
,\linebreak [0] 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\stackrel {B}{\approx }
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel {D}{\approx }
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel {C}{\approx }
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel {P}{\approx }
\ast 
] , \linebreak [0] 
[
\ast 
\approx 
\ast 
] , \linebreak [0] 
[
\ast 
=
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel {+}{\rightarrow }
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel {t}{=}
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel {t^*}{=}
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel{r}{=} 
\ast 
] , \linebreak [0] 
[
\ast 
\in_t 
\ast 
] , \linebreak [0] 
[
\ast 
\subseteq_T 
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel{T}{=} 
\ast 
] , \linebreak [0] 
[
\ast 
\stackrel{s}{=} 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel {free\ in} 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel {free\ in}^{\ast} 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel {free\ for} 
\ast 
\mathrel {in} 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel {free\ for}^{\ast} 
\ast 
\mathrel {in} 
\ast 
] , \linebreak [0] 
[
\ast 
\in_c 
\ast 
] , \linebreak [0] 
[
\ast 
< 
\ast 
] , \linebreak [0] 
[
\ast 
<' 
\ast 
] , \linebreak [0] 
[
\ast 
\le' 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
{\neg }
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\wedge 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel{\ddot{\wedge}} 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel{\tilde{\wedge}} 
\ast 
] , \linebreak [0] 
[
\ast 
\wedge_c 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\vee 
\ast 
] , \linebreak [0] 
[
\ast 
\parallel 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel{\ddot{\vee}} 
\ast 
]
; 
\newline\mathbf{Postassociative} \newline 
[
\ast 
\mathrel{\ddot{\Rightarrow}} 
\ast 
]
; 
\newline\mathbf{Postassociative} \newline 
[
\ast 
:
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel{spy}
\ast 
] , \linebreak [0] 
[
\ast 
!
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\left\{\protect \begin {array}{l}
\ast 
\\
\ast 
\protect \end {array}\right.
]
; 
\newline \mathbf {Preassociative} \newline 
[
\lambda 
\ast 
.
\ast 
] , \linebreak [0] 
[
\Lambda 
\ast 
. 
\ast 
] , \linebreak [0] 
[
\Lambda 
\ast 
] , \linebreak [0] 
[
{\bf if} \ 
\ast 
\ {\bf then} \ 
\ast 
\ {\bf else} \ 
\ast 
] , \linebreak [0] 
[
\mathbf{let\ } 
\ast 
= 
\ast 
\mathbf{\ in\ } 
\ast 
] , \linebreak [0] 
[
\mathbf{let\ } 
\ast 
\mathrel{\ddot{=}} 
\ast 
\mathrel{\ in\ } 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
{} ^ { I }
] , \linebreak [0] 
[
\ast 
{} ^ { \rhd }
] , \linebreak [0] 
[
\ast 
{} ^ { V } 
] , \linebreak [0] 
[
\ast 
{} ^ { + } 
] , \linebreak [0] 
[
\ast 
{} ^ { - } 
] , \linebreak [0] 
[
\ast 
{} ^ { \ast } 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\mathop {\char64} 
\ast 
] , \linebreak [0] 
[
\ast 
\rhd 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel {\makebox [0mm][l]{$\rhd $}\,{\rhd }} 
\ast 
] , \linebreak [0] 
[
\ast 
\gg 
\ast 
]
; 
\newline\mathbf{Postassociative} \newline 
[
\ast 
\vdash 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel {\makebox [0mm][l]{$\vdash $}\,{\vdash }} 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel {i.e.} 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\forall 
\ast 
\colon 
\ast 
]
; 
\newline\mathbf{Postassociative} \newline 
[
\ast 
\mathrel {\oplus} 
\ast 
]
; 
\newline\mathbf{Postassociative} \newline 
[
\ast 
; 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\ proves\ 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\mathbf{\ proof\ of\ } 
\ast 
: 
\ast 
] , \linebreak [0] 
[
Line \, 
\ast 
: 
\ast 
\gg 
\ast 
; 
\ast 
] , \linebreak [0] 
[
Last\ line \, 
\ast 
\gg 
\ast 
\,\Box
] , \linebreak [0] 
[
Line \, 
\ast 
: Premise \gg 
\ast 
;
\ast 
] , \linebreak [0] 
[
Line \, 
\ast 
: \mbox{Side-condition} \gg 
\ast 
; 
\ast 
] , \linebreak [0] 
[
Arbitrary \gg 
\ast 
;
\ast 
] , \linebreak [0] 
[
Local \gg 
\ast 
= 
\ast 
; 
\ast 
]
; 
\newline\mathbf{Postassociative} \newline 
[
\ast 
\mathrel{\mathrm{,}}
\ast 
] , \linebreak [0] 
[
\ast 
{[}
\ast 
{]}
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\& 
\ast 
]
; 
\newline \mathbf {Preassociative} \newline 
[
\ast 
\backslash \backslash 
\ast 
] , \linebreak [0] 
[
\ast 
\mathrel{linebreak[4]} 
\ast 
]
; 
]
)^{\mathbf {p}}$
\end {flushleft}



\section{Index}

\newcommand\myidxitem{\par\noindent}

\renewenvironment{theindex}{\let\item\myidxitem}{}

\printindex



\bibliography{./page}

\end{document}
