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