src/Doc/Tutorial/Datatype/Fundata.thy
author wenzelm
Sat, 01 Nov 2014 14:20:38 +0100
changeset 58860 fee7cfa69c50
parent 58305 57752a91eec4
child 67406 23307fd33906
permissions -rw-r--r--
eliminated spurious semicolons;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     1
(*<*)
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 14188
diff changeset
     2
theory Fundata imports Main begin
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     3
(*>*)
58305
57752a91eec4 renamed 'datatype' to 'old_datatype'; 'datatype' is now alias for 'datatype_new'
blanchet
parents: 48985
diff changeset
     4
datatype (dead 'a,'i) bigtree = Tip | Br 'a "'i \<Rightarrow> ('a,'i)bigtree"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     5
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
     6
text{*\noindent
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
     7
Parameter @{typ"'a"} is the type of values stored in
10420
ef006735bee8 *** empty log message ***
nipkow
parents: 10171
diff changeset
     8
the @{term Br}anches of the tree, whereas @{typ"'i"} is the index
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
     9
type over which the tree branches. If @{typ"'i"} is instantiated to
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    10
@{typ"bool"}, the result is a binary tree; if it is instantiated to
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    11
@{typ"nat"}, we have an infinitely branching tree because each node
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    12
has as many subtrees as there are natural numbers. How can we possibly
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
    13
write down such a tree? Using functional notation! For example, the term
12631
wenzelm
parents: 11458
diff changeset
    14
@{term[display]"Br (0::nat) (\<lambda>i. Br i (\<lambda>n. Tip))"}
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 8771
diff changeset
    15
of type @{typ"(nat,nat)bigtree"} is the tree whose
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8745
diff changeset
    16
root is labeled with 0 and whose $i$th subtree is labeled with $i$ and
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    17
has merely @{term"Tip"}s as further subtrees.
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    18
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    19
Function @{term"map_bt"} applies a function to all labels in a @{text"bigtree"}:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    20
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    21
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 16417
diff changeset
    22
primrec map_bt :: "('a \<Rightarrow> 'b) \<Rightarrow> ('a,'i)bigtree \<Rightarrow> ('b,'i)bigtree"
f8537d69f514 *** empty log message ***
nipkow
parents: 16417
diff changeset
    23
where
f8537d69f514 *** empty log message ***
nipkow
parents: 16417
diff changeset
    24
"map_bt f Tip      = Tip" |
10420
ef006735bee8 *** empty log message ***
nipkow
parents: 10171
diff changeset
    25
"map_bt f (Br a F) = Br (f a) (\<lambda>i. map_bt f (F i))"
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    26
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    27
text{*\noindent This is a valid \isacommand{primrec} definition because the
14188
f471cd4c7282 *** empty log message ***
nipkow
parents: 13439
diff changeset
    28
recursive calls of @{term"map_bt"} involve only subtrees of
f471cd4c7282 *** empty log message ***
nipkow
parents: 13439
diff changeset
    29
@{term"F"}, which is itself a subterm of the left-hand side. Thus termination
f471cd4c7282 *** empty log message ***
nipkow
parents: 13439
diff changeset
    30
is assured.  The seasoned functional programmer might try expressing
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11309
diff changeset
    31
@{term"%i. map_bt f (F i)"} as @{term"map_bt f o F"}, which Isabelle 
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11309
diff changeset
    32
however will reject.  Applying @{term"map_bt"} to only one of its arguments
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11309
diff changeset
    33
makes the termination proof less obvious.
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    34
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 10795
diff changeset
    35
The following lemma has a simple proof by induction:  *}
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    36
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 58305
diff changeset
    37
lemma "map_bt (g o f) T = map_bt g (map_bt f T)"
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    38
apply(induct_tac T, simp_all)
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
    39
done
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 58305
diff changeset
    40
(*<*)lemma "map_bt (g o f) T = map_bt g (map_bt f T)"
10420
ef006735bee8 *** empty log message ***
nipkow
parents: 10171
diff changeset
    41
apply(induct_tac T, rename_tac[2] F)(*>*)
ef006735bee8 *** empty log message ***
nipkow
parents: 10171
diff changeset
    42
txt{*\noindent
13439
2f98365f57a8 *** empty log message ***
nipkow
parents: 12631
diff changeset
    43
Because of the function type, the proof state after induction looks unusual.
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10420
diff changeset
    44
Notice the quantified induction hypothesis:
10420
ef006735bee8 *** empty log message ***
nipkow
parents: 10171
diff changeset
    45
@{subgoals[display,indent=0]}
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    46
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    47
(*<*)
10420
ef006735bee8 *** empty log message ***
nipkow
parents: 10171
diff changeset
    48
oops
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    49
end
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    50
(*>*)