doc-src/AxClass/body.tex
author wenzelm
Sun, 21 May 2000 01:12:00 +0200
changeset 8890 9a44d8d98731
child 8903 78d6e47469e4
permissions -rw-r--r--
snapshot of new Isar'ized version;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8890
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     1
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     2
\chapter{Introduction}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     3
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     4
A Haskell-style type-system \cite{haskell-report} with ordered type-classes
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     5
has been present in Isabelle since 1991 \cite{nipkow-sorts93}.  Initially,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     6
classes have mainly served as a \emph{purely syntactic} tool to formulate
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     7
polymorphic object-logics in a clean way, such as the standard Isabelle
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     8
formulation of many-sorted FOL \cite{paulson-isa-book}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
     9
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    10
Applying classes at the \emph{logical level} to provide a simple notion of
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    11
abstract theories and instantiations to concrete ones, has been long proposed
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    12
as well \cite{nipkow-types93,nipkow-sorts93}).  At that time, Isabelle still
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    13
lacked built-in support for these \emph{axiomatic type classes}. More
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    14
importantly, their semantics was not yet fully fleshed out (and unnecessarily
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    15
complicated, too).
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    16
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    17
Since the Isabelle94 releases, actual axiomatic type classes have been an
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    18
integral part of Isabelle's meta-logic.  This very simple implementation is
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    19
based on a straight-forward extension of traditional simple-typed Higher-Order
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    20
Logic, including types qualified by logical predicates and overloaded constant
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    21
definitions; see \cite{Wenzel:1997:TPHOL} for further details.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    22
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    23
Yet until Isabelle99, there used to be still a fundamental methodological
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    24
problem in using axiomatic type classes conveniently, due to the traditional
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    25
distinction of Isabelle theory files vs.\ ML proof scripts.  This has been
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    26
finally overcome with the advent of Isabelle/Isar theories
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    27
\cite{isabelle-isar-ref}: now definitions and proofs may be freely intermixed.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    28
This nicely accommodates the usual procedure of defining axiomatic type
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    29
classes, proving abstract properties, defining operations on concrete types,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    30
proving concrete properties for instantiation of classes etc.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    31
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    32
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    33
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    34
So to cut a long story short, the present version of axiomatic type classes
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    35
(Isabelle99 or later) now provides an even more useful and convenient
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    36
mechanism for light-weight abstract theories, without any special provisions
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    37
to be observed by the user.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    38
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    39
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    40
\chapter{Examples}\label{sec:ex}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    41
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    42
Axiomatic type classes are a concept of Isabelle's meta-logic
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    43
\cite{paulson-isa-book,Wenzel:1997:TPHOL}.  They may be applied to any
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    44
object-logic that directly uses the meta type system, such as Isabelle/HOL
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    45
\cite{isabelle-HOL}.  Subsequently, we present various examples that are all
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    46
formulated within HOL, except the one of \secref{sec:ex-natclass} which is in
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    47
FOL.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    48
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    49
\section{Semigroups}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    50
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    51
An axiomatic type class is simply a class of types that all meet certain
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    52
\emph{axioms}. Thus, type classes may be also understood as type predicates
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    53
--- i.e.\ abstractions over a single type argument $\alpha$.  Class axioms
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    54
typically contain polymorphic constants that depend on this type $\alpha$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    55
These \emph{characteristic constants} behave like operations associated with
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    56
the ``carrier'' type $\alpha$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    57
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    58
We illustrate these basic concepts by the following theory of semi-groups.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    59
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    60
\bigskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    61
\input{generated/Semigroup}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    62
\bigskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    63
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    64
\noindent
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    65
Above we have first declared a polymorphic constant $\TIMES :: \alpha \To
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    66
\alpha \To \alpha$ and then defined the class $semigroup$ of all types $\tau$
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    67
such that $\TIMES :: \tau \To \tau \To \tau$ is indeed an associative
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    68
operator.  The $assoc$ axiom contains exactly one type variable, which is
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    69
invisible in the above presentation, though.  Also note that free term
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    70
variables (like $x$, $y$, $z$) are allowed for user convenience ---
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    71
conceptually all of these are bound by outermost universal quantifiers.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    72
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    73
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    74
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    75
In general, type classes may be used to describe \emph{structures} with
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    76
exactly one carrier $\alpha$ and a fixed \emph{signature}.  Different
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    77
signatures require different classes. In the following theory, class
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    78
$plus_semigroup$ represents semigroups of the form $(\tau, \PLUS^\tau)$ while
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    79
$times_semigroup$ represents semigroups $(\tau, \TIMES^\tau)$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    80
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    81
\bigskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    82
\input{generated/Semigroups}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    83
\bigskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    84
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    85
\noindent Even if classes $plus_semigroup$ and $times_semigroup$ both represent
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    86
semigroups in a sense, they are not the same!
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    87
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    88
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    89
\section{Basic group theory}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    90
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    91
\input{generated/Group}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    92
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    93
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    94
The meta type system of Isabelle supports \emph{intersections} and
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    95
\emph{inclusions} of type classes. These directly correspond to intersections
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    96
and inclusions of type predicates in a purely set theoretic sense. This is
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    97
sufficient as a means to describe simple hierarchies of structures.  As an
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    98
illustration, we use the well-known example of semigroups, monoids, general
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
    99
