doc-src/TutorialI/Types/document/Typedefs.tex
author nik
Tue, 30 Aug 2011 14:29:39 +0200
changeset 44587 0f50f158eb57
parent 40406 313a24b66a8d
permissions -rw-r--r--
removed explicit reliance on Hilbert_Choice.Eps
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
     1
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
     2
\begin{isabellebody}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
     3
\def\isabellecontext{Typedefs}%
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
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    17
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    18
\isamarkupsection{Introducing New Types%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    19
}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    20
\isamarkuptrue%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    21
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    22
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    23
\label{sec:adv-typedef}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    24
For most applications, a combination of predefined types like \isa{bool} and
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
    25
\isa{{\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}} with recursive datatypes and records is quite sufficient. Very
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    26
occasionally you may feel the need for a more advanced type.  If you
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    27
are certain that your type is not definable by any of the
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    28
standard means, then read on.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    29
\begin{warn}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    30
  Types in HOL must be non-empty; otherwise the quantifier rules would be
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    31
  unsound, because $\exists x.\ x=x$ is a theorem.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    32
\end{warn}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    33
\end{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    34
\isamarkuptrue%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    35
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    36
\isamarkupsubsection{Declaring New Types%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    37
}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    38
\isamarkuptrue%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    39
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    40
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    41
\label{sec:typedecl}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    42
\index{types!declaring|(}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    43
\index{typedecl@\isacommand {typedecl} (command)}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    44
The most trivial way of introducing a new type is by a \textbf{type
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    45
declaration}:%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    46
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    47
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    48
\isacommand{typedecl}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
    49
\ my{\isaliteral{5F}{\isacharunderscore}}new{\isaliteral{5F}{\isacharunderscore}}type%
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    50
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    51
\noindent
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
    52
This does not define \isa{my{\isaliteral{5F}{\isacharunderscore}}new{\isaliteral{5F}{\isacharunderscore}}type} at all but merely introduces its
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    53
name. Thus we know nothing about this type, except that it is
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    54
non-empty. Such declarations without definitions are
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    55
useful if that type can be viewed as a parameter of the theory.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    56
A typical example is given in \S\ref{sec:VMC}, where we define a transition
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    57
relation over an arbitrary type of states.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    58
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    59
In principle we can always get rid of such type declarations by making those
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    60
types parameters of every other type, thus keeping the theory generic. In
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    61
practice, however, the resulting clutter can make types hard to read.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    62
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    63
If you are looking for a quick and dirty way of introducing a new type
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    64
together with its properties: declare the type and state its properties as
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    65
axioms. Example:%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    66
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    67
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    68
\isacommand{axioms}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    69
\isanewline
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
    70
just{\isaliteral{5F}{\isacharunderscore}}one{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6578697374733E}{\isasymexists}}x{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}my{\isaliteral{5F}{\isacharunderscore}}new{\isaliteral{5F}{\isacharunderscore}}type{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}y{\isaliteral{2E}{\isachardot}}\ x\ {\isaliteral{3D}{\isacharequal}}\ y{\isaliteral{22}{\isachardoublequoteclose}}%
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    71
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    72
\noindent
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    73
However, we strongly discourage this approach, except at explorative stages
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    74
of your development. It is extremely easy to write down contradictory sets of
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    75
axioms, in which case you will be able to prove everything but it will mean
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    76
nothing.  In the example above, the axiomatic approach is
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    77
unnecessary: a one-element type called \isa{unit} is already defined in HOL.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    78
\index{types!declaring|)}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    79
\end{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    80
\isamarkuptrue%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    81
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    82
\isamarkupsubsection{Defining New Types%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    83
}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    84
\isamarkuptrue%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    85
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    86
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    87
\label{sec:typedef}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    88
\index{types!defining|(}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    89
\index{typedecl@\isacommand {typedef} (command)|(}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    90
Now we come to the most general means of safely introducing a new type, the
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    91
\textbf{type definition}. All other means, for example
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    92
\isacommand{datatype}, are based on it. The principle is extremely simple:
12334
60bf75e157e4 *** empty log message ***
nipkow
parents: 12332
diff changeset
    93
any non-empty subset of an existing type can be turned into a new type.
60bf75e157e4 *** empty log message ***
nipkow
parents: 12332
diff changeset
    94
More precisely, the new type is specified to be isomorphic to some
60bf75e157e4 *** empty log message ***
nipkow
parents: 12332
diff changeset
    95
non-empty subset of an existing type.
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    96
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    97
Let us work a simple example, the definition of a three-element type.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    98
It is easily represented by the first three natural numbers:%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
    99
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   100
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   101
\isacommand{typedef}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   102
\ three\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{7B}{\isacharbraceleft}}{\isadigit{0}}{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}nat{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{2}}{\isaliteral{7D}{\isacharbraceright}}{\isaliteral{22}{\isachardoublequoteclose}}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   103
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   104
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   105
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   106
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   107
\isatagproof
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   108
%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   109
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   110
\noindent
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   111
In order to enforce that the representing set on the right-hand side is
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   112
non-empty, this definition actually starts a proof to that effect:
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   113
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   114
\ {\isadigit{1}}{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C6578697374733E}{\isasymexists}}x{\isaliteral{2E}{\isachardot}}\ x\ {\isaliteral{5C3C696E3E}{\isasymin}}\ {\isaliteral{7B}{\isacharbraceleft}}{\isadigit{0}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{2}}{\isaliteral{7D}{\isacharbraceright}}%
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   115
\end{isabelle}
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   116
Fortunately, this is easy enough to show, even \isa{auto} could do it.
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   117
In general, one has to provide a witness, in our case 0:%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   118
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   119
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   120
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   121
{\isaliteral{28}{\isacharparenleft}}rule{\isaliteral{5F}{\isacharunderscore}}tac\ x\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{0}}\ \isakeyword{in}\ exI{\isaliteral{29}{\isacharparenright}}\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   122
\isacommand{by}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   123
\ simp%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   124
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   125
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   126
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   127
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   128
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   129
\endisadelimproof
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   130
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   131
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   132
This type definition introduces the new type \isa{three} and asserts
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   133
that it is a copy of the set \isa{{\isaliteral{7B}{\isacharbraceleft}}{\isadigit{0}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{2}}{\isaliteral{7D}{\isacharbraceright}}}. This assertion
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   134
is expressed via a bijection between the \emph{type} \isa{three} and the
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   135
\emph{set} \isa{{\isaliteral{7B}{\isacharbraceleft}}{\isadigit{0}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{2}}{\isaliteral{7D}{\isacharbraceright}}}. To this end, the command declares the following
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   136
constants behind the scenes:
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   137
\begin{center}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   138
\begin{tabular}{rcl}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   139
\isa{three} &::& \isa{nat\ set} \\
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   140
\isa{Rep{\isaliteral{5F}{\isacharunderscore}}three} &::& \isa{three\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ nat}\\
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   141
\isa{Abs{\isaliteral{5F}{\isacharunderscore}}three} &::& \isa{nat\ {\isaliteral{5C3C52696768746172726F773E}{\isasymRightarrow}}\ three}
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   142
\end{tabular}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   143
\end{center}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   144
where constant \isa{three} is explicitly defined as the representing set:
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   145
\begin{center}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   146
\isa{three\ {\isaliteral{5C3C65717569763E}{\isasymequiv}}\ {\isaliteral{7B}{\isacharbraceleft}}{\isadigit{0}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{2}}{\isaliteral{7D}{\isacharbraceright}}}\hfill(\isa{three{\isaliteral{5F}{\isacharunderscore}}def})
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   147
\end{center}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   148
The situation is best summarized with the help of the following diagram,
12543
3e355f0f079f New type definition diagram
paulson
parents: 12473
diff changeset
   149
