doc-src/TutorialI/Types/Axioms.thy
author paulson
Fri, 12 Jan 2001 16:32:01 +0100
changeset 10885 90695f46440b
parent 10845 3696bc935bbd
child 11196 bb4ede27fcb7
permissions -rw-r--r--
lcp's pass over the book, chapters 1-8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)theory Axioms = Overloading:(*>*)
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     2
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     3
subsection{*Axioms*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     4
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     5
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     6
text{*Now we want to attach axioms to our classes. Then we can reason on the
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     7
level of classes and the results will be applicable to all types in a class,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     8
just as in axiomatic mathematics. These ideas are demonstrated by means of
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     9
our above ordering relations.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    10
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    11
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
    12
subsubsection{*Partial Orders*}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    13
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    14
text{*
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    15
A \emph{partial order} is a subclass of @{text ordrel}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    16
where certain axioms need to hold:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    17
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    18
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    19
axclass parord < ordrel
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    20
refl:    "x <<= x"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    21
trans:   "\<lbrakk> x <<= y; y <<= z \<rbrakk> \<Longrightarrow> x <<= z"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    22
antisym: "\<lbrakk> x <<= y; y <<= x \<rbrakk> \<Longrightarrow> x = y"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    23
less_le: "x << y = (x <<= y \<and> x \<noteq> y)"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    24
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    25
text{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    26
The first three axioms are the familiar ones, and the final one
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    27
requires that @{text"<<"} and @{text"<<="} are related as expected.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    28
Note that behind the scenes, Isabelle has restricted the axioms to class
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    29
@{text parord}. For example, this is what @{thm[source]refl} really looks like:
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
    30
@{thm[show_sorts]refl}.
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    31
10420
ef006735bee8 *** empty log message ***
nipkow
parents: 10396
diff changeset
    32
We have not made @{thm[source]less_le} a global definition because it would
ef006735bee8 *** empty log message ***
nipkow
parents: 10396
diff changeset
    33
fix once and for all that @{text"<<"} is defined in terms of @{text"<<="}.
ef006735bee8 *** empty log message ***
nipkow
parents: 10396
diff changeset
    34
There are however situations where it is the other way around, which such a
ef006735bee8 *** empty log message ***
nipkow
parents: 10396
diff changeset
    35
definition would complicate. The slight drawback of the above class is that
ef006735bee8 *** empty log message ***
nipkow
parents: 10396
diff changeset
    36
we need to define both @{text"<<="} and @{text"<<"} for each instance.
ef006735bee8 *** empty log message ***
nipkow
parents: 10396
diff changeset
    37
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    38
We can now prove simple theorems in this abstract setting, for example
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    39
that @{text"<<"} is not symmetric:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    40
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    41
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    42
lemma [simp]: "(x::'a::parord) << y \<Longrightarrow> (\<not> y << x) = True";
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    43
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    44
txt{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    45
The conclusion is not simply @{prop"\<not> y << x"} because the preprocessor
10845
3696bc935bbd *** empty log message ***
nipkow
parents: 10654
diff changeset
    46
of the simplifier (see \S\ref{sec:simp-preprocessor})
3696bc935bbd *** empty log message ***
nipkow
parents: 10654
diff changeset
    47
would turn this into @{prop"y << x = False"}, thus yielding
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    48
a nonterminating rewrite rule. In the above form it is a generally useful
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    49
rule.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    50
The type constraint is necessary because otherwise Isabelle would only assume
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    51
@{text"'a::ordrel"} (as required in the type of @{text"<<"}), in
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    52
which case the proposition is not a theorem.  The proof is easy:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    53
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    54
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    55
by(simp add:less_le antisym);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    56
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    57
text{* We could now continue in this vein and develop a whole theory of
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    58
results about partial orders. Eventually we will want to apply these results
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    59
to concrete types, namely the instances of the class. Thus we first need to
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    60
prove that the types in question, for example @{typ bool}, are indeed
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    61
instances of @{text parord}:*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    62
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    63
instance bool :: parord
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    64
apply intro_classes;
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    65
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    66
txt{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    67
This time @{text intro_classes} leaves us with the four axioms,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    68
specialized to type @{typ bool}, as subgoals:
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10328
diff changeset
    69
@{subgoals[display,show_types,indent=0]}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    70
Fortunately, the proof is easy for blast, once we have unfolded the definitions
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    71
of @{text"<<"} and @{text"<<="} at @{typ bool}:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    72
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    73
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    74
apply(simp_all (no_asm_use) only: le_bool_def less_bool_def);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    75
by(blast, blast, blast, blast);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    76
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    77
text{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    78
Can you figure out why we have to include @{text"(no_asm_use)"}?
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    79
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    80
We can now apply our single lemma above in the context of booleans:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    81
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    82
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    83
lemma "(P::bool) << Q \<Longrightarrow> \<not>(Q << P)";
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    84
by simp;
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    85
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    86
text{*\noindent
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
    87
The effect is not stunning, but it demonstrates the principle.  It also shows
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    88
that tools like the simplifier can deal with generic rules as well. Moreover,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    89
it should be clear that the main advantage of the axiomatic method is that
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    90
theorems can be proved in the abstract and one does not need to repeat the
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    91
proof for each instance.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    92
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    93
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
    94
subsubsection{*Linear Orders*}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    95
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    96
text{* If any two elements of a partial order are comparable it is a
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    97
\emph{linear} or \emph{total} order: *}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    98
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    99
axclass linord < parord
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   100
total: "x <<= y \<or> y <<= x"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   101
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   102
text{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   103
By construction, @{text linord} inherits all axioms from @{text parord}.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   104
Therefore we can show that totality can be expressed in terms of @{text"<<"}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   105
as follows:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   106
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   107
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   108
lemma "\<And>x::'a::linord. x<<y \<or> x=y \<or> y<<x";
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   109
apply(simp add: less_le);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   110
apply(insert total);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   111
apply blast;
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   112
done
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   113
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   114
text{*
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   115
Linear orders are an example of subclassing by construction, which is the most
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   116
common case. It is also possible to prove additional subclass relationships
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   117
later on, i.e.\ subclassing by proof. This is the topic of the following
10654
458068404143 *** empty log message ***
nipkow
parents: 10420
diff changeset
   118
paragraph.
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   119
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   120
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
   121
subsubsection{*Strict Orders*}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   122
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   123
text{*
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   124
An alternative axiomatization of partial orders takes @{text"<<"} rather than
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   125
@{text"<<="} as the primary concept. The result is a \emph{strict} order:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   126
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   127
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   128
axclass strord < ordrel
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   129
irrefl:     "\<not> x << x"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   130
less_trans: "\<lbrakk> x << y; y << z \<rbrakk> \<Longrightarrow> x << z"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   131
le_less:    "x <<= y = (x << y \<or> x = y)"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   132
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   133
text{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   134
It is well known that partial orders are the same as strict orders. Let us
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   135
prove one direction, namely that partial orders are a subclass of strict
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   136
orders. The proof follows the ususal pattern: *}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   137
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   138
instance parord < strord
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   139
apply intro_classes;
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   140
apply(simp_all (no_asm_use) add:less_le);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   141
  apply(blast intro: trans antisym);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   142
 apply(blast intro: refl);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   143
done
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   144
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   145
text{*
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   146
The subclass relation must always be acyclic. Therefore Isabelle will
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   147
complain if you also prove the relationship @{text"strord < parord"}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   148
*}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   149
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   150
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   151
(*
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   152
instance strord < parord
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   153
apply intro_classes;
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   154
apply(simp_all (no_asm_use) add:le_less);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   155
apply(blast intro: less_trans);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   156
apply(erule disjE);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   157
apply(erule disjE);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   158
apply(rule irrefl[THEN notE]);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   159
apply(rule less_trans, assumption, assumption);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   160
apply blast;apply blast;
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   161
apply(blast intro: irrefl[THEN notE]);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   162
done
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   163
*)
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   164
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
   165
subsubsection{*Multiple Inheritance and Sorts*}
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   166
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   167
text{*
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   168
A class may inherit from more than one direct superclass. This is called
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   169
multiple inheritance and is certainly permitted. For example we could define
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   170
the classes of well-founded orderings and well-orderings:
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   171
*}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   172
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   173
axclass wford < parord
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   174
wford: "wf {(y,x). y << x}"
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   175
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   176
axclass wellord < linord, wford
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   177
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   178
text{*\noindent
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   179
The last line expresses the usual definition: a well-ordering is a linear
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   180
well-founded ordering. The result is the subclass diagram in
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   181
Figure~\ref{fig:subclass}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   182
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   183
\begin{figure}[htbp]
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   184
\[
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   185
\begin{array}{r@ {}r@ {}c@ {}l@ {}l}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   186
& & \isa{term}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   187
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   188
& & \isa{ordrel}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   189
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   190
& & \isa{strord}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   191
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   192
& & \isa{parord} \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   193
& / & & \backslash \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   194
\isa{linord} & & & & \isa{wford} \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   195
& \backslash & & / \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   196
& & \isa{wellord}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   197
\end{array}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   198
\]
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
   199
\caption{Subclass Diagram}
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   200
\label{fig:subclass}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   201
\end{figure}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   202
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   203
Since class @{text wellord} does not introduce any new axioms, it can simply
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   204
be viewed as the intersection of the two classes @{text linord} and @{text
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   205
wford}. Such intersections need not be given a new name but can be created on
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   206
the fly: the expression $\{C@1,\dots,C@n\}$, where the $C@i$ are classes,
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   207
represents the intersection of the $C@i$. Such an expression is called a
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   208
\bfindex{sort}, and sorts can appear in most places where we have only shown
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   209
classes so far, for example in type constraints: @{text"'a::{linord,wford}"}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   210
In fact, @{text"'a::ord"} is short for @{text"'a::{ord}"}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   211
However, we do not pursue this rarefied concept further.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   212
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   213
This concludes our demonstration of type classes based on orderings.  We
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   214
remind our readers that \isa{Main} contains a theory of
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   215
orderings phrased in terms of the usual @{text"\<le>"} and @{text"<"}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   216
It is recommended that, if possible,
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   217
you base your own ordering relations on this theory.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   218
*}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   219
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   220
subsubsection{*Inconsistencies*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   221
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   222
text{* The reader may be wondering what happens if we, maybe accidentally,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   223
attach an inconsistent set of axioms to a class. So far we have always
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   224
avoided to add new axioms to HOL for fear of inconsistencies and suddenly it
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   225
seems that we are throwing all caution to the wind. So why is there no
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   226
problem?
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   227
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   228
The point is that by construction, all type variables in the axioms of an
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   229
\isacommand{axclass} are automatically constrained with the class being
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   230
defined (as shown for axiom @{thm[source]refl} above). These constraints are
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   231
always carried around and Isabelle takes care that they are never lost,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   232
unless the type variable is instantiated with a type that has been shown to
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   233
belong to that class. Thus you may be able to prove @{prop False}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   234
from your axioms, but Isabelle will remind you that this
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   235
theorem has the hidden hypothesis that the class is non-empty.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   236
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   237
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   238
(*
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   239
axclass false<"term"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   240
false: "x \<noteq> x";
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   241
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   242
lemma "False";
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   243
by(rule notE[OF false HOL.refl]);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   244
*)
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   245
(*<*)end(*>*)