groups and abelian groups.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   100
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   101
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   102
\subsection{Monoids and Groups}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   103
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   104
First we declare some polymorphic constants required later for the signature
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   105
parts of our structures.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   106
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   107
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   108
Next we define class $monoid$ of monoids of the form $(\alpha,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   109
{\TIMES}^\alpha)$.  Note that multiple class axioms are allowed for user
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   110
convenience --- they simply represent the conjunction of their respective
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   111
universal closures.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   112
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   113
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   114
So class $monoid$ contains exactly those types $\tau$ where $\TIMES :: \tau
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   115
\To \tau \To \tau$ and $1 :: \tau$ are specified appropriately, such that
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   116
$\TIMES$ is associative and $1$ is a left and right unit for $\TIMES$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   117
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   118
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   119
Independently of $monoid$, we now define a linear hierarchy of semigroups,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   120
general groups and abelian groups.  Note that the names of class axioms are
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   121
automatically qualified with the class name; thus we may re-use common names
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   122
such as $assoc$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   123
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   124
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   125
Class $group$ inherits associativity of $\TIMES$ from $semigroup$ and adds the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   126
other two group axioms. Similarly, $agroup$ is defined as the subset of
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   127
$group$ such that for all of its elements $\tau$, the operation $\TIMES ::
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   128
\tau \To \tau \To \tau$ is even commutative.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   129
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   130
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   131
\subsection{Abstract reasoning}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   132
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   133
In a sense, axiomatic type classes may be viewed as \emph{abstract theories}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   134
Above class definitions internally generate the following abstract axioms:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   135
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   136
%FIXME
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   137
% \begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   138
% assoc:        (?x::?'a::semigroup) <*> (?y::?'a::semigroup)
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   139
%                 <*> (?z::?'a::semigroup) = ?x <*> (?y <*> ?z)\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   140
% left@unit:    1 <*> (?x::?'a::group) = ?x
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   141
% left@inverse: inverse (?x::?'a::group) <*> ?x = 1\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   142
% commut:       (?x::?'a::agroup) <*> (?y::?'a::agroup) = ?y <*> ?x
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   143
% \emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   144
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   145
All of these contain type variables $\alpha :: c$ that are restricted to types
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   146
of some class $c$. These \emph{sort constraints} express a logical
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   147
precondition for the whole formula. For example, $assoc$ states that for all
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   148
$\tau$, provided that $\tau :: semigroup$, the operation $\TIMES :: \tau \To
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   149
\tau \To \tau$ is associative.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   150
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   151
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   152
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   153
From a purely technical point of view, abstract axioms are just ordinary
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   154
Isabelle theorems; they may be used for proofs without special treatment.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   155
Such ``abstract proofs'' usually yield new abstract theorems.  For example, we
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   156
may now derive the following laws of general groups.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   157
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   158
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   159
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   160
Abstract theorems may be instantiated to only those types $\tau$ where the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   161
appropriate class membership $\tau :: c$ is known at Isabelle's type signature
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   162
level.  Since we have $agroup \subseteq group \subseteq semigroup$ by
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   163
definition, all theorems of $semigroup$ and $group$ are automatically
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   164
inherited by $group$ and $agroup$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   165
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   166
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   167
\subsection{Abstract instantiation}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   168
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   169
From the definition, the $monoid$ and $group$ classes have been independent.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   170
Note that for monoids, $right_unit$ had to be included as an axiom, but for
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   171
groups both $right_unit$ and $right_inverse$ are derivable from the other
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   172
axioms.  With $group_right_unit$ derived as a theorem of group theory (see
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   173
page~\pageref{thm:group-right-unit}), we may now instantiate $group \subset
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   174
monoid$ properly as follows (cf.\ \figref{fig:monoid-group}).
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   175
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   176
\begin{figure}[htbp]
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   177
  \begin{center}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   178
    \small
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   179
%    \unitlength 0.75mm
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   180
    \unitlength 0.6mm
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   181
    \begin{picture}(65,90)(0,-10)
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   182
      \put(15,10){\line(0,1){10}} \put(15,30){\line(0,1){10}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   183
      \put(15,50){\line(1,1){10}} \put(35,60){\line(1,-1){10}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   184
      \put(15,5){\makebox(0,0){$agroup$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   185
      \put(15,25){\makebox(0,0){$group$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   186
      \put(15,45){\makebox(0,0){$semigroup$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   187
      \put(30,65){\makebox(0,0){$term$}} \put(50,45){\makebox(0,0){$monoid$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   188
    \end{picture}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   189
    \hspace{4em}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   190
    \begin{picture}(30,90)(0,0)
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   191
      \put(15,10){\line(0,1){10}} \put(15,30){\line(0,1){10}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   192
      \put(15,50){\line(0,1){10}} \put(15,70){\line(0,1){10}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   193
      \put(15,5){\makebox(0,0){$agroup$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   194
      \put(15,25){\makebox(0,0){$group$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   195
      \put(15,45){\makebox(0,0){$monoid$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   196
      \put(15,65){\makebox(0,0){$semigroup$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   197
      \put(15,85){\makebox(0,0){$term$}}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   198
    \end{picture}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   199
    \caption{Monoids and groups: according to definition, and by proof}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   200
    \label{fig:monoid-group}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   201
  \end{center}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   202
\end{figure}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   203
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   204
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   205
\endinput
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   206
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   207
We know by definition that $\TIMES$ is associative for monoids, i.e.\ $monoid
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   208
\subseteq semigroup$. Furthermore we have $assoc$, $left_unit$ and
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   209
$right_unit$ for groups (where $right_unit$ is derivable from the group
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   210
axioms), that is $group \subseteq monoid$.  Thus we may establish the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   211
following class instantiations.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   212
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   213
\endinput
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   214
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   215
The \texttt{instance} section does really check that the class inclusions
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   216
(or type arities) to be added are derivable. To this end, it sets up a
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   217
suitable goal and attempts a proof with the help of some internal
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   218
axioms and user supplied theorems. These latter \emph{witnesses} usually
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   219
should be appropriate type instances of the class axioms (as are
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   220
\texttt{Monoid.assoc} and \texttt{assoc}, \texttt{left_unit}, \texttt{right_unit}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   221
above).
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   222
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   223
The most important internal tool for instantiation proofs is the class
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   224
introduction rule that is automatically generated by \texttt{axclass}. For
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   225
class \texttt{group} this is axiom \texttt{groupI}:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   226
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   227
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   228
groupI:   [| OFCLASS(?'a::term, semigroup@class);
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   229
             !!x::?'a::term. 1 <*> x = x;
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   230
             !!x::?'a::term. inverse x <*> x = 1 |]
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   231
          ==> OFCLASS(?'a::term, group@class)
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   232
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   233
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   234
There are also axioms \texttt{monoidI}, \texttt{semigroupI} and \texttt{agroupI}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   235
of a similar form.  Note that $\texttt{OFCLASS}(\tau, c \texttt{_class})$
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   236
expresses class membership $\tau :: c$ as a proposition of the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   237
meta-logic.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   238
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   239
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   240
\subsection{Concrete instantiation}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   241
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   242
So far we have covered the case of \texttt{instance $c@1$ < $c@2$} that
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   243
could be described as \emph{abstract instantiation} --- $c@1$ is more
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   244
special than $c@2$ and thus an instance of $c@2$. Even more
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   245
interesting for practical applications are \emph{concrete instantiations}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   246
of axiomatic type classes. That is, certain simple schemes $(\alpha@1,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   247
\ldots, \alpha@n)t :: c$ of class membership may be transferred to
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   248
Isabelle's type signature level. This form of \texttt{instance} is a ``safe''
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   249
variant of the old-style \texttt{arities} theory section.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   250
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   251
As an example, we show that type \texttt{bool} with exclusive-or as
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   252
operation $\TIMES$, identity as \texttt{inverse}, and \texttt{False} as \texttt{1}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   253
forms an abelian group. We first define theory \texttt{Xor}:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   254
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   255
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   256
Xor = Group +\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   257
defs
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   258
  prod@bool@def     "x <*> y   == x ~= (y::bool)"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   259
  inverse@bool@def  "inverse x == x::bool"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   260
  unit@bool@def     "1         == False"\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   261
end
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   262
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   263
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   264
It is important to note that above \texttt{defs} are just overloaded
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   265
meta-level constant definitions. In particular, type classes are not
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   266
yet involved at all! This form of constant definition with overloading
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   267
(and optional primitive recursion over types) would be also possible
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   268
in traditional versions of \HOL\ that lack type classes.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   269
% (see FIXME <foundation> for more details)
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   270
Nonetheless, such definitions are best applied in the context of
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   271
classes.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   272
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   273
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   274
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   275
Since we chose the \texttt{defs} of theory \texttt{Xor} suitably, the class
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   276
membership $\texttt{bool} :: \texttt{agroup}$ is now derivable as follows:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   277
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   278
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   279
open AxClass;
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   280
goal@arity Xor.thy ("bool", [], "agroup");
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   281
\out{Level 0}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   282
\out{OFCLASS(bool, agroup@class)}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   283
\out{ 1. OFCLASS(bool, agroup@class)}\brk
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   284
by (axclass@tac []);
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   285
\out{Level 1}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   286
\out{OFCLASS(bool, agroup@class)}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   287
\out{ 1. !!(x::bool) (y::bool) z::bool. x <*> y <*> z = x <*> (y <*> z)}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   288
\out{ 2. !!x::bool. 1 <*> x = x}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   289
\out{ 3. !!x::bool. inverse x <*> x = 1}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   290
\out{ 4. !!(x::bool) y::bool. x <*> y = y <*> x}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   291
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   292
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   293
The tactic \texttt{axclass_tac} has applied \texttt{agroupI} internally to
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   294
expand the class definition. It now remains to be shown that the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   295
\texttt{agroup} axioms hold for bool. To this end, we expand the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   296
definitions of \texttt{Xor} and solve the new subgoals by \texttt{fast_tac}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   297
of \HOL:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   298
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   299
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   300
by (rewrite@goals@tac [Xor.prod@bool@def, Xor.inverse@bool@def,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   301
        Xor.unit@bool@def]);
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   302
\out{Level 2}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   303
\out{OFCLASS(bool, agroup@class)}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   304
\out{ 1. !!(x::bool) (y::bool) z::bool. x ~= y ~= z = (x ~= (y ~= z))}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   305
\out{ 2. !!x::bool. False ~= x = x}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   306
\out{ 3. !!x::bool. x ~= x = False}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   307
\out{ 4. !!(x::bool) y::bool. x ~= y = (y ~= x)}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   308
by (ALLGOALS (fast@tac HOL@cs));
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   309
\out{Level 3}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   310
\out{OFCLASS(bool, agroup@class)}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   311
\out{No subgoals!}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   312
qed "bool@in@agroup";
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   313
\out{val bool@in@agroup = "OFCLASS(bool, agroup@class)"}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   314
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   315
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   316
The result is theorem $\texttt{OFCLASS}(\texttt{bool}, \texttt{agroup_class})$
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   317
which expresses $\texttt{bool} :: \texttt{agroup}$ as a meta-proposition. This
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   318
is not yet known at the type signature level, though.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   319
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   320
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   321
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   322
What we have done here by hand, can be also performed via
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   323
\texttt{instance} in a similar way behind the scenes. This may look as
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   324
follows\footnote{Subsequently, theory \texttt{Xor} is no longer
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   325
  required.}:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   326
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   327
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   328
BoolGroupInsts = Group +\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   329
defs
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   330
  prod@bool@def     "x <*> y   == x ~= (y::bool)"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   331
  inverse@bool@def  "inverse x == x::bool"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   332
  unit@bool@def     "1         == False"\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   333
instance
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   334
  bool :: agroup                \{| ALLGOALS (fast@tac HOL@cs) |\}\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   335
end
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   336
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   337
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   338
This way, we have $\texttt{bool} :: \texttt{agroup}$ in the type signature of
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   339
\texttt{BoolGroupInsts}, and all abstract group theorems are transferred
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   340
to \texttt{bool} for free.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   341
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   342
Similarly, we could now also instantiate our group theory classes to
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   343
many other concrete types. For example, $\texttt{int} :: \texttt{agroup}$ (by
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   344
defining $\TIMES$ as addition, \texttt{inverse} as negation and \texttt{1} as
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   345
zero, say) or $\texttt{list} :: (\texttt{term})\texttt{semigroup}$ (e.g.\ if
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   346
$\TIMES$ is list append). Thus, the characteristic constants $\TIMES$,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   347
\texttt{inverse}, \texttt{1} really become overloaded, i.e.\ have different
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   348
meanings on different types.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   349
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   350
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   351
\subsection{Lifting and Functors}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   352
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   353
As already mentioned above, \HOL-like systems not only support
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   354
overloaded definitions of polymorphic constants (without requiring
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   355
type classes), but even primitive recursion over types. That is,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   356
definitional equations $c^\tau \emphq t$ may also contain constants of
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   357
name $c$ on the RHS --- provided that these have types that are
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   358
strictly simpler (structurally) than $\tau$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   359
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   360
This feature enables us to \emph{lift operations}, e.g.\ to Cartesian
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   361
products, direct sums or function spaces. Below, theory
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   362
\texttt{ProdGroupInsts} lifts $\TIMES$ componentwise to two-place
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   363
Cartesian products $\alpha \times \beta$:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   364
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   365
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   366
ProdGroupInsts = Prod + Group +\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   367
defs
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   368
  prod@prod@def "p <*> q == (fst p <*> fst q, snd p <*> snd q)"\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   369
instance
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   370
  "*" :: (semigroup, semigroup) semigroup
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   371
    \{| simp@tac (prod@ss addsimps [assoc]) 1 |\}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   372
end
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   373
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   374
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   375
Note that \texttt{prod_prod_def} basically has the form $\emphdrv
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   376
{\TIMES}^{\alpha \times \beta} \emphq \ldots {\TIMES}^\alpha \ldots
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   377
{\TIMES}^\beta \ldots$, i.e.\ the recursive occurrences
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   378
$\TIMES^\alpha$ and $\TIMES^\beta$ are really at ``simpler'' types.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   379
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   380
It is very easy to see that associativity of $\TIMES^\alpha$,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   381
$\TIMES^\beta$ transfers to ${\TIMES}^{\alpha \times \beta}$. Hence
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   382
the two-place type constructor $\times$ maps semigroups into
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   383
semigroups. This fact is proven and put into Isabelle's type signature by
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   384
above \texttt{instance} section.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   385
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   386
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   387
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   388
Thus, if we view class instances as ``structures'', overloaded
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   389
constant definitions with primitive recursion over types indirectly
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   390
provide some kind of ``functors'' (mappings between abstract theories,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   391
that is).
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   392
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   393
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   394
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   395
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   396
%%% Local Variables: 
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   397
%%% mode: latex
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   398
%%% TeX-master: "axclass"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   399
%%% End: 
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   400
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   401
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   402
\section{Syntactic classes}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   403
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   404
There is still a feature of Isabelle's type system left that we have not yet
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   405
used: when declaring polymorphic constants $c :: \sigma$, the type variables
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   406
occurring in $\sigma$ may be constrained by type classes (or even general
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   407
sorts) in an arbitrary way.  Note that by default, in Isabelle/HOL the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   408
declaration:  FIXME
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   409
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   410
\input{generated/Product}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   411
\input{generated/NatClass}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   412
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   413
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   414
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   415
\endinput
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   416
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   417
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   418
%\section
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   419
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   420
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   421
  <*> :: ['a, 'a] => 'a
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   422
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   423
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   424
is actually an abbreviation for:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   425
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   426
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   427
  <*> :: ['a::term, 'a::term] => 'a::term
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   428
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   429
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   430
Since class \texttt{term} is the universal class of \HOL, this is not
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   431
really a restriction at all. A less trivial example is the following
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   432
theory \texttt{Product}:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   433
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   434
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   435
Product = HOL +\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   436
axclass
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   437
  product < term\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   438
consts
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   439
  "<*>" :: "['a::product, 'a] => 'a"      (infixl 70)\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   440
end
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   441
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   442
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   443
Here class \texttt{product} is defined as subclass of \texttt{term}, but
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   444
without any additional axioms. This effects in logical equivalence of
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   445
\texttt{product} and \texttt{term}, since \texttt{productI} is as follows:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   446
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   447
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   448
productI: OFCLASS(?'a::logic, term@class) ==>
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   449
            OFCLASS(?'a::logic, product@class)
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   450
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   451
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   452
I.e.\ $\texttt{term} \subseteq \texttt{product}$. The converse inclusion is
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   453
already contained in the type signature of theory \texttt{Product}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   454
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   455
Now, what is the difference of declaring $\TIMES :: [\alpha ::
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   456
\texttt{product}, \alpha] \To \alpha$ vs.\ declaring $\TIMES :: [\alpha ::
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   457
\texttt{term}, \alpha] \To \alpha$? In this special case (where
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   458
$\texttt{product} \emphq \texttt{term}$), it should be obvious that both
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   459
declarations are the same from the logic's point of view.  It is even
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   460
most sensible in the general case not to attach any \emph{logical}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   461
meaning to sort constraints occurring in constant \emph{declarations}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   462
(see \cite[page 79]{Wenzel94} for more details).
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   463
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   464
On the other hand there are syntactic differences, of course.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   465
Constants $\TIMES^\tau$ are rejected by the type-checker, unless $\tau
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   466
:: \texttt{product}$ is part of the type signature.  In our example, this
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   467
arity may be always added when required by means of a trivial
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   468
\texttt{instance}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   469
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   470
Thus, we can follow this discipline: Overloaded polymorphic constants
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   471
have their type arguments restricted to an associated (logically
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   472
trivial) class $c$. Only immediately before \emph{specifying} these
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   473
constants on a certain type $\tau$ do we instantiate $\tau :: c$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   474
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   475
This is done for class \texttt{product} and type \texttt{bool} in theory
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   476
\texttt{ProductInsts} below:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   477
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   478
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   479
ProductInsts = Product +\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   480
instance
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   481
  bool :: product\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   482
defs
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   483
  prod@bool@def "x <*> y  == x & y::bool"\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   484
end
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   485
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   486
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   487
Note that \texttt{instance bool ::\ product} does not require any
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   488
witnesses, since this statement is logically trivial. Nonetheless,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   489
\texttt{instance} really performs a proof.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   490
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   491
Only after $\texttt{bool} :: \texttt{product}$ is made known to the type
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   492
checker, does \texttt{prod_bool_def} become syntactically well-formed.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   493
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   494
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   495
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   496
It is very important to see that above \texttt{defs} are not directly
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   497
connected with \texttt{instance} at all! We were just following our
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   498
convention to specify $\TIMES$ on \texttt{bool} after having instantiated
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   499
$\texttt{bool} :: \texttt{product}$. Isabelle does not require these definitions,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   500
which is in contrast to programming languages like Haskell.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   501
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   502
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   503
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   504
While Isabelle type classes and those of Haskell are almost the same as
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   505
far as type-checking and type inference are concerned, there are major
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   506
semantic differences. Haskell classes require their instances to
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   507
\emph{provide operations} of certain \emph{names}. Therefore, its
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   508
\texttt{instance} has a \texttt{where} part that tells the system what these
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   509
``member functions'' should be.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   510
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   511
This style of \texttt{instance} won't make much sense in Isabelle, because its
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   512
meta-logic has no corresponding notion of ``providing operations'' or
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   513
``names''.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   514
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   515
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   516
\section{Defining natural numbers in FOL}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   517
\label{sec:ex-natclass}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   518
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   519
Axiomatic type classes abstract over exactly one type argument. Thus,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   520
any \emph{axiomatic} theory extension where each axiom refers to at most
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   521
one type variable, may be trivially turned into a \emph{definitional}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   522
one.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   523
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   524
We illustrate this with the natural numbers in Isabelle/FOL:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   525
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   526
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   527
NatClass = FOL +\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   528
consts
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   529
  "0"           :: "'a"                                 ("0")
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   530
  Suc           :: "'a => 'a"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   531
  rec           :: "['a, 'a, ['a, 'a] => 'a] => 'a"\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   532
axclass
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   533
  nat < term
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   534
  induct        "[| P(0); !!x. P(x) ==> P(Suc(x)) |] ==> P(n)"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   535
  Suc@inject    "Suc(m) = Suc(n) ==> m = n"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   536
  Suc@neq@0     "Suc(m) = 0 ==> R"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   537
  rec@0         "rec(0, a, f) = a"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   538
  rec@Suc       "rec(Suc(m), a, f) = f(m, rec(m, a, f))"\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   539
consts
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   540
  "+"           :: "['a::nat, 'a] => 'a"                (infixl 60)\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   541
defs
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   542
  add@def       "m + n == rec(m, n, %x y. Suc(y))"\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   543
end
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   544
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   545
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   546
\texttt{NatClass} is an abstract version of \texttt{Nat}\footnote{See
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   547
  directory \texttt{FOL/ex}.}. Basically, we have just replaced all
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   548
occurrences of \emph{type} \texttt{nat} by $\alpha$ and used the natural
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   549
number axioms to define \emph{class} \texttt{nat}\footnote{There's a snag:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   550
  The original recursion operator \texttt{rec} had to be made monomorphic,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   551
  in a sense.}. Thus class \texttt{nat} contains exactly those types
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   552
$\tau$ that are isomorphic to ``the'' natural numbers (with signature
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   553
\texttt{0}, \texttt{Suc}, \texttt{rec}).
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   554
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   555
Furthermore, theory \texttt{NatClass} defines an ``abstract constant'' $+$
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   556
based on class \texttt{nat}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   557
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   558
\medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   559
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   560
What we have done here can be also viewed as \emph{type specification}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   561
Of course, it still remains open if there is some type at all that
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   562
meets the class axioms. Now a very nice property of axiomatic type
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   563
classes is, that abstract reasoning is always possible --- independent
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   564
of satisfiability. The meta-logic won't break, even if some class (or
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   565
general sort) turns out to be empty (``inconsistent'')
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   566
later\footnote{As a consequence of an old bug, this is \emph{not} true
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   567
  for pre-Isabelle94-2 versions.}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   568
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   569
For example, we may derive the following abstract natural numbers
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   570
theorems:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   571
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   572
\begin{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   573
add@0:    0 + (?n::?'a::nat) = ?n
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   574
add@Suc:  Suc(?m::?'a::nat) + (?n::?'a::nat) = Suc(?m + ?n)
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   575
\emphnd{ascbox}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   576
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   577
See also file \texttt{FOL/ex/NatClass.ML}. Note that this required only
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   578
some trivial modifications of the original \texttt{Nat.ML}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   579
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   580
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   581
%% FIXME move some parts to ref or isar-ref manual (!?);
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   582
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   583
% \chapter{The user interface of Isabelle's axclass package}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   584
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   585
% The actual axiomatic type class package of Isabelle/Pure mainly consists
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   586
% of two new theory sections: \texttt{axclass} and \texttt{instance}.  Some
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   587
% typical applications of these have already been demonstrated in
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   588
% \secref{sec:ex}, below their syntax and semantics are presented more
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   589
% completely.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   590
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   591
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   592
% \section{The axclass section}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   593
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   594
% Within theory files, \texttt{axclass} introduces an axiomatic type class
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   595
% definition. Its concrete syntax is:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   596
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   597
% \begin{matharray}{l}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   598
%   \texttt{axclass} \\
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   599
%   \ \ c \texttt{ < } c@1\texttt, \ldots\texttt, c@n \\
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   600
%   \ \ id@1\ axm@1 \\
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   601
%   \ \ \vdots \\
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   602
%   \ \ id@m\ axm@m
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   603
% \emphnd{matharray}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   604
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   605
% Where $c, c@1, \ldots, c@n$ are classes (category $id$ or
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   606
% $string$) and $axm@1, \ldots, axm@m$ (with $m \ge
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   607
% 0$) are formulas (category $string$).
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   608
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   609
% Class $c$ has to be new, and sort $\{c@1, \ldots, c@n\}$ a subsort of
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   610
% \texttt{logic}. Each class axiom $axm@j$ may contain any term
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   611
% variables, but at most one type variable (which need not be the same
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   612
% for all axioms). The sort of this type variable has to be a supersort
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   613
% of $\{c@1, \ldots, c@n\}$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   614
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   615
% \medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   616
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   617
% The \texttt{axclass} section declares $c$ as subclass of $c@1, \ldots,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   618
% c@n$ to the type signature.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   619
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   620
% Furthermore, $axm@1, \ldots, axm@m$ are turned into the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   621
% ``abstract axioms'' of $c$ with names $id@1, \ldots,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   622
% id@m$.  This is done by replacing all occurring type variables
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   623
% by $\alpha :: c$. Original axioms that do not contain any type
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   624
% variable will be prefixed by the logical precondition
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   625
% $\texttt{OFCLASS}(\alpha :: \texttt{logic}, c\texttt{_class})$.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   626
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   627
% Another axiom of name $c\texttt{I}$ --- the ``class $c$ introduction
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   628
% rule'' --- is built from the respective universal closures of
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   629
% $axm@1, \ldots, axm@m$ appropriately.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   630
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   631
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   632
% \section{The instance section}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   633
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   634
% Section \texttt{instance} proves class inclusions or type arities at the
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   635
% logical level and then transfers these into the type signature.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   636
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   637
% Its concrete syntax is:
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   638
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   639
% \begin{matharray}{l}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   640
%   \texttt{instance} \\
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   641
%   \ \ [\ c@1 \texttt{ < } c@2 \ |\
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   642
%       t \texttt{ ::\ (}sort@1\texttt, \ldots \texttt, sort@n\texttt) sort\ ] \\
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   643
%   \ \ [\ \texttt(name@1 \texttt, \ldots\texttt, name@m\texttt)\ ] \\
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   644
%   \ \ [\ \texttt{\{|} text \texttt{|\}}\ ]
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   645
% \emphnd{matharray}
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   646
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   647
% Where $c@1, c@2$ are classes and $t$ is an $n$-place type constructor
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   648
% (all of category $id$ or $string)$. Furthermore,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   649
% $sort@i$ are sorts in the usual Isabelle-syntax.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   650
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   651
% \medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   652
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   653
% Internally, \texttt{instance} first sets up an appropriate goal that
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   654
% expresses the class inclusion or type arity as a meta-proposition.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   655
% Then tactic \texttt{AxClass.axclass_tac} is applied with all preceding
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   656
% meta-definitions of the current theory file and the user-supplied
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   657
% witnesses. The latter are $name@1, \ldots, name@m$, where
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   658
% $id$ refers to an \ML-name of a theorem, and $string$ to an
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   659
% axiom of the current theory node\footnote{Thus, the user may reference
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   660
%   axioms from above this \texttt{instance} in the theory file. Note
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   661
%   that new axioms appear at the \ML-toplevel only after the file is
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   662
%   processed completely.}.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   663
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   664
% Tactic \texttt{AxClass.axclass_tac} first unfolds the class definition by
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   665
% resolving with rule $c\texttt\texttt{I}$, and then applies the witnesses
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   666
% according to their form: Meta-definitions are unfolded, all other
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   667
% formulas are repeatedly resolved\footnote{This is done in a way that
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   668
%   enables proper object-\emph{rules} to be used as witnesses for
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   669
%   corresponding class axioms.} with.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   670
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   671
% The final optional argument $text$ is \ML-code of an arbitrary
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   672
% user tactic which is applied last to any remaining goals.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   673
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   674
% \medskip
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   675
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   676
% Because of the complexity of \texttt{instance}'s witnessing mechanisms,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   677
% new users of the axclass package are advised to only use the simple
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   678
% form $\texttt{instance}\ \ldots\ (id@1, \ldots, id@!m)$, where
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   679
% the identifiers refer to theorems that are appropriate type instances
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   680
% of the class axioms. This typically requires an auxiliary theory,
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   681
% though, which defines some constants and then proves these witnesses.
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   682
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   683
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   684
%%% Local Variables: 
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   685
%%% mode: latex
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   686
%%% TeX-master: "axclass"
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   687
%%% End: 
9a44d8d98731 snapshot of new Isar'ized version;
wenzelm
parents:
diff changeset
   688
% LocalWords:  Isabelle FOL