doc-src/TutorialI/Recdef/Nested1.thy
author nipkow
Fri, 18 Aug 2000 11:14:23 +0200
changeset 9645 20ae97cd2a16
child 9689 751fde5307e4
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
(*<*)
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     2
theory Nested1 = Nested0:
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     3
(*>*)
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
     4
consts trev  :: "('a,'b)term => ('a,'b)term"
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}:
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    15
*}
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    16
ML"Prim.Add_recdef_congs [map_cong]";
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    17
ML"Prim.print_recdef_congs(Context.the_context())";
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    18
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    19
recdef trev "measure size"
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    20
 "trev (Var x) = Var x"
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    21
 "trev (App f ts) = App f (rev(map trev ts))";
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    22
ML"Prim.congs []";
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    23
congs map_cong;
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    24
thm trev.simps;
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    25
(*<*)ML"Pretty.setmargin 60"(*>*)
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    26
text{*
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    27
FIXME: recdef should complain and generate unprovable termination condition!
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    28
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    29
The point is that the above termination condition is unprovable because it
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    30
ignores some crucial information: the recursive call of @{term"trev"} will
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    31
not involve arbitrary terms but only those in @{term"ts"}. This is expressed
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    32
by theorem \isa{map\_cong}:
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    33
\begin{quote}
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    34
@{thm[display]"map_cong"}
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    35
\end{quote}
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    36
*}
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    37
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    38
(*<*)
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    39
end
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    40
(*>*)
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    41
20ae97cd2a16 *** empty log message ***
nipkow
parents:
diff changeset
    42