src/Doc/Tutorial/Recdef/Nested1.thy
author wenzelm
Wed, 12 Mar 2025 11:39:00 +0100
changeset 82265 4b875a4c83b0
parent 69505 cc2d676d5395
permissions -rw-r--r--
update for release;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 15905
diff changeset
     2
theory Nested1 imports Nested0 begin
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     3
(*>*)
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     4
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 56846
diff changeset
     5
text\<open>\noindent
11277
a2bff98d6e5d *** empty log message ***
nipkow
parents: 10885
diff changeset
     6
Although the definition of @{term trev} below is quite natural, we will have
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10242
diff changeset
     7
to overcome a minor difficulty in convincing Isabelle of its 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}:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 56846
diff changeset
    14
\<close>
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    15
11636
wenzelm
parents: 11626
diff changeset
    16
recdef (*<*)(permissive)(*>*)trev "measure size"
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    17
 "trev (Var x)    = Var x"
11626
0dbfb578bf75 recdef (permissive);
wenzelm
parents: 11494
diff changeset
    18
 "trev (App f ts) = App f (rev(map trev ts))"
9689
751fde5307e4 *** empty log message ***
nipkow
parents: 9645
diff changeset
    19
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 56846
diff changeset
    20
text\<open>\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
56846
9df717fef2bb renamed 'xxx_size' to 'size_xxx' for old datatype package
blanchet
parents: 48985
diff changeset
    24
@{prop[display]"t : set ts --> size t < Suc (size_term_list ts)"}
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    25
where @{term set} returns the set of elements of a list
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 67406
diff changeset
    26
and \<open>size_term_list :: term list \<Rightarrow> nat\<close> is an auxiliary
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9834
diff changeset
    27
function automatically defined by Isabelle
69505
cc2d676d5395 isabelle update_cartouches -t;
wenzelm
parents: 67406
diff changeset
    28
(while processing the declaration of \<open>term\<close>).  Why does the
15905
0a4cc9b113c7 introduced @{const ...} antiquotation
haftmann
parents: 12491
diff changeset
    29
recursive call of @{const trev} lead to this
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    30
condition?  Because \isacommand{recdef} knows that @{term map}
15905
0a4cc9b113c7 introduced @{const ...} antiquotation
haftmann
parents: 12491
diff changeset
    31
will apply @{const trev} only to elements of @{term ts}. Thus the 
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    32
condition expresses that the size of the argument @{prop"t : set ts"} of any
15905
0a4cc9b113c7 introduced @{const ...} antiquotation
haftmann
parents: 12491
diff changeset
    33
recursive call of @{const trev} is strictly less than @{term"size(App f ts)"},
56846
9df717fef2bb renamed 'xxx_size' to 'size_xxx' for old datatype package
blanchet
parents: 48985
diff changeset
    34
which equals @{term"Suc(size_term_list ts)"}.  We will now prove the termination condition and
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    35
continue with our definition.  Below we return to the question of how
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    36
\isacommand{recdef} knows about @{term map}.
12491
e28870d8b223 *** empty log message ***
nipkow
parents: 11636
diff changeset
    37
e28870d8b223 *** empty log message ***
nipkow
parents: 11636
diff changeset
    38
The termination condition is easily proved by induction:
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 56846
diff changeset
    39
\<close>
9645
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    40
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    41
(*<*)
11626
0dbfb578bf75 recdef (permissive);
wenzelm
parents: 11494
diff changeset
    42
end
9754
a123a64cadeb *** empty log message ***
nipkow
parents: 9689
diff changeset
    43
(*>*)