doc-src/AxClass/generated/Product.tex
author wenzelm
Thu, 13 Jul 2000 23:23:24 +0200
changeset 9331 3da45f19730e
parent 9145 9f7b8de5bfaf
child 9519 fdc3b5bcd79d
permissions -rw-r--r--
updated;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     1
\begin{isabelle}%
8903
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
     2
%
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
     3
\isamarkupheader{Syntactic classes}
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
     4
\isacommand{theory}~Product~=~Main:%
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
     5
\begin{isamarkuptext}%
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
     6
\medskip\noindent There is still a feature of Isabelle's type system
8907
wenzelm
parents: 8903
diff changeset
     7
 left that we have not yet discussed.  When declaring polymorphic
wenzelm
parents: 8903
diff changeset
     8
 constants $c :: \sigma$, the type variables occurring in $\sigma$ may
wenzelm
parents: 8903
diff changeset
     9
 be constrained by type classes (or even general sorts) in an
wenzelm
parents: 8903
diff changeset
    10
 arbitrary way.  Note that by default, in Isabelle/HOL the declaration
wenzelm
parents: 8903
diff changeset
    11
 $\TIMES :: \alpha \To \alpha \To \alpha$ is actually an abbreviation
wenzelm
parents: 8903
diff changeset
    12
 for $\TIMES :: (\alpha::term) \To \alpha \To \alpha$.  Since class
wenzelm
parents: 8903
diff changeset
    13
 $term$ is the universal class of HOL, this is not really a constraint
wenzelm
parents: 8903
diff changeset
    14
 at all.
8903
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    15
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    16
 The $product$ class below provides a less degenerate example of
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    17
 syntactic type classes.%
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    18
\end{isamarkuptext}%
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    19
\isacommand{axclass}\isanewline
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    20
~~product~<~{"}term{"}\isanewline
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    21
\isacommand{consts}\isanewline
8907
wenzelm
parents: 8903
diff changeset
    22
~~product~::~{"}'a::product~{\isasymRightarrow}~'a~{\isasymRightarrow}~'a{"}~~~~(\isakeyword{infixl}~{"}{\isasymOtimes}{"}~70)%
8903
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    23
\begin{isamarkuptext}%
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    24
Here class $product$ is defined as subclass of $term$ without any
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    25
 additional axioms.  This effects in logical equivalence of $product$
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    26
 and $term$, as is reflected by the trivial introduction rule
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    27
 generated for this definition.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    28
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    29
 \medskip So what is the difference of declaring $\TIMES :: (\alpha ::
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    30
 product) \To \alpha \To \alpha$ vs.\ declaring $\TIMES :: (\alpha ::
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    31
 term) \To \alpha \To \alpha$ anyway?  In this particular case where
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    32
 $product \equiv term$, it should be obvious that both declarations
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    33
 are the same from the logic's point of view.  It even makes the most
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    34
 sense to remove sort constraints from constant declarations, as far
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    35
 as the purely logical meaning is concerned \cite{Wenzel:1997:TPHOL}.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    36
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    37
 On the other hand there are syntactic differences, of course.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    38
 Constants $\TIMES^\tau$ are rejected by the type-checker, unless the
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    39
 arity $\tau :: product$ is part of the type signature.  In our
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    40
 example, this arity may be always added when required by means of an
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    41
 $\isarkeyword{instance}$ with the trivial proof $\BY{intro_classes}$.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    42
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    43
 \medskip Thus, we may observe the following discipline of using
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    44
 syntactic classes.  Overloaded polymorphic constants have their type
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    45
 arguments restricted to an associated (logically trivial) class $c$.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    46
 Only immediately before \emph{specifying} these constants on a
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    47
 certain type $\tau$ do we instantiate $\tau :: c$.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    48
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    49
 This is done for class $product$ and type $bool$ as follows.%
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    50
\end{isamarkuptext}%
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    51
\isacommand{instance}~bool~::~product\isanewline
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    52
~~\isacommand{by}~intro\_classes\isanewline
9331
3da45f19730e updated;
wenzelm
parents: 9145
diff changeset
    53
\isacommand{defs}~(\isakeyword{overloaded})\isanewline
8907
wenzelm
parents: 8903
diff changeset
    54
~~product\_bool\_def:~{"}x~{\isasymOtimes}~y~{\isasymequiv}~x~{\isasymand}~y{"}%
8903
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    55
\begin{isamarkuptext}%
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    56
The definition $prod_bool_def$ becomes syntactically well-formed only
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    57
 after the arity $bool :: product$ is made known to the type checker.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    58
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    59
 \medskip It is very important to see that above $\DEFS$ are not
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    60
 directly connected with $\isarkeyword{instance}$ at all!  We were
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    61
 just following our convention to specify $\TIMES$ on $bool$ after
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    62
 having instantiated $bool :: product$.  Isabelle does not require
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    63
 these definitions, which is in contrast to programming languages like
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    64
 Haskell \cite{haskell-report}.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    65
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    66
 \medskip While Isabelle type classes and those of Haskell are almost
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    67
 the same as far as type-checking and type inference are concerned,
8907
wenzelm
parents: 8903
diff changeset
    68
 there are important semantic differences.  Haskell classes require
wenzelm
parents: 8903
diff changeset
    69
 their instances to \emph{provide operations} of certain \emph{names}.
8903
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    70
 Therefore, its \texttt{instance} has a \texttt{where} part that tells
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    71
 the system what these ``member functions'' should be.
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    72
8907
wenzelm
parents: 8903
diff changeset
    73
 This style of \texttt{instance} won't make much sense in Isabelle's
wenzelm
parents: 8903
diff changeset
    74
 meta-logic, because there is no internal notion of ``providing
wenzelm
parents: 8903
diff changeset
    75
 operations'' or even ``names of functions''.%
8903
78d6e47469e4 new Isar version;
wenzelm
parents: 8890
diff changeset
    76
\end{isamarkuptext}%
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    77
\isacommand{end}\end{isabelle}%
9145
9f7b8de5bfaf updated;
wenzelm
parents: 8907
diff changeset
    78
%%% Local Variables:
9f7b8de5bfaf updated;
wenzelm
parents: 8907
diff changeset
    79
%%% mode: latex
9f7b8de5bfaf updated;
wenzelm
parents: 8907
diff changeset
    80
%%% TeX-master: "root"
9f7b8de5bfaf updated;
wenzelm
parents: 8907
diff changeset
    81
%%% End: