doc-src/TutorialI/Recdef/Nested1.thy
author nipkow
Mon, 28 Aug 2000 09:32:51 +0200
changeset 9689 751fde5307e4
parent 9645 20ae97cd2a16
child 9754 a123a64cadeb
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
     2
theory Nested1 = Nested0:;
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     3
(*>*)
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
     4
consts trev  :: "('a,'b)term => ('a,'b)term";
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     5
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     6
text{*\noindent
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     7
Although the definition of @{term"trev"} is quite natural, we will have
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     8
overcome a minor difficulty in convincing Isabelle of is termination.
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     9
It is precisely this difficulty that is the \textit{rasion d'\^etre} of
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    10
this subsection.
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    11
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    12
Defining @{term"trev"} by \isacommand{recdef} rather than \isacommand{primrec}
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    13
simplifies matters because we are now free to use the recursion equation
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    14
suggested at the end of \S\ref{sec:nested-datatype}:
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    15
*};
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    16
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    17
recdef trev "measure size"
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    18
 "trev (Var x) = Var x"
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    19
 "trev (App f ts) = App f (rev(map trev ts))";
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    20
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    21
text{*
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    22
FIXME: recdef should complain and generate unprovable termination condition!
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    23
moveto todo
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    24
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    25
Remember that function @{term"size"} is defined for each \isacommand{datatype}.
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    26
However, the definition does not succeed. Isabelle complains about an unproved termination
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    27
condition
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    28
\begin{quote}
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    29
@{term[display]"t : set ts --> size t < Suc (term_size ts)"}
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    30
\end{quote}
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    31
where @{term"set"} returns the set of elements of a list---no special knowledge of sets is
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    32
required in the following.
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    33
First we have to understand why the recursive call of @{term"trev"} underneath @{term"map"} leads
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    34
to the above condition. The reason is that \isacommand{recdef} ``knows'' that @{term"map"} will
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    35
apply @{term"trev"} only to elements of @{term"ts"}. Thus the above condition expresses that
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    36
the size of the argument @{term"t : set ts"} of any recursive call of @{term"trev"} is strictly
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    37
less than @{term"size(App f ts) = Suc(term_size ts)"}.
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    38
We will now prove the termination condition and continue with our definition.
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    39
Below we return to the question of how \isacommand{recdef} ``knows'' about @{term"map"}.
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    40
*};
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    41
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    42
(*<*)
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    43
end;
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    44
(*>*)