doc-src/TutorialI/Types/document/Axioms.tex
author nipkow
Fri, 30 May 2008 17:52:10 +0200
changeset 27027 63f0b638355c
parent 19288 85b684d3fdbd
child 31678 752f23a37240
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
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     2
\begin{isabellebody}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
     3
\def\isabellecontext{Axioms}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     4
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     5
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     6
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     7
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     8
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
     9
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    10
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    11
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    12
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    13
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    14
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    15
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    16
\endisadelimtheory
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    17
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    18
\isamarkupsubsection{Axioms%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    19
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    20
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    21
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    22
\begin{isamarkuptext}%
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    23
Attaching axioms to our classes lets us reason on the
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    24
level of classes.  The results will be applicable to all types in a class,
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    25
just as in axiomatic mathematics.  These ideas are demonstrated by means of
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    26
our ordering relations.%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    27
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    28
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    29
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    30
\isamarkupsubsubsection{Partial Orders%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    31
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    32
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    33
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    34
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    35
A \emph{partial order} is a subclass of \isa{ordrel}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    36
where certain axioms need to hold:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    37
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    38
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    39
\isacommand{axclass}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    40
\ parord\ {\isacharless}\ ordrel\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    41
refl{\isacharcolon}\ \ \ \ {\isachardoublequoteopen}x\ {\isacharless}{\isacharless}{\isacharequal}\ x{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    42
trans{\isacharcolon}\ \ \ {\isachardoublequoteopen}{\isasymlbrakk}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}{\isacharequal}\ z\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ z{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    43
antisym{\isacharcolon}\ {\isachardoublequoteopen}{\isasymlbrakk}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}{\isacharequal}\ x\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharequal}\ y{\isachardoublequoteclose}\isanewline
19288
85b684d3fdbd updated;
wenzelm
parents: 17187
diff changeset
    44
lt{\isacharunderscore}le{\isacharcolon}\ \ \ {\isachardoublequoteopen}x\ {\isacharless}{\isacharless}\ y\ {\isacharequal}\ {\isacharparenleft}x\ {\isacharless}{\isacharless}{\isacharequal}\ y\ {\isasymand}\ x\ {\isasymnoteq}\ y{\isacharparenright}{\isachardoublequoteclose}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    45
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    46
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    47
The first three axioms are the familiar ones, and the final one
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    48
requires that \isa{{\isacharless}{\isacharless}} and \isa{{\isacharless}{\isacharless}{\isacharequal}} are related as expected.
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    49
Note that behind the scenes, Isabelle has restricted the axioms to class
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    50
\isa{parord}. For example, the axiom \isa{refl} really is
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    51
\isa{{\isacharparenleft}{\isacharquery}x{\isasymColon}{\isacharquery}{\isacharprime}a{\isasymColon}parord{\isacharparenright}\ {\isacharless}{\isacharless}{\isacharequal}\ {\isacharquery}x}.
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    52
19288
85b684d3fdbd updated;
wenzelm
parents: 17187
diff changeset
    53
We have not made \isa{lt{\isacharunderscore}le} a global definition because it would
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10878
diff changeset
    54
fix once and for all that \isa{{\isacharless}{\isacharless}} is defined in terms of \isa{{\isacharless}{\isacharless}{\isacharequal}} and
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10878
diff changeset
    55
never the other way around. Below you will see why we want to avoid this
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
    56
asymmetry. The drawback of our choice is that
10420
ef006735bee8 *** empty log message ***
nipkow
parents: 10397
diff changeset
    57
we need to define both \isa{{\isacharless}{\isacharless}{\isacharequal}} and \isa{{\isacharless}{\isacharless}} for each instance.
ef006735bee8 *** empty log message ***
nipkow
parents: 10397
diff changeset
    58
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    59
We can now prove simple theorems in this abstract setting, for example
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    60
that \isa{{\isacharless}{\isacharless}} is not symmetric:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    61
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    62
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    63
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    64
\ {\isacharbrackleft}simp{\isacharbrackright}{\isacharcolon}\ {\isachardoublequoteopen}{\isacharparenleft}x{\isacharcolon}{\isacharcolon}{\isacharprime}a{\isacharcolon}{\isacharcolon}parord{\isacharparenright}\ {\isacharless}{\isacharless}\ y\ {\isasymLongrightarrow}\ {\isacharparenleft}{\isasymnot}\ y\ {\isacharless}{\isacharless}\ x{\isacharparenright}\ {\isacharequal}\ True{\isachardoublequoteclose}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    65
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    66
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    67
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    68
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    69
\isatagproof
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    70
%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    71
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    72
\noindent
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    73
The conclusion is not just \isa{{\isasymnot}\ y\ {\isacharless}{\isacharless}\ x} because the 
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    74
simplifier's preprocessor (see \S\ref{sec:simp-preprocessor})
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    75
would turn it into \isa{{\isacharparenleft}y\ {\isacharless}{\isacharless}\ x{\isacharparenright}\ {\isacharequal}\ False}, yielding
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    76
a nonterminating rewrite rule.  
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    77
(It would be used to try to prove its own precondition \emph{ad
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    78
    infinitum}.)
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    79
In the form above, the rule is useful.
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    80
The type constraint is necessary because otherwise Isabelle would only assume
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    81
\isa{{\isacharprime}a{\isacharcolon}{\isacharcolon}ordrel} (as required in the type of \isa{{\isacharless}{\isacharless}}), 
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    82
when the proposition is not a theorem.  The proof is easy:%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
    83
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    84
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    85
\isacommand{by}\isamarkupfalse%
19288
85b684d3fdbd updated;
wenzelm
parents: 17187
diff changeset
    86
{\isacharparenleft}simp\ add{\isacharcolon}\ lt{\isacharunderscore}le\ antisym{\isacharparenright}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    87
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    88
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    89
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    90
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    91
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
    92
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    93
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    94
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    95
We could now continue in this vein and develop a whole theory of
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    96
results about partial orders. Eventually we will want to apply these results
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    97
to concrete types, namely the instances of the class. Thus we first need to
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    98
prove that the types in question, for example \isa{bool}, are indeed
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
    99
instances of \isa{parord}:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   100
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   101
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   102
\isacommand{instance}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   103
\ bool\ {\isacharcolon}{\isacharcolon}\ parord\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   104
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   105
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   106
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   107
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   108
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   109
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   110
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   111
\ intro{\isacharunderscore}classes%
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   112
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   113
\noindent
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   114
This time \isa{intro{\isacharunderscore}classes} leaves us with the four axioms,
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   115
specialized to type \isa{bool}, as subgoals:
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   116
\begin{isabelle}%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   117
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}x{\isasymColon}bool{\isachardot}\ x\ {\isacharless}{\isacharless}{\isacharequal}\ x\isanewline
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   118
\ {\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
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   119
\ {\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
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   120
\ {\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}%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   121
\end{isabelle}
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   122
Fortunately, the proof is easy for \isa{blast}
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   123
once we have unfolded the definitions
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   124
of \isa{{\isacharless}{\isacharless}} and \isa{{\isacharless}{\isacharless}{\isacharequal}} at type \isa{bool}:%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   125
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   126
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   127
\isacommand{apply}\isamarkupfalse%
19288
85b684d3fdbd updated;
wenzelm
parents: 17187
diff changeset
   128
{\isacharparenleft}simp{\isacharunderscore}all\ {\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}use{\isacharparenright}\ only{\isacharcolon}\ le{\isacharunderscore}bool{\isacharunderscore}def\ lt{\isacharunderscore}bool{\isacharunderscore}def{\isacharparenright}\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   129
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   130
{\isacharparenleft}blast{\isacharcomma}\ blast{\isacharcomma}\ blast{\isacharcomma}\ blast{\isacharparenright}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   131
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   132
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   133
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   134
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   135
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   136
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   137
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   138
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   139
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   140
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
   141
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   142
We can now apply our single lemma above in the context of booleans:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   143
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   144
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   145
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   146
\ {\isachardoublequoteopen}{\isacharparenleft}P{\isacharcolon}{\isacharcolon}bool{\isacharparenright}\ {\isacharless}{\isacharless}\ Q\ {\isasymLongrightarrow}\ {\isasymnot}{\isacharparenleft}Q\ {\isacharless}{\isacharless}\ P{\isacharparenright}{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   147
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   148
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   149
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   150
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   151
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   152
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   153
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   154
\ simp%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   155
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   156
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   157
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   158
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   159
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   160
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   161
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   162
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   163
\noindent
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   164
The effect is not stunning, but it demonstrates the principle.  It also shows
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   165
that tools like the simplifier can deal with generic rules.
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   166
The main advantage of the axiomatic method is that
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   167
theorems can be proved in the abstract and freely reused for each instance.%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   168
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   169
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   170
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   171
\isamarkupsubsubsection{Linear Orders%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   172
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   173
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   174
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   175
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   176
If any two elements of a partial order are comparable it is a
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   177
\textbf{linear} or \textbf{total} order:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   178
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   179
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   180
\isacommand{axclass}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   181
\ linord\ {\isacharless}\ parord\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   182
linear{\isacharcolon}\ {\isachardoublequoteopen}x\ {\isacharless}{\isacharless}{\isacharequal}\ y\ {\isasymor}\ y\ {\isacharless}{\isacharless}{\isacharequal}\ x{\isachardoublequoteclose}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   183
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   184
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   185
By construction, \isa{linord} inherits all axioms from \isa{parord}.
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10878
diff changeset
   186
Therefore we can show that linearity can be expressed in terms of \isa{{\isacharless}{\isacharless}}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   187
as follows:%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   188
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   189
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   190
\isacommand{lemma}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   191
\ {\isachardoublequoteopen}{\isasymAnd}x{\isacharcolon}{\isacharcolon}{\isacharprime}a{\isacharcolon}{\isacharcolon}linord{\isachardot}\ x\ {\isacharless}{\isacharless}\ y\ {\isasymor}\ x\ {\isacharequal}\ y\ {\isasymor}\ y\ {\isacharless}{\isacharless}\ x{\isachardoublequoteclose}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   192
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   193
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   194
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   195
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   196
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   197
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   198
\isacommand{apply}\isamarkupfalse%
19288
85b684d3fdbd updated;
wenzelm
parents: 17187
diff changeset
   199
{\isacharparenleft}simp\ add{\isacharcolon}\ lt{\isacharunderscore}le{\isacharparenright}\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   200
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   201
{\isacharparenleft}insert\ linear{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   202
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   203
\ blast\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   204
\isacommand{done}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   205
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   206
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   207
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   208
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   209
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   210
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   211
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   212
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   213
\begin{isamarkuptext}%
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   214
Linear orders are an example of subclassing\index{subclasses}
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   215
by construction, which is the most
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   216
common case.  Subclass relationships can also be proved.  
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   217
This is the topic of the following
10654
458068404143 *** empty log message ***
nipkow
parents: 10645
diff changeset
   218
paragraph.%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   219
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   220
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   221
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   222
\isamarkupsubsubsection{Strict Orders%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   223
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   224
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   225
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   226
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   227
An alternative axiomatization of partial orders takes \isa{{\isacharless}{\isacharless}} rather than
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   228
\isa{{\isacharless}{\isacharless}{\isacharequal}} as the primary concept. The result is a \textbf{strict} order:%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   229
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   230
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   231
\isacommand{axclass}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   232
\ strord\ {\isacharless}\ ordrel\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   233
irrefl{\isacharcolon}\ \ \ \ \ {\isachardoublequoteopen}{\isasymnot}\ x\ {\isacharless}{\isacharless}\ x{\isachardoublequoteclose}\isanewline
19288
85b684d3fdbd updated;
wenzelm
parents: 17187
diff changeset
   234
lt{\isacharunderscore}trans{\isacharcolon}\ \ \ {\isachardoublequoteopen}{\isasymlbrakk}\ x\ {\isacharless}{\isacharless}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}\ z\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharless}{\isacharless}\ z{\isachardoublequoteclose}\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   235
le{\isacharunderscore}less{\isacharcolon}\ \ \ \ {\isachardoublequoteopen}x\ {\isacharless}{\isacharless}{\isacharequal}\ y\ {\isacharequal}\ {\isacharparenleft}x\ {\isacharless}{\isacharless}\ y\ {\isasymor}\ x\ {\isacharequal}\ y{\isacharparenright}{\isachardoublequoteclose}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   236
\begin{isamarkuptext}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   237
\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   238
It is well known that partial orders are the same as strict orders. Let us
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   239
prove one direction, namely that partial orders are a subclass of strict
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10878
diff changeset
   240
orders.%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   241
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   242
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   243
\isacommand{instance}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   244
\ parord\ {\isacharless}\ strord\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   245
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   246
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   247
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   248
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   249
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   250
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   251
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   252
\ intro{\isacharunderscore}classes%
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   253
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   254
\noindent
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   255
\begin{isabelle}%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   256
\ {\isadigit{1}}{\isachardot}\ {\isasymAnd}x{\isasymColon}{\isacharprime}a{\isachardot}\ {\isasymnot}\ x\ {\isacharless}{\isacharless}\ x\isanewline
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   257
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}{\isacharparenleft}x{\isasymColon}{\isacharprime}a{\isacharparenright}\ {\isacharparenleft}y{\isasymColon}{\isacharprime}a{\isacharparenright}\ z{\isasymColon}{\isacharprime}a{\isachardot}\ {\isasymlbrakk}x\ {\isacharless}{\isacharless}\ y{\isacharsemicolon}\ y\ {\isacharless}{\isacharless}\ z{\isasymrbrakk}\ {\isasymLongrightarrow}\ x\ {\isacharless}{\isacharless}\ z\isanewline
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   258
\ {\isadigit{3}}{\isachardot}\ {\isasymAnd}{\isacharparenleft}x{\isasymColon}{\isacharprime}a{\isacharparenright}\ y{\isasymColon}{\isacharprime}a{\isachardot}\ {\isacharparenleft}x\ {\isacharless}{\isacharless}{\isacharequal}\ y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}x\ {\isacharless}{\isacharless}\ y\ {\isasymor}\ x\ {\isacharequal}\ y{\isacharparenright}\isanewline
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   259
type\ variables{\isacharcolon}\isanewline
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   260
\isaindent{\ \ }{\isacharprime}a\ {\isacharcolon}{\isacharcolon}\ parord%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   261
\end{isabelle}
27027
63f0b638355c *** empty log message ***
nipkow
parents: 19288
diff changeset
   262
Because of \isa{{\isacharprime}a\ {\isacharcolon}{\isacharcolon}\ parord}, the three axioms of class \isa{strord}
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   263
are easily proved:%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   264
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   265
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   266
\ \ \isacommand{apply}\isamarkupfalse%
19288
85b684d3fdbd updated;
wenzelm
parents: 17187
diff changeset
   267
{\isacharparenleft}simp{\isacharunderscore}all\ {\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}use{\isacharparenright}\ add{\isacharcolon}\ lt{\isacharunderscore}le{\isacharparenright}\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   268
\ \isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   269
{\isacharparenleft}blast\ intro{\isacharcolon}\ trans\ antisym{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   270
\isacommand{apply}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   271
{\isacharparenleft}blast\ intro{\isacharcolon}\ refl{\isacharparenright}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   272
\isacommand{done}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   273
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   274
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   275
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   276
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   277
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   278
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   279
\endisadelimproof
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   280
%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   281
\begin{isamarkuptext}%
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   282
The subclass relation must always be acyclic. Therefore Isabelle will
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   283
complain if you also prove the relationship \isa{strord\ {\isacharless}\ parord}.%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   284
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   285
\isamarkuptrue%
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   286
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   287
\isamarkupsubsubsection{Multiple Inheritance and Sorts%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   288
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   289
\isamarkuptrue%
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   290
%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   291
\begin{isamarkuptext}%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   292
A class may inherit from more than one direct superclass. This is called
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   293
\bfindex{multiple inheritance}.  For example, we could define
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   294
the classes of well-founded orderings and well-orderings:%
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   295
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   296
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   297
\isacommand{axclass}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   298
\ wford\ {\isacharless}\ parord\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   299
wford{\isacharcolon}\ {\isachardoublequoteopen}wf\ {\isacharbraceleft}{\isacharparenleft}y{\isacharcomma}x{\isacharparenright}{\isachardot}\ y\ {\isacharless}{\isacharless}\ x{\isacharbraceright}{\isachardoublequoteclose}\isanewline
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   300
\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   301
\isacommand{axclass}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   302
\ wellord\ {\isacharless}\ linord{\isacharcomma}\ wford%
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   303
\begin{isamarkuptext}%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   304
\noindent
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   305
The last line expresses the usual definition: a well-ordering is a linear
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   306
well-founded ordering. The result is the subclass diagram in
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   307
Figure~\ref{fig:subclass}.
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   308
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   309
\begin{figure}[htbp]
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   310
\[
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   311
\begin{array}{r@ {}r@ {}c@ {}l@ {}l}
12815
wenzelm
parents: 12332
diff changeset
   312
& & \isa{type}\\
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   313
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   314
& & \isa{ordrel}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   315
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   316
& & \isa{strord}\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   317
& & |\\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   318
& & \isa{parord} \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   319
& / & & \backslash \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   320
\isa{linord} & & & & \isa{wford} \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   321
& \backslash & & / \\
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   322
& & \isa{wellord}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   323
\end{array}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   324
\]
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   325
\caption{Subclass Diagram}
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   326
\label{fig:subclass}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   327
\end{figure}
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   328
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   329
Since class \isa{wellord} does not introduce any new axioms, it can simply
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   330
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
   331
the fly: the expression $\{C@1,\dots,C@n\}$, where the $C@i$ are classes,
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   332
represents the intersection of the $C@i$. Such an expression is called a
11428
332347b9b942 tidying the index
paulson
parents: 11196
diff changeset
   333
\textbf{sort},\index{sorts} and sorts can appear in most places where we have only shown
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   334
classes so far, for example in type constraints: \isa{{\isacharprime}a{\isacharcolon}{\isacharcolon}{\isacharbraceleft}linord{\isacharcomma}wford{\isacharbraceright}}.
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10878
diff changeset
   335
In fact, \isa{{\isacharprime}a{\isacharcolon}{\isacharcolon}C} is short for \isa{{\isacharprime}a{\isacharcolon}{\isacharcolon}{\isacharbraceleft}C{\isacharbraceright}}.
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   336
However, we do not pursue this rarefied concept further.
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   337
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   338
This concludes our demonstration of type classes based on orderings.  We
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10395
diff changeset
   339
remind our readers that \isa{Main} contains a theory of
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   340
orderings phrased in terms of the usual \isa{{\isasymle}} and \isa{{\isacharless}}.
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   341
If possible, base your own ordering relations on this theory.%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   342
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   343
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   344
%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   345
\isamarkupsubsubsection{Inconsistencies%
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   346
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   347
\isamarkuptrue%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   348
%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   349
\begin{isamarkuptext}%
11494
23a118849801 revisions and indexing
paulson
parents: 11428
diff changeset
   350
The reader may be wondering what happens if we
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   351
attach an inconsistent set of axioms to a class. So far we have always
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   352
avoided to add new axioms to HOL for fear of inconsistencies and suddenly it
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   353
seems that we are throwing all caution to the wind. So why is there no
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   354
problem?
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   355
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   356
The point is that by construction, all type variables in the axioms of an
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   357
\isacommand{axclass} are automatically constrained with the class being
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   358
defined (as shown for axiom \isa{refl} above). These constraints are
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   359
always carried around and Isabelle takes care that they are never lost,
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   360
unless the type variable is instantiated with a type that has been shown to
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   361
belong to that class. Thus you may be able to prove \isa{False}
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   362
from your axioms, but Isabelle will remind you that this
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
   363
theorem has the hidden hypothesis that the class is non-empty.
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
   364
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
   365
Even if each individual class is consistent, intersections of (unrelated)
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
   366
classes readily become inconsistent in practice. Now we know this need not
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
   367
worry us.%
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   368
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   369
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   370
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   371
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   372
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   373
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   374
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   375
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   376
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   377
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   378
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   379
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   380
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   381
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   382
\endisadelimtheory
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   383
\end{isabellebody}%
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   384
%%% Local Variables:
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   385
%%% mode: latex
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   386
%%% TeX-master: "root"
bf33cbd76c05 *** empty log message ***
nipkow
parents:
diff changeset
   387
%%% End: