doc-src/TutorialI/Recdef/document/Nested1.tex
author boehmes
Wed, 12 May 2010 23:54:00 +0200
changeset 36896 c030819254d3
parent 17187 45bee2f6e61f
permissions -rw-r--r--
use proper context operations (for fresh names of type and term variables, and for hypothetical definitions), monomorphize theorems (instead of terms, necessary for hypothetical definitions made during lambda lifting)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     1
%
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     2
\begin{isabellebody}%
10267
325ead6d9457 updated;
wenzelm
parents: 10186
diff changeset
     3
\def\isabellecontext{Nested{\isadigit{1}}}%
17056
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
     4
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
     5
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
     6
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
     7
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
     8
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
     9
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    10
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    11
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    12
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    13
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    14
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    15
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    16
\endisadelimtheory
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9933
diff changeset
    17
%
9698
f0740137a65d updated;
wenzelm
parents:
diff changeset
    18
\begin{isamarkuptext}%
f0740137a65d updated;
wenzelm
parents:
diff changeset
    19
\noindent
11277
a2bff98d6e5d *** empty log message ***
nipkow
parents: 10878
diff changeset
    20
Although the definition of \isa{trev} below is quite natural, we will have
10878
b254d5ad6dd4 auto update
paulson
parents: 10267
diff changeset
    21
to overcome a minor difficulty in convincing Isabelle of its termination.
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9722
diff changeset
    22
It is precisely this difficulty that is the \textit{raison d'\^etre} of
9698
f0740137a65d updated;
wenzelm
parents:
diff changeset
    23
this subsection.
f0740137a65d updated;
wenzelm
parents:
diff changeset
    24
f0740137a65d updated;
wenzelm
parents:
diff changeset
    25
Defining \isa{trev} by \isacommand{recdef} rather than \isacommand{primrec}
f0740137a65d updated;
wenzelm
parents:
diff changeset
    26
simplifies matters because we are now free to use the recursion equation
f0740137a65d updated;
wenzelm
parents:
diff changeset
    27
suggested at the end of \S\ref{sec:nested-datatype}:%
f0740137a65d updated;
wenzelm
parents:
diff changeset
    28
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    29
\isamarkuptrue%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    30
\isacommand{recdef}\isamarkupfalse%
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    31
\ trev\ {\isachardoublequoteopen}measure\ size{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    32
\ {\isachardoublequoteopen}trev\ {\isacharparenleft}Var\ x{\isacharparenright}\ \ \ \ {\isacharequal}\ Var\ x{\isachardoublequoteclose}\isanewline
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    33
\ {\isachardoublequoteopen}trev\ {\isacharparenleft}App\ f\ ts{\isacharparenright}\ {\isacharequal}\ App\ f\ {\isacharparenleft}rev{\isacharparenleft}map\ trev\ ts{\isacharparenright}{\isacharparenright}{\isachardoublequoteclose}%
11636
wenzelm
parents: 11627
diff changeset
    34
\begin{isamarkuptext}%
wenzelm
parents: 11627
diff changeset
    35
\noindent
wenzelm
parents: 11627
diff changeset
    36
Remember that function \isa{size} is defined for each \isacommand{datatype}.
wenzelm
parents: 11627
diff changeset
    37
However, the definition does not succeed. Isabelle complains about an
wenzelm
parents: 11627
diff changeset
    38
unproved termination condition
wenzelm
parents: 11627
diff changeset
    39
\begin{isabelle}%
wenzelm
parents: 11627
diff changeset
    40
\ \ \ \ \ t\ {\isasymin}\ set\ ts\ {\isasymlongrightarrow}\ size\ t\ {\isacharless}\ Suc\ {\isacharparenleft}term{\isacharunderscore}list{\isacharunderscore}size\ ts{\isacharparenright}%
wenzelm
parents: 11627
diff changeset
    41
\end{isabelle}
wenzelm
parents: 11627
diff changeset
    42
where \isa{set} returns the set of elements of a list
wenzelm
parents: 11627
diff changeset
    43
and \isa{term{\isacharunderscore}list{\isacharunderscore}size\ {\isacharcolon}{\isacharcolon}\ term\ list\ {\isasymRightarrow}\ nat} is an auxiliary
wenzelm
parents: 11627
diff changeset
    44
function automatically defined by Isabelle
wenzelm
parents: 11627
diff changeset
    45
(while processing the declaration of \isa{term}).  Why does the
wenzelm
parents: 11627
diff changeset
    46
recursive call of \isa{trev} lead to this
wenzelm
parents: 11627
diff changeset
    47
condition?  Because \isacommand{recdef} knows that \isa{map}
wenzelm
parents: 11627
diff changeset
    48
will apply \isa{trev} only to elements of \isa{ts}. Thus the 
wenzelm
parents: 11627
diff changeset
    49
condition expresses that the size of the argument \isa{t\ {\isasymin}\ set\ ts} of any
wenzelm
parents: 11627
diff changeset
    50
recursive call of \isa{trev} is strictly less than \isa{size\ {\isacharparenleft}App\ f\ ts{\isacharparenright}},
wenzelm
parents: 11627
diff changeset
    51
which equals \isa{Suc\ {\isacharparenleft}term{\isacharunderscore}list{\isacharunderscore}size\ ts{\isacharparenright}}.  We will now prove the termination condition and
wenzelm
parents: 11627
diff changeset
    52
continue with our definition.  Below we return to the question of how
12491
e28870d8b223 *** empty log message ***
nipkow
parents: 11866
diff changeset
    53
\isacommand{recdef} knows about \isa{map}.
e28870d8b223 *** empty log message ***
nipkow
parents: 11866
diff changeset
    54
e28870d8b223 *** empty log message ***
nipkow
parents: 11866
diff changeset
    55
The termination condition is easily proved by induction:%
11636
wenzelm
parents: 11627
diff changeset
    56
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
    57
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    58
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    59
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    60
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    61
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    62
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    63
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    64
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    65
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    66
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    67
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    68
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    69
%
05fc32a23b8b updated;
wenzelm
parents: 13778
diff changeset
    70
\endisadelimtheory
11636
wenzelm
parents: 11627
diff changeset
    71
\end{isabellebody}%
9698
f0740137a65d updated;
wenzelm
parents:
diff changeset
    72
%%% Local Variables:
f0740137a65d updated;
wenzelm
parents:
diff changeset
    73
%%% mode: latex
f0740137a65d updated;
wenzelm
parents:
diff changeset
    74
%%% TeX-master: "root"
f0740137a65d updated;
wenzelm
parents:
diff changeset
    75
%%% End: