doc-src/TutorialI/Types/Axioms.thy
author nipkow
Wed, 07 Mar 2001 15:54:11 +0100
changeset 11196 bb4ede27fcb7
parent 10885 90695f46440b
child 11428 332347b9b942
permissions -rw-r--r--
*** empty log message ***
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
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
    33
fix once and for all that @{text"<<"} is defined in terms of @{text"<<="} and
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
    34
never the other way around. Below you will see why we want to avoid this
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
    35
asymmetry. The drawback of the above class is that
10420
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
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
    88
that tools like the simplifier can deal with generic rules as well.
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
    89
It should be clear that the main advantage of the axiomatic method is that
10328
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
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   100
linear: "x <<= y \<or> y <<= x"
10328
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}.
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   104
Therefore we can show that linearity can be expressed in terms of @{text"<<"}
10328
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
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   108
lemma "\<And>x::'a::linord. x << y \<or> x = y \<or> y << x";
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   109
apply(simp add: less_le);
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   110
apply(insert linear);
10328
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
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   136
orders. *}
10328
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;
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   140
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   141
txt{*\noindent
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   142
@{subgoals[display,show_sorts]}
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   143
Assuming @{text"'a :: parord"}, the three axioms of class @{text strord}
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   144
are easily proved:
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   145
*}
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   146
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   147
  apply(simp_all (no_asm_use) add:less_le);
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   148
 apply(blast intro: trans antisym);
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   149
apply(blast intro: refl);
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   150
done
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   151
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   152
text{*
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   153
The subclass relation must always be acyclic. Therefore Isabelle will
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   154
complain if you also prove the relationship @{text"strord < parord"}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   155
*}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   156
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   157
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   158
(*
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   159
instance strord < parord
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   160
apply intro_classes;
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   161
apply(simp_all (no_asm_use) add:le_less);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   162
apply(blast intro: less_trans);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   163
apply(erule disjE);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   164
apply(erule disjE);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   165
apply(rule irrefl[THEN notE]);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   166
apply(rule less_trans, assumption, assumption);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   167
apply blast;apply blast;
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   168
apply(blast intro: irrefl[THEN notE]);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   169
done
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   170
*)
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   171
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
   172
subsubsection{*Multiple Inheritance and Sorts*}
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   173
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   174
text{*
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   175
A class may inherit from more than one direct superclass. This is called
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   176
multiple inheritance and is certainly permitted. For example we could define
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   177
the classes of well-founded orderings and well-orderings:
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   178
*}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   179
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   180
axclass wford < parord
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   181
wford: "wf {(y,x). y << x}"
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   182
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   183
axclass wellord < linord, wford
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   184
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   185
text{*\noindent
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   186
The last line expresses the usual definition: a well-ordering is a linear
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   187
well-founded ordering. The result is the subclass diagram in
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   188
Figure~\ref{fig:subclass}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   189
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   190
\begin{figure}[htbp]
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   191
\[
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   192
\begin{array}{r@ {}r@ {}c@ {}l@ {}l}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   193
& & \isa{term}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   194
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   195
& & \isa{ordrel}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   196
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   197
& & \isa{strord}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   198
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   199
& & \isa{parord} \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   200
& / & & \backslash \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   201
\isa{linord} & & & & \isa{wford} \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   202
& \backslash & & / \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   203
& & \isa{wellord}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   204
\end{array}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   205
\]
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10845
diff changeset
   206
\caption{Subclass Diagram}
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   207
\label{fig:subclass}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   208
\end{figure}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   209
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   210
Since class @{text wellord} does not introduce any new axioms, it can simply
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   211
be viewed as the intersection of the two classes @{text linord} and @{text
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   212
wford}. Such intersections need not be given a new name but can be created on
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   213
the fly: the expression $\{C@1,\dots,C@n\}$, where the $C@i$ are classes,
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   214
represents the intersection of the $C@i$. Such an expression is called a
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   215
\bfindex{sort}, and sorts can appear in most places where we have only shown
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   216
classes so far, for example in type constraints: @{text"'a::{linord,wford}"}.
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10885
diff changeset
   217
In fact, @{text"'a::C"} is short for @{text"'a::{C}"}.
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   218
However, we do not pursue this rarefied concept further.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   219
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   220
This concludes our demonstration of type classes based on orderings.  We
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   221
remind our readers that \isa{Main} contains a theory of
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   222
orderings phrased in terms of the usual @{text"\<le>"} and @{text"<"}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   223
It is recommended that, if possible,
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   224
you base your own ordering relations on this theory.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   225
*}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10362
diff changeset
   226
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   227
subsubsection{*Inconsistencies*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   228
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   229
text{* The reader may be wondering what happens if we, maybe accidentally,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   230
attach an inconsistent set of axioms to a class. So far we have always
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   231
avoided to add new axioms to HOL for fear of inconsistencies and suddenly it
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   232
seems that we are throwing all caution to the wind. So why is there no
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   233
problem?
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   234
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   235
The point is that by construction, all type variables in the axioms of an
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   236
\isacommand{axclass} are automatically constrained with the class being
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   237
defined (as shown for axiom @{thm[source]refl} above). These constraints are
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   238
always carried around and Isabelle takes care that they are never lost,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   239
unless the type variable is instantiated with a type that has been shown to
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   240
belong to that class. Thus you may be able to prove @{prop False}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   241
from your axioms, but Isabelle will remind you that this
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   242
theorem has the hidden hypothesis that the class is non-empty.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   243
*}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   244
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   245
(*
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   246
axclass false<"term"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   247
false: "x \<noteq> x";
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   248
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   249
lemma "False";
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   250
by(rule notE[OF false HOL.refl]);
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   251
*)
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   252
(*<*)end(*>*)