src/Doc/Tutorial/Misc/Tree2.thy
author haftmann
Sat, 19 Oct 2019 09:15:37 +0000
changeset 70902 cb161182ce7f
parent 69597 ff784d5a5bfb
permissions -rw-r--r--
generalized
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 13305
diff changeset
     2
theory Tree2 imports Tree begin
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     3
(*>*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     4
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
     5
text\<open>\noindent In Exercise~\ref{ex:Tree} we defined a function
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
     6
\<^term>\<open>flatten\<close> from trees to lists. The straightforward version of
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
     7
\<^term>\<open>flatten\<close> is based on \<open>@\<close> and is thus, like \<^term>\<open>rev\<close>,
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69505
diff changeset
     8
quadratic. A linear time version of \<^term>\<open>flatten\<close> again reqires an extra
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
     9
argument, the accumulator. Define\<close>
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 16417
diff changeset
    10
(*<*)primrec(*>*)flatten2 :: "'a tree \<Rightarrow> 'a list \<Rightarrow> 'a list"(*<*)where
f8537d69f514 *** empty log message ***
nipkow
parents: 16417
diff changeset
    11
"flatten2 Tip xs = xs" |
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    12
"flatten2 (Node l x r) xs = flatten2 l (x#(flatten2 r xs))"
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    13
(*>*)
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    14
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58860
diff changeset
    15
text\<open>\noindent and prove\<close>
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    16
(*<*)
67613
ce654b0e6d69 more symbols;
wenzelm
parents: 67406
diff changeset
    17
lemma [simp]: "\<forall>xs. flatten2 t xs = flatten t @ xs"
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 16417
diff changeset
    18
apply(induct_tac t)
58860
fee7cfa69c50 eliminated spurious semicolons;
wenzelm
parents: 48985
diff changeset
    19
by(auto)
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    20
(*>*)
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 16417
diff changeset
    21
lemma "flatten2 t [] = flatten t"
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    22
(*<*)
27015
f8537d69f514 *** empty log message ***
nipkow
parents: 16417
diff changeset
    23
by(simp)
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    24
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    25
end
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    26
(*>*)