doc-src/TutorialI/Misc/Tree2.thy
author wenzelm
Wed, 09 Aug 2000 20:43:03 +0200
changeset 9561 714ad541a133
parent 9493 494f8cd34df7
child 9792 bbefb6ce5cb2
permissions -rw-r--r--
thms "atomize";
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     2
theory Tree2 = Tree:
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     3
(*>*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     4
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     5
text{*\noindent In Exercise~\ref{ex:Tree} we defined a function
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     6
\isa{flatten} from trees to lists. The straightforward version of
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     7
\isa{flatten} is based on \isa{\at} and is thus, like \isa{rev}, quadratic.
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     8
A linear time version of \isa{flatten} again reqires an extra
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     9
argument, the accumulator: *}
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    10
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    11
consts flatten2 :: "'a tree => 'a list => 'a list"
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    12
(*<*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    13
primrec
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    14
"flatten2 Tip xs = xs"
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    15
"flatten2 (Node l x r) xs = flatten2 l (x#(flatten2 r xs))"
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    16
(*>*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    17
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    18
text{*\noindent Define \isa{flatten2} and prove
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    19
*}
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    20
(*<*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    21
lemma [simp]: "!xs. flatten2 t xs = flatten t @ xs";
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    22
apply(induct_tac t);
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    23
by(auto);
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    24
(*>*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    25
lemma "flatten2 t [] = flatten t";
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    26
(*<*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    27
by(simp);
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    28
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    29
end
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    30
(*>*)