\subsection{Algebraic structures}
We can represent algebraic structures like semi-groups, rings and
$R$- module in our
language using Sigma-types.
In the following example we will represent semi-groups:
\begin{itemize}
\item
We have a type prop for propositions, a type set for sets and prop, and a type type for set.
Specials = $\{$ prop, set, type$\}$.
\item
We have axioms stating that prop has type set and
set has type type.
Axioms = $\{($ prop,set$),($ set,type$)\}$.
\item
We have a rule for implication, a rule for quantification over
propositions, and a rule for constructing function-types on sets.
PiRules = $\{($ prop,prop,prop$),($ set,prop,prop$),($ set,set,set$)\}$.
\item
We have rules for constructing several kinds of pair-types.
SigmaRules = $\{($ prop,prop,prop$),($ set,prop,set$),($ set,set,set$),($ type,set,type$)\}$.
\end{itemize}
A semi-group consists of a set $A$, an equivalence relation eq on
$A$, and an associative operator $*$. We can represent such an algebraic
structure by a tuple consisting of $A$, $eq$, $*$, and proofs that
$eq$ is reflexive, symmetric and transitive, and $*$ is associative.
We will present the properties of eq as $\dots$, because we have
treated them already in the previous example an integers.
%\table
%m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=m\=\kill
\noindent {\sf Definition}(
\hspace*{2mm}{\tt subject=} semi-group,
\hspace*{2mm}{\tt body=}{\sf SigmaType}(
\hspace*{4mm}{\tt local=}$A$,
\hspace*{4mm}{\tt fsttype=} set,
\hspace*{4mm}{\tt sndtype=}{\sf SigmaType}(
\hspace*{6mm}{\tt local=} eq,
\hspace*{6mm}{\tt fsttype=}{\sf PiType}(
\hspace*{8mm}{\tt domain=}$A$,
\hspace*{8mm}{\tt range=}{\sf PiType}(
\hspace*{10mm}{\tt domain=}$A$,
\hspace*{10mm}{\tt range=} prop))
\hspace*{6mm}{\tt sndtype=}{\sf SigmaType}(
\hspace*{8mm}{\tt local=}$*$,
\hspace*{8mm}{\tt fsttype=}{\sf PiType}(
\hspace*{10mm}{\tt domain=}$A$,
\hspace*{10mm}{\tt range=}{\sf PiType}(
\hspace*{12mm}{\tt domain=}$A$,
\hspace*{12mm}{\tt range=}$A$))
\hspace*{8mm}{\tt sndtype=}{\sf SigmaType}(
\hspace*{10mm}{\tt local=} eq\_refl,
\hspace*{10mm}{\tt fsttype=}$\dots$
\hspace*{10mm}{\tt sndtype=}{\sf SigmaType}(
\hspace*{12mm}{\tt local=} eq\_sym,
\hspace*{12mm}{\tt fsttype=}$\dots$
\hspace*{12mm}{\tt sndtype=}{\sf SigmaType}(
\hspace*{14mm}{\tt local=} eq\_trans,
\hspace*{14mm}{\tt fsttype=}$\dots$
\hspace*{14mm}{\tt sndtype=}{\sf PiType}(
\hspace*{16mm}{\tt local=}$x$,
\hspace*{16mm}{\tt domain=}$A$,
\hspace*{16mm}{\tt range=}{\sf PiType}(
\hspace*{18mm}{\tt local=}$y$,
\hspace*{18mm}{\tt domain=}$A$,
\hspace*{18mm}{\tt range=}{\sf PiType}(
\hspace*{20mm}{\tt local=}$z$,
\hspace*{20mm}{\tt domain=}$A$,
\hspace*{20mm}{\tt range=}{\sf Application}(
\hspace*{22mm}{\tt function=}{\sf Application}(
\hspace*{24mm}{\tt function=} eq,
\hspace*{24mm}{\tt argument=}{\sf Application}(
\hspace*{26mm}{\tt function=}{\sf Application}(
\hspace*{28mm}{\tt function=}$*$,
\hspace*{28mm}{\tt argument=}$x$)
\hspace*{26mm}{\tt argument=}{\sf Application}(
\hspace*{28mm}{\tt function=}{\sf Application}(
\hspace*{30mm}{\tt function=}$*$,
\hspace*{30mm}{\tt argument=}$y$)
\hspace*{28mm}{\tt argument=}$z$))
\hspace*{22mm}{\tt argument=}{\sf Application}(
\hspace*{24mm}{\tt function=}{\sf Application}(
\hspace*{26mm}{\tt function=}$*$,
\hspace*{26mm}{\tt argument=}{\sf Application}(
\hspace*{28mm}{\tt function=}{\sf Application}(
\hspace*{30mm}{\tt function=}$*$,
\hspace*{30mm}{\tt argument=}$x$),
\hspace*{28mm}{\tt argument=}$y$)),
\hspace*{24mm}{\tt argument=}$z$)))))))))))),
\hspace*{2mm}{\tt type=} type)
%<\table>