where squares denote types and the irregular region denotes a set:
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   150
\begin{center}
12627
08eee994bf99 updated;
wenzelm
parents: 12543
diff changeset
   151
\includegraphics[scale=.8]{typedef}
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   152
\end{center}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   153
Finally, \isacommand{typedef} asserts that \isa{Rep{\isaliteral{5F}{\isacharunderscore}}three} is
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   154
surjective on the subset \isa{three} and \isa{Abs{\isaliteral{5F}{\isacharunderscore}}three} and \isa{Rep{\isaliteral{5F}{\isacharunderscore}}three} are inverses of each other:
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   155
\begin{center}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   156
\begin{tabular}{@ {}r@ {\qquad\qquad}l@ {}}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   157
\isa{Rep{\isaliteral{5F}{\isacharunderscore}}three\ x\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three} & (\isa{Rep{\isaliteral{5F}{\isacharunderscore}}three}) \\
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   158
\isa{Abs{\isaliteral{5F}{\isacharunderscore}}three\ {\isaliteral{28}{\isacharparenleft}}Rep{\isaliteral{5F}{\isacharunderscore}}three\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ x} & (\isa{Rep{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}inverse}) \\
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   159
\isa{y\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ Rep{\isaliteral{5F}{\isacharunderscore}}three\ {\isaliteral{28}{\isacharparenleft}}Abs{\isaliteral{5F}{\isacharunderscore}}three\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ y} & (\isa{Abs{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}inverse})
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   160
\end{tabular}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   161
\end{center}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   162
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   163
From this example it should be clear what \isacommand{typedef} does
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   164
in general given a name (here \isa{three}) and a set
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   165
(here \isa{{\isaliteral{7B}{\isacharbraceleft}}{\isadigit{0}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{1}}{\isaliteral{2C}{\isacharcomma}}\ {\isadigit{2}}{\isaliteral{7D}{\isacharbraceright}}}).
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   166
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   167
Our next step is to define the basic functions expected on the new type.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   168
Although this depends on the type at hand, the following strategy works well:
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   169
\begin{itemize}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   170
\item define a small kernel of basic functions that can express all other
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   171
functions you anticipate.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   172
\item define the kernel in terms of corresponding functions on the
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   173
representing type using \isa{Abs} and \isa{Rep} to convert between the
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   174
two levels.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   175
\end{itemize}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   176
In our example it suffices to give the three elements of type \isa{three}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   177
names:%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   178
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   179
\isamarkuptrue%
27027
63f0b638355c *** empty log message ***
nipkow
parents: 17187
diff changeset
   180
