doc-src/TutorialI/Datatype/document/Fundata.tex
author paulson
Fri, 23 Jun 2000 10:33:46 +0200
changeset 9110 40d759b9725f
parent 8771 026f37a86ea7
child 9145 9f7b8de5bfaf
permissions -rw-r--r--
added the allocator refinement proof
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     1
\begin{isabelle}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     2
\isacommand{datatype}~('a,'i)bigtree~=~Tip~|~Branch~'a~{"}'i~{\isasymRightarrow}~('a,'i)bigtree{"}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     3
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     4
\noindent Parameter \isa{'a} is the type of values stored in
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     5
the \isa{Branch}es of the tree, whereas \isa{'i} is the index
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     6
type over which the tree branches. If \isa{'i} is instantiated to
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     7
\isa{bool}, the result is a binary tree; if it is instantiated to
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     8
\isa{nat}, we have an infinitely branching tree because each node
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     9
has as many subtrees as there are natural numbers. How can we possibly
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    10
write down such a tree? Using functional notation! For example, the%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    11
\end{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    12
\isacommand{term}~{"}Branch~0~({\isasymlambda}i.~Branch~i~({\isasymlambda}n.~Tip)){"}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    13
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    14
\noindent of type \isa{(nat,nat)bigtree} is the tree whose
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8749
diff changeset
    15
root is labeled with 0 and whose $i$th subtree is labeled with $i$ and
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    16
has merely \isa{Tip}s as further subtrees.
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    17
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    18
Function \isa{map_bt} applies a function to all labels in a \isa{bigtree}:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    19
\end{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    20
\isacommand{consts}~map\_bt~::~{"}('a~{\isasymRightarrow}~'b)~{\isasymRightarrow}~('a,'i)bigtree~{\isasymRightarrow}~('b,'i)bigtree{"}\isanewline
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    21
\isacommand{primrec}\isanewline
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    22
{"}map\_bt~f~Tip~~~~~~~~~~=~Tip{"}\isanewline
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    23
{"}map\_bt~f~(Branch~a~F)~=~Branch~(f~a)~({\isasymlambda}i.~map\_bt~f~(F~i)){"}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    24
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    25
\noindent This is a valid \isacommand{primrec} definition because the
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    26
recursive calls of \isa{map_bt} involve only subtrees obtained from
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    27
\isa{F}, i.e.\ the left-hand side. Thus termination is assured.  The
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    28
seasoned functional programmer might have written \isa{map_bt~f~o~F} instead
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    29
of \isa{\isasymlambda{}i.~map_bt~f~(F~i)}, but the former is not accepted by
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    30
Isabelle because the termination proof is not as obvious since
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    31
\isa{map_bt} is only partially applied.
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    32
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    33
The following lemma has a canonical proof%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    34
\end{isamarkuptext}%
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8749
diff changeset
    35
\isacommand{lemma}~{"}map\_bt~(g~o~f)~T~=~map\_bt~g~(map\_bt~f~T){"}\isanewline
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    36
\isacommand{apply}(induct\_tac~{"}T{"},~auto)\isacommand{.}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    37
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    38
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    39
but it is worth taking a look at the proof state after the induction step
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    40
to understand what the presence of the function type entails:
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    41
\begin{isabellepar}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    42
~1.~map\_bt~g~(map\_bt~f~Tip)~=~map\_bt~(g~{\isasymcirc}~f)~Tip\isanewline
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    43
~2.~{\isasymAnd}a~F.\isanewline
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    44
~~~~~~{\isasymforall}x.~map\_bt~g~(map\_bt~f~(F~x))~=~map\_bt~(g~{\isasymcirc}~f)~(F~x)~{\isasymLongrightarrow}\isanewline
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    45
~~~~~~map\_bt~g~(map\_bt~f~(Branch~a~F))~=~map\_bt~(g~{\isasymcirc}~f)~(Branch~a~F)%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    46
\end{isabellepar}%%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    47
\end{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    48
\end{isabelle}%