doc-src/TutorialI/Types/document/Axioms.tex
author paulson
Mon, 06 Nov 2000 16:41:39 +0100
changeset 10397 e2d0dda41f2c
parent 10396 5ab08609e6c8
child 10420 ef006735bee8
permissions -rw-r--r--
auto update
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     1
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     2
\begin{isabellebody}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     3
\def\isabellecontext{Axioms}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     4
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
     5
\isamarkupsubsection{Axioms%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
     6
}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     7
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     8
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     9
Now we want to attach axioms to our classes. Then we can reason on the
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    10
level of classes and the results will be applicable to all types in a class,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    11
just as in axiomatic mathematics. These ideas are demonstrated by means of
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    12
our above ordering relations.%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    13
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    14
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    15
\isamarkupsubsubsection{Partial orders%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    16
}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    17
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    18
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    19
A \emph{partial order} is a subclass of \isa{ordrel}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    20
where certain axioms need to hold:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    21
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    22
\isacommand{axclass}\ parord\ {\isacharless}\ ordrel\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    23
refl{\isacharcolon}\ \ \ \ {\isachardoublequote}x\ {\isacharless}{\isacharless}{\isacharequal}\ x{\isachardoublequote}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    24
trans{\isacharcolon}\ \ \ {\isachardoublequote}{\isasymlbrakk}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}{\isacharequal}\ z\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ z{\isachardoublequote}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    25
antisym{\isacharcolon}\ {\isachardoublequote}{\isasymlbrakk}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}{\isacharequal}\ x\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharequal}\ y{\isachardoublequote}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    26
less{\isacharunderscore}le{\isacharcolon}\ {\isachardoublequote}x\ {\isacharless}{\isacharless}\ y\ {\isacharequal}\ {\isacharparenleft}x\ {\isacharless}{\isacharless}{\isacharequal}\ y\ {\isasymand}\ x\ {\isasymnoteq}\ y{\isacharparenright}{\isachardoublequote}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    27
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    28
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    29
The first three axioms are the familiar ones, and the final one
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    30
requires that \isa{{\isacharless}{\isacharless}} and \isa{{\isacharless}{\isacharless}{\isacharequal}} are related as expected.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    31
Note that behind the scenes, Isabelle has restricted the axioms to class
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    32
\isa{parord}. For example, this is what \isa{refl} really looks like:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    33
\isa{{\isacharparenleft}{\isacharquery}x{\isasymColon}{\isacharquery}{\isacharprime}a{\isacharparenright}\ {\isacharless}{\isacharless}{\isacharequal}\ {\isacharquery}x}.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    34
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    35
We can now prove simple theorems in this abstract setting, for example
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    36
that \isa{{\isacharless}{\isacharless}} is not symmetric:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    37
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    38
\isacommand{lemma}\ {\isacharbrackleft}simp{\isacharbrackright}{\isacharcolon}\ {\isachardoublequote}{\isacharparenleft}x{\isacharcolon}{\isacharcolon}{\isacharprime}a{\isacharcolon}{\isacharcolon}parord{\isacharparenright}\ {\isacharless}{\isacharless}\ y\ {\isasymLongrightarrow}\ {\isacharparenleft}{\isasymnot}\ y\ {\isacharless}{\isacharless}\ x{\isacharparenright}\ {\isacharequal}\ True{\isachardoublequote}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    39
\begin{isamarkuptxt}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    40
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    41
The conclusion is not simply \isa{{\isasymnot}\ y\ {\isacharless}{\isacharless}\ x} because the preprocessor
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    42
of the simplifier would turn this into \isa{{\isacharparenleft}y\ {\isacharless}{\isacharless}\ x{\isacharparenright}\ {\isacharequal}\ False}, thus yielding
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    43
a nonterminating rewrite rule. In the above form it is a generally useful
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    44
rule.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    45
The type constraint is necessary because otherwise Isabelle would only assume
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    46
\isa{{\isacharprime}a{\isacharcolon}{\isacharcolon}ordrel} (as required in the type of \isa{{\isacharless}{\isacharless}}), in
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    47
which case the proposition is not a theorem.  The proof is easy:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    48
\end{isamarkuptxt}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    49
\isacommand{by}{\isacharparenleft}simp\ add{\isacharcolon}less{\isacharunderscore}le\ antisym{\isacharparenright}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    50
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    51
We could now continue in this vein and develop a whole theory of
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    52
results about partial orders. Eventually we will want to apply these results
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    53
to concrete types, namely the instances of the class. Thus we first need to
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    54
prove that the types in question, for example \isa{bool}, are indeed
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    55
instances of \isa{parord}:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    56
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    57
\isacommand{instance}\ bool\ {\isacharcolon}{\isacharcolon}\ parord\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    58
\isacommand{apply}\ intro{\isacharunderscore}classes%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    59
\begin{isamarkuptxt}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    60
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    61
This time \isa{intro{\isacharunderscore}classes} leaves us with the four axioms,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    62
specialized to type \isa{bool}, as subgoals:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    63
\begin{isabelle}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    64
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}x{\isasymColon}bool{\isachardot}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ x\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    65
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}{\isacharparenleft}x{\isasymColon}bool{\isacharparenright}\ {\isacharparenleft}y{\isasymColon}bool{\isacharparenright}\ z{\isasymColon}bool{\isachardot}\ {\isasymlbrakk}x\ {\isacharless}{\isacharless}{\isacharequal}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}{\isacharequal}\ z{\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ z\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    66
\ {\isadigit{3}}{\isachardot}\ {\isasymAnd}{\isacharparenleft}x{\isasymColon}bool{\isacharparenright}\ y{\isasymColon}bool{\isachardot}\ {\isasymlbrakk}x\ {\isacharless}{\isacharless}{\isacharequal}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}{\isacharequal}\ x{\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharequal}\ y\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    67
\ {\isadigit{4}}{\isachardot}\ {\isasymAnd}{\isacharparenleft}x{\isasymColon}bool{\isacharparenright}\ y{\isasymColon}bool{\isachardot}\ {\isacharparenleft}x\ {\isacharless}{\isacharless}\ y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}x\ {\isacharless}{\isacharless}{\isacharequal}\ y\ {\isasymand}\ x\ {\isasymnoteq}\ y{\isacharparenright}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    68
\end{isabelle}
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 \isa{{\isacharless}{\isacharless}} and \isa{{\isacharless}{\isacharless}{\isacharequal}} at \isa{bool}:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    71
\end{isamarkuptxt}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    72
\isacommand{apply}{\isacharparenleft}simp{\isacharunderscore}all\ {\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}use{\isacharparenright}\ only{\isacharcolon}\ le{\isacharunderscore}bool{\isacharunderscore}def\ less{\isacharunderscore}bool{\isacharunderscore}def{\isacharparenright}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    73
\isacommand{by}{\isacharparenleft}blast{\isacharcomma}\ blast{\isacharcomma}\ blast{\isacharcomma}\ blast{\isacharparenright}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    74
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    75
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    76
Can you figure out why we have to include \isa{{\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}use{\isacharparenright}}?
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    77
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    78
We can now apply our single lemma above in the context of booleans:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    79
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    80
\isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}P{\isacharcolon}{\isacharcolon}bool{\isacharparenright}\ {\isacharless}{\isacharless}\ Q\ {\isasymLongrightarrow}\ {\isasymnot}{\isacharparenleft}Q\ {\isacharless}{\isacharless}\ P{\isacharparenright}{\isachardoublequote}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    81
\isacommand{by}\ simp%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    82
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    83
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    84
The effect is not stunning but demonstrates the principle.  It also shows
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    85
that tools like the simplifier can deal with generic rules as well. Moreover,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    86
it should be clear that the main advantage of the axiomatic method is that
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    87
theorems can be proved in the abstract and one does not need to repeat the
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    88
proof for each instance.%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    89
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    90
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    91
\isamarkupsubsubsection{Linear orders%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    92
}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    93
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    94
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    95
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
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    98
\isacommand{axclass}\ linord\ {\isacharless}\ parord\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    99
total{\isacharcolon}\ {\isachardoublequote}x\ {\isacharless}{\isacharless}{\isacharequal}\ y\ {\isasymor}\ y\ {\isacharless}{\isacharless}{\isacharequal}\ x{\isachardoublequote}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   100
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   101
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   102
By construction, \isa{linord} inherits all axioms from \isa{parord}.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   103
Therefore we can show that totality can be expressed in terms of \isa{{\isacharless}{\isacharless}}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   104
as follows:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   105
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   106
\isacommand{lemma}\ {\isachardoublequote}{\isasymAnd}x{\isacharcolon}{\isacharcolon}{\isacharprime}a{\isacharcolon}{\isacharcolon}linord{\isachardot}\ x{\isacharless}{\isacharless}y\ {\isasymor}\ x{\isacharequal}y\ {\isasymor}\ y{\isacharless}{\isacharless}x{\isachardoublequote}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   107
\isacommand{apply}{\isacharparenleft}simp\ add{\isacharcolon}\ less{\isacharunderscore}le{\isacharparenright}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   108
\isacommand{apply}{\isacharparenleft}insert\ total{\isacharparenright}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   109
\isacommand{apply}\ blast\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   110
\isacommand{done}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   111
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   112
Linear orders are an example of subclassing by construction, which is the most
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   113
common case. It is also possible to prove additional subclass relationships
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   114
later on, i.e.\ subclassing by proof. This is the topic of the following
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   115
section.%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   116
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   117
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   118
\isamarkupsubsubsection{Strict orders%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   119
}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   120
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   121
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   122
An alternative axiomatization of partial orders takes \isa{{\isacharless}{\isacharless}} rather than
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   123
\isa{{\isacharless}{\isacharless}{\isacharequal}} as the primary concept. The result is a \emph{strict} order:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   124
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   125
\isacommand{axclass}\ strord\ {\isacharless}\ ordrel\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   126
irrefl{\isacharcolon}\ \ \ \ \ {\isachardoublequote}{\isasymnot}\ x\ {\isacharless}{\isacharless}\ x{\isachardoublequote}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   127
less{\isacharunderscore}trans{\isacharcolon}\ {\isachardoublequote}{\isasymlbrakk}\ x\ {\isacharless}{\isacharless}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}\ z\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharless}{\isacharless}\ z{\isachardoublequote}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   128
le{\isacharunderscore}less{\isacharcolon}\ \ \ \ {\isachardoublequote}x\ {\isacharless}{\isacharless}{\isacharequal}\ y\ {\isacharequal}\ {\isacharparenleft}x\ {\isacharless}{\isacharless}\ y\ {\isasymor}\ x\ {\isacharequal}\ y{\isacharparenright}{\isachardoublequote}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   129
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   130
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   131
It is well known that partial orders are the same as strict orders. Let us
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   132
prove one direction, namely that partial orders are a subclass of strict
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   133
orders. The proof follows the ususal pattern:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   134
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   135
\isacommand{instance}\ parord\ {\isacharless}\ strord\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   136
\isacommand{apply}\ intro{\isacharunderscore}classes\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   137
\isacommand{apply}{\isacharparenleft}simp{\isacharunderscore}all\ {\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}use{\isacharparenright}\ add{\isacharcolon}less{\isacharunderscore}le{\isacharparenright}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   138
\ \ \isacommand{apply}{\isacharparenleft}blast\ intro{\isacharcolon}\ trans\ antisym{\isacharparenright}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   139
\ \isacommand{apply}{\isacharparenleft}blast\ intro{\isacharcolon}\ refl{\isacharparenright}\isanewline
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   140
\isacommand{done}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   141
\begin{isamarkuptext}%
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   142
The subclass relation must always be acyclic. Therefore Isabelle will
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   143
complain if you also prove the relationship \isa{strord\ {\isacharless}\ parord}.%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   144
\end{isamarkuptext}%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   145
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   146
\isamarkupsubsubsection{Multiple inheritance and sorts%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   147
}
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   148
%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   149
\begin{isamarkuptext}%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   150
A class may inherit from more than one direct superclass. This is called
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   151
multiple inheritance and is certainly permitted. For example we could define
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   152
the classes of well-founded orderings and well-orderings:%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   153
\end{isamarkuptext}%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   154
\isacommand{axclass}\ wford\ {\isacharless}\ parord\isanewline
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   155
wford{\isacharcolon}\ {\isachardoublequote}wf\ {\isacharbraceleft}{\isacharparenleft}y{\isacharcomma}x{\isacharparenright}{\isachardot}\ y\ {\isacharless}{\isacharless}\ x{\isacharbraceright}{\isachardoublequote}\isanewline
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   156
\isanewline
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   157
\isacommand{axclass}\ wellord\ {\isacharless}\ linord{\isacharcomma}\ wford%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   158
\begin{isamarkuptext}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   159
\noindent
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   160
The last line expresses the usual definition: a well-ordering is a linear
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   161
well-founded ordering. The result is the subclass diagram in
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   162
Figure~\ref{fig:subclass}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   163
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   164
\begin{figure}[htbp]
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   165
\[
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   166
\begin{array}{r@ {}r@ {}c@ {}l@ {}l}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   167
& & \isa{term}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   168
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   169
& & \isa{ordrel}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   170
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   171
& & \isa{strord}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   172
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   173
& & \isa{parord} \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   174
& / & & \backslash \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   175
\isa{linord} & & & & \isa{wford} \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   176
& \backslash & & / \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   177
& & \isa{wellord}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   178
\end{array}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   179
\]
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   180
\caption{Subclass diagramm}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   181
\label{fig:subclass}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   182
\end{figure}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   183
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   184
Since class \isa{wellord} does not introduce any new axioms, it can simply
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   185
be viewed as the intersection of the two classes \isa{linord} and \isa{wford}. Such intersections need not be given a new name but can be created on
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   186
the fly: the expression $\{C@1,\dots,C@n\}$, where the $C@i$ are classes,
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   187
represents the intersection of the $C@i$. Such an expression is called a
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   188
\bfindex{sort}, and sorts can appear in most places where we have only shown
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   189
classes so far, for example in type constraints: \isa{{\isacharprime}a{\isacharcolon}{\isacharcolon}{\isacharbraceleft}linord{\isacharcomma}wford{\isacharbraceright}}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   190
In fact, \isa{{\isacharprime}a{\isacharcolon}{\isacharcolon}ord} is short for \isa{{\isacharprime}a{\isacharcolon}{\isacharcolon}{\isacharbraceleft}ord{\isacharbraceright}}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   191
However, we do not pursue this rarefied concept further.
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   192
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   193
This concludes our demonstration of type classes based on orderings.  We
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   194
remind our readers that \isa{Main} contains a theory of
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   195
orderings phrased in terms of the usual \isa{{\isasymle}} and \isa{{\isacharless}}.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   196
It is recommended that, if possible,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   197
you base your own ordering relations on this theory.%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   198
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   199
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   200
\isamarkupsubsubsection{Inconsistencies%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   201
}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   202
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   203
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   204
The reader may be wondering what happens if we, maybe accidentally,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   205
attach an inconsistent set of axioms to a class. So far we have always
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   206
avoided to add new axioms to HOL for fear of inconsistencies and suddenly it
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   207
seems that we are throwing all caution to the wind. So why is there no
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   208
problem?
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   209
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   210
The point is that by construction, all type variables in the axioms of an
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   211
\isacommand{axclass} are automatically constrained with the class being
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   212
defined (as shown for axiom \isa{refl} above). These constraints are
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   213
always carried around and Isabelle takes care that they are never lost,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   214
unless the type variable is instantiated with a type that has been shown to
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   215
belong to that class. Thus you may be able to prove \isa{False}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   216
from your axioms, but Isabelle will remind you that this
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   217
theorem has the hidden hypothesis that the class is non-empty.%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   218
\end{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   219
\end{isabellebody}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   220
%%% Local Variables:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   221
%%% mode: latex
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   222
%%% TeX-master: "root"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   223
%%% End: