doc-src/TutorialI/Recdef/Nested1.thy
author nipkow
Tue, 05 Sep 2000 09:03:17 +0200
changeset 9834 109b11c4e77e
parent 9792 bbefb6ce5cb2
child 9933 9feb1e0c4cb3
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
(*>*)
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
     4
consts trev  :: "('a,'b)term \<Rightarrow> ('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.
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
     9
It is precisely this difficulty that is the \textit{raison d'\^etre} of
9645
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"
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    18
 "trev (Var x)    = Var x"
9645
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
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    21
text{*\noindent
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    22
Remember that function @{term"size"} is defined for each \isacommand{datatype}.
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    23
However, the definition does not succeed. Isabelle complains about an
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    24
unproved termination condition
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    25
@{term[display]"t : set ts --> size t < Suc (term_list_size ts)"}
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    26
where @{term"set"} returns the set of elements of a list (no special
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9754
diff changeset
    27
knowledge of sets is required in the following) and @{text"term_list_size ::
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    28
term list \<Rightarrow> nat"} is an auxiliary function automatically defined by Isabelle
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9754
diff changeset
    29
(when @{text"term"} was defined).  First we have to understand why the
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    30
recursive call of @{term"trev"} underneath @{term"map"} leads to the above
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    31
condition. The reason is that \isacommand{recdef} ``knows'' that @{term"map"}
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    32
will apply @{term"trev"} only to elements of @{term"ts"}. Thus the above
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    33
condition expresses that the size of the argument @{term"t : set ts"} of any
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    34
recursive call of @{term"trev"} is strictly less than @{term"size(App f ts) =
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    35
Suc(term_list_size ts)"}.  We will now prove the termination condition and
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    36
continue with our definition.  Below we return to the question of how
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    37
\isacommand{recdef} ``knows'' about @{term"map"}.
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    38
*};
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    39
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    40
(*<*)
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    41
end;
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    42
(*>*)