doc-src/TutorialI/Recdef/Nested1.thy
author wenzelm
Sun, 15 Oct 2000 19:50:35 +0200
changeset 10220 2a726de6e124
parent 10186 499637e8f2c6
child 10242 028f54cd2cc9
permissions -rw-r--r--
proper symbol markup with \isamath, \isatext; support sub/super scripts:
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
(*>*)
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     4
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     5
text{*\noindent
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
     6
Although the definition of @{term trev} is quite natural, we will have
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     7
overcome a minor difficulty in convincing Isabelle of is termination.
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
     8
It is precisely this difficulty that is the \textit{raison d'\^etre} of
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     9
this subsection.
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    10
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    11
Defining @{term trev} by \isacommand{recdef} rather than \isacommand{primrec}
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    12
simplifies matters because we are now free to use the recursion equation
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    13
suggested at the end of \S\ref{sec:nested-datatype}:
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    14
*};
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    15
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    16
recdef trev "measure size"
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    17
 "trev (Var x)    = Var x"
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    18
 "trev (App f ts) = App f (rev(map trev ts))";
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    19
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    20
text{*\noindent
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    21
Remember that function @{term size} is defined for each \isacommand{datatype}.
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    22
However, the definition does not succeed. Isabelle complains about an
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    23
unproved termination condition
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    24
@{term[display]"t : set ts --> size t < Suc (term_list_size ts)"}
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    25
where @{term set} returns the set of elements of a list
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9834
diff changeset
    26
and @{text"term_list_size :: term list \<Rightarrow> nat"} is an auxiliary
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9834
diff changeset
    27
function automatically defined by Isabelle
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    28
(when @{text term} was defined).  First we have to understand why the
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    29
recursive call of @{term trev} underneath @{term map} leads to the above
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    30
condition. The reason is that \isacommand{recdef} ``knows'' that @{term map}
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    31
will apply @{term trev} only to elements of @{term ts}. Thus the above
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    32
condition expresses that the size of the argument @{prop"t : set ts"} of any
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    33
recursive call of @{term trev} is strictly less than @{prop"size(App f ts) =
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    34
Suc(term_list_size ts)"}.  We will now prove the termination condition and
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    35
continue with our definition.  Below we return to the question of how
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    36
\isacommand{recdef} ``knows'' about @{term map}.
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    37
*};
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    38
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    39
(*<*)
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    40
end;
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    41
(*>*)