diff -r a705822f4e2a -r 78d6e47469e4 doc-src/AxClass/generated/Product.tex --- a/doc-src/AxClass/generated/Product.tex Sun May 21 14:49:28 2000 +0200 +++ b/doc-src/AxClass/generated/Product.tex Sun May 21 21:48:39 2000 +0200 @@ -1,16 +1,77 @@ \begin{isabelle}% -\isanewline -\isanewline -\isacommand{theory}~Product~=~Main:\isanewline -\isanewline +% +\isamarkupheader{Syntactic classes} +\isacommand{theory}~Product~=~Main:% +\begin{isamarkuptext}% +\medskip\noindent There is still a feature of Isabelle's type system + left that we have not yet used: when declaring polymorphic constants + $c :: \sigma$, the type variables occurring in $\sigma$ may be + constrained by type classes (or even general sorts) in an arbitrary + way. Note that by default, in Isabelle/HOL the declaration $\TIMES + :: \alpha \To \alpha \To \alpha$ is actually an abbreviation for + $\TIMES :: (\alpha::term) \To \alpha \To \alpha$. Since class $term$ + is the universal class of HOL, this is not really a restriction at + all. + + The $product$ class below provides a less degenerate example of + syntactic type classes.% +\end{isamarkuptext}% \isacommand{axclass}\isanewline ~~product~<~{"}term{"}\isanewline \isacommand{consts}\isanewline -~~product~::~{"}'a::product~{\isasymRightarrow}~'a~{\isasymRightarrow}~'a{"}~~~~(\isakeyword{infixl}~{"}{\isasymotimes}{"}~70)\isanewline -\isanewline +~~product~::~{"}'a::product~{\isasymRightarrow}~'a~{\isasymRightarrow}~'a{"}~~~~(\isakeyword{infixl}~{"}{\isasymotimes}{"}~70)% +\begin{isamarkuptext}% +Here class $product$ is defined as subclass of $term$ without any + additional axioms. This effects in logical equivalence of $product$ + and $term$, as is reflected by the trivial introduction rule + generated for this definition. + + \medskip So what is the difference of declaring $\TIMES :: (\alpha :: + product) \To \alpha \To \alpha$ vs.\ declaring $\TIMES :: (\alpha :: + term) \To \alpha \To \alpha$ anyway? In this particular case where + $product \equiv term$, it should be obvious that both declarations + are the same from the logic's point of view. It even makes the most + sense to remove sort constraints from constant declarations, as far + as the purely logical meaning is concerned \cite{Wenzel:1997:TPHOL}. + + On the other hand there are syntactic differences, of course. + Constants $\TIMES^\tau$ are rejected by the type-checker, unless the + arity $\tau :: product$ is part of the type signature. In our + example, this arity may be always added when required by means of an + $\isarkeyword{instance}$ with the trivial proof $\BY{intro_classes}$. + + \medskip Thus, we may observe the following discipline of using + syntactic classes. Overloaded polymorphic constants have their type + arguments restricted to an associated (logically trivial) class $c$. + Only immediately before \emph{specifying} these constants on a + certain type $\tau$ do we instantiate $\tau :: c$. + + This is done for class $product$ and type $bool$ as follows.% +\end{isamarkuptext}% \isacommand{instance}~bool~::~product\isanewline ~~\isacommand{by}~intro\_classes\isanewline \isacommand{defs}\isanewline -~~product\_bool\_def:~{"}x~{\isasymotimes}~y~{\isasymequiv}~x~{\isasymand}~y{"}\isanewline -\isanewline +~~product\_bool\_def:~{"}x~{\isasymotimes}~y~{\isasymequiv}~x~{\isasymand}~y{"}% +\begin{isamarkuptext}% +The definition $prod_bool_def$ becomes syntactically well-formed only + after the arity $bool :: product$ is made known to the type checker. + + \medskip It is very important to see that above $\DEFS$ are not + directly connected with $\isarkeyword{instance}$ at all! We were + just following our convention to specify $\TIMES$ on $bool$ after + having instantiated $bool :: product$. Isabelle does not require + these definitions, which is in contrast to programming languages like + Haskell \cite{haskell-report}. + + \medskip While Isabelle type classes and those of Haskell are almost + the same as far as type-checking and type inference are concerned, + there are major semantic differences. Haskell classes require their + instances to \emph{provide operations} of certain \emph{names}. + Therefore, its \texttt{instance} has a \texttt{where} part that tells + the system what these ``member functions'' should be. + + This style of \texttt{instance} won't make much sense in Isabelle, + because its meta-logic has no corresponding notion of ``providing + operations'' or ``names''.% +\end{isamarkuptext}% \isacommand{end}\end{isabelle}%