\isacommand{definition}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   181
\ A\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ three\ \isakeyword{where}\ {\isaliteral{22}{\isachardoublequoteopen}}A\ {\isaliteral{5C3C65717569763E}{\isasymequiv}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three\ {\isadigit{0}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
27027
63f0b638355c *** empty log message ***
nipkow
parents: 17187
diff changeset
   182
\isacommand{definition}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   183
\ B\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ three\ \isakeyword{where}\ {\isaliteral{22}{\isachardoublequoteopen}}B\ {\isaliteral{5C3C65717569763E}{\isasymequiv}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three\ {\isadigit{1}}{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
27027
63f0b638355c *** empty log message ***
nipkow
parents: 17187
diff changeset
   184
\isacommand{definition}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   185
\ C\ {\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}\ three\ \isakeyword{where}\ {\isaliteral{22}{\isachardoublequoteopen}}C\ {\isaliteral{5C3C65717569763E}{\isasymequiv}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three\ {\isadigit{2}}{\isaliteral{22}{\isachardoublequoteclose}}%
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   186
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   187
So far, everything was easy. But it is clear that reasoning about \isa{three} will be hell if we have to go back to \isa{nat} every time. Thus our
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   188
aim must be to raise our level of abstraction by deriving enough theorems
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   189
about type \isa{three} to characterize it completely. And those theorems
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   190
should be phrased in terms of \isa{A}, \isa{B} and \isa{C}, not \isa{Abs{\isaliteral{5F}{\isacharunderscore}}three} and \isa{Rep{\isaliteral{5F}{\isacharunderscore}}three}. Because of the simplicity of the example,
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   191
we merely need to prove that \isa{A}, \isa{B} and \isa{C} are distinct
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   192
and that they exhaust the type.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   193
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   194
In processing our \isacommand{typedef} declaration, 
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   195
Isabelle proves several helpful lemmas. The first two
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   196
express injectivity of \isa{Rep{\isaliteral{5F}{\isacharunderscore}}three} and \isa{Abs{\isaliteral{5F}{\isacharunderscore}}three}:
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   197
\begin{center}
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   198
\begin{tabular}{@ {}r@ {\qquad}l@ {}}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   199
\isa{{\isaliteral{28}{\isacharparenleft}}Rep{\isaliteral{5F}{\isacharunderscore}}three\ x\ {\isaliteral{3D}{\isacharequal}}\ Rep{\isaliteral{5F}{\isacharunderscore}}three\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{3D}{\isacharequal}}\ y{\isaliteral{29}{\isacharparenright}}} & (\isa{Rep{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}inject}) \\
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   200
\begin{tabular}{@ {}l@ {}}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   201
\isa{{\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}x\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three{\isaliteral{3B}{\isacharsemicolon}}\ y\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three\ {\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}} \\
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   202
\isa{{\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{28}{\isacharparenleft}}Abs{\isaliteral{5F}{\isacharunderscore}}three\ x\ {\isaliteral{3D}{\isacharequal}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}x\ {\isaliteral{3D}{\isacharequal}}\ y{\isaliteral{29}{\isacharparenright}}}
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   203
\end{tabular} & (\isa{Abs{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}inject}) \\
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   204
\end{tabular}
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   205
\end{center}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   206
The following ones allow to replace some \isa{x{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}three} by
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   207
\isa{Abs{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{28}{\isacharparenleft}}y{\isaliteral{3A}{\isacharcolon}}{\isaliteral{3A}{\isacharcolon}}nat{\isaliteral{29}{\isacharparenright}}}, and conversely \isa{y} by \isa{Rep{\isaliteral{5F}{\isacharunderscore}}three\ x}:
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   208
\begin{center}
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   209
\begin{tabular}{@ {}r@ {\qquad}l@ {}}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   210
\isa{{\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}y\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three{\isaliteral{3B}{\isacharsemicolon}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}x{\isaliteral{2E}{\isachardot}}\ y\ {\isaliteral{3D}{\isacharequal}}\ Rep{\isaliteral{5F}{\isacharunderscore}}three\ x\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P{\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P} & (\isa{Rep{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}cases}) \\
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   211
\isa{{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C416E643E}{\isasymAnd}}y{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}x\ {\isaliteral{3D}{\isacharequal}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three\ y{\isaliteral{3B}{\isacharsemicolon}}\ y\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three{\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P} & (\isa{Abs{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}cases}) \\
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   212
\isa{{\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}y\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three{\isaliteral{3B}{\isacharsemicolon}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}x{\isaliteral{2E}{\isachardot}}\ P\ {\isaliteral{28}{\isacharparenleft}}Rep{\isaliteral{5F}{\isacharunderscore}}three\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P\ y} & (\isa{Rep{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}induct}) \\
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   213
\isa{{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C416E643E}{\isasymAnd}}y{\isaliteral{2E}{\isachardot}}\ y\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P\ {\isaliteral{28}{\isacharparenleft}}Abs{\isaliteral{5F}{\isacharunderscore}}three\ y{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P\ x} & (\isa{Abs{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}induct}) \\
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   214
\end{tabular}
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   215
\end{center}
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   216
These theorems are proved for any type definition, with \isa{three}
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   217
replaced by the name of the type in question.
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   218
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   219
Distinctness of \isa{A}, \isa{B} and \isa{C} follows immediately
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   220
if we expand their definitions and rewrite with the injectivity
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   221
of \isa{Abs{\isaliteral{5F}{\isacharunderscore}}three}:%
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   222
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   223
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   224
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   225
\ {\isaliteral{22}{\isachardoublequoteopen}}A\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ B\ {\isaliteral{5C3C616E643E}{\isasymand}}\ B\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ A\ {\isaliteral{5C3C616E643E}{\isasymand}}\ A\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ C\ {\isaliteral{5C3C616E643E}{\isasymand}}\ C\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ A\ {\isaliteral{5C3C616E643E}{\isasymand}}\ B\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ C\ {\isaliteral{5C3C616E643E}{\isasymand}}\ C\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ B{\isaliteral{22}{\isachardoublequoteclose}}\isanewline
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   226
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   227
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   228
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   229
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   230
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   231
\isatagproof
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   232
\isacommand{by}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   233
{\isaliteral{28}{\isacharparenleft}}simp\ add{\isaliteral{3A}{\isacharcolon}}\ Abs{\isaliteral{5F}{\isacharunderscore}}three{\isaliteral{5F}{\isacharunderscore}}inject\ A{\isaliteral{5F}{\isacharunderscore}}def\ B{\isaliteral{5F}{\isacharunderscore}}def\ C{\isaliteral{5F}{\isacharunderscore}}def\ three{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   234
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   235
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   236
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   237
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   238
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   239
\endisadelimproof
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   240
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   241
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   242
\noindent
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   243
Of course we rely on the simplifier to solve goals like \isa{{\isadigit{0}}\ {\isaliteral{5C3C6E6F7465713E}{\isasymnoteq}}\ {\isadigit{1}}}.
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   244
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   245
The fact that \isa{A}, \isa{B} and \isa{C} exhaust type \isa{three} is
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   246
best phrased as a case distinction theorem: if you want to prove \isa{P\ x}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   247
(where \isa{x} is of type \isa{three}) it suffices to prove \isa{P\ A},
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   248
\isa{P\ B} and \isa{P\ C}:%
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   249
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   250
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   251
\isacommand{lemma}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   252
\ three{\isaliteral{5F}{\isacharunderscore}}cases{\isaliteral{3A}{\isacharcolon}}\ {\isaliteral{22}{\isachardoublequoteopen}}{\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}\ P\ A{\isaliteral{3B}{\isacharsemicolon}}\ P\ B{\isaliteral{3B}{\isacharsemicolon}}\ P\ C\ {\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P\ x{\isaliteral{22}{\isachardoublequoteclose}}%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   253
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   254
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   255
\endisadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   256
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   257
\isatagproof
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   258
%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   259
\begin{isamarkuptxt}%
27319
6584901d694c updated generated file;
wenzelm
parents: 27027
diff changeset
   260
\noindent Again this follows easily using the induction principle stemming from the type definition:%
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   261
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   262
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   263
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   264
{\isaliteral{28}{\isacharparenleft}}induct{\isaliteral{5F}{\isacharunderscore}}tac\ x{\isaliteral{29}{\isacharparenright}}%
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   265
\begin{isamarkuptxt}%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   266
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   267
\ {\isadigit{1}}{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}y{\isaliteral{2E}{\isachardot}}\ {\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}P\ A{\isaliteral{3B}{\isacharsemicolon}}\ P\ B{\isaliteral{3B}{\isacharsemicolon}}\ P\ C{\isaliteral{3B}{\isacharsemicolon}}\ y\ {\isaliteral{5C3C696E3E}{\isasymin}}\ three{\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P\ {\isaliteral{28}{\isacharparenleft}}Abs{\isaliteral{5F}{\isacharunderscore}}three\ y{\isaliteral{29}{\isacharparenright}}%
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   268
\end{isabelle}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   269
Simplification with \isa{three{\isaliteral{5F}{\isacharunderscore}}def} leads to the disjunction \isa{y\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{0}}\ {\isaliteral{5C3C6F723E}{\isasymor}}\ y\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{1}}\ {\isaliteral{5C3C6F723E}{\isasymor}}\ y\ {\isaliteral{3D}{\isacharequal}}\ {\isadigit{2}}} which \isa{auto} separates into three
16353
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   270
subgoals, each of which is easily solved by simplification:%
94e565ded526 updated;
wenzelm
parents: 15481
diff changeset
   271
\end{isamarkuptxt}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   272
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   273
\isacommand{apply}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   274
{\isaliteral{28}{\isacharparenleft}}auto\ simp\ add{\isaliteral{3A}{\isacharcolon}}\ three{\isaliteral{5F}{\isacharunderscore}}def\ A{\isaliteral{5F}{\isacharunderscore}}def\ B{\isaliteral{5F}{\isacharunderscore}}def\ C{\isaliteral{5F}{\isacharunderscore}}def{\isaliteral{29}{\isacharparenright}}\isanewline
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   275
\isacommand{done}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   276
%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   277
\endisatagproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   278
{\isafoldproof}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   279
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   280
\isadelimproof
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   281
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   282
\endisadelimproof
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   283
%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   284
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   285
\noindent
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   286
This concludes the derivation of the characteristic theorems for
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   287
type \isa{three}.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   288
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   289
The attentive reader has realized long ago that the
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   290
above lengthy definition can be collapsed into one line:%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   291
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   292
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   293
\isacommand{datatype}\isamarkupfalse%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 27319
diff changeset
   294
\ better{\isaliteral{5F}{\isacharunderscore}}three\ {\isaliteral{3D}{\isacharequal}}\ A\ {\isaliteral{7C}{\isacharbar}}\ B\ {\isaliteral{7C}{\isacharbar}}\ C%
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   295
\begin{isamarkuptext}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   296
\noindent
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   297
In fact, the \isacommand{datatype} command performs internally more or less
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   298
the same derivations as we did, which gives you some idea what life would be
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   299
like without \isacommand{datatype}.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   300
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   301
Although \isa{three} could be defined in one line, we have chosen this
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   302
example to demonstrate \isacommand{typedef} because its simplicity makes the
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   303
key concepts particularly easy to grasp. If you would like to see a
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   304
non-trivial example that cannot be defined more directly, we recommend the
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12334
diff changeset
   305
definition of \emph{finite multisets} in the Library~\cite{HOL-Library}.
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   306
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   307
Let us conclude by summarizing the above procedure for defining a new type.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   308
Given some abstract axiomatic description $P$ of a type $ty$ in terms of a
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   309
set of functions $F$, this involves three steps:
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   310
\begin{enumerate}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   311
\item Find an appropriate type $\tau$ and subset $A$ which has the desired
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   312
  properties $P$, and make a type definition based on this representation.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   313
\item Define the required functions $F$ on $ty$ by lifting
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   314
analogous functions on the representation via $Abs_ty$ and $Rep_ty$.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   315
\item Prove that $P$ holds for $ty$ by lifting $P$ from the representation.
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   316
\end{enumerate}
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   317
You can now forget about the representation and work solely in terms of the
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   318
abstract functions $F$ and properties $P$.%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   319
\index{typedecl@\isacommand {typedef} (command)|)}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   320
\index{types!defining|)}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   321
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   322
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   323
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   324
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   325
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   326
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   327
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   328
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   329
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   330
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   331
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   332
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   333
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   334
%
05fc32a23b8b updated;
wenzelm
parents: 16353
diff changeset
   335
\endisadelimtheory
11898
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   336
\end{isabellebody}%
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   337
%%% Local Variables:
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   338
%%% mode: latex
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   339
%%% TeX-master: "root"
0844573f4518 *** empty log message ***
wenzelm
parents:
diff changeset
   340
%%% End: