doc-src/TutorialI/Misc/Tree2.thy
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 13305 f88d0c363582
child 16417 9bc16273c2d4
permissions -rw-r--r--
A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller. the tactic has also changed and allows the abstaction over fuction occurences whose type is nat or int.
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
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9493
diff changeset
     6
@{term"flatten"} from trees to lists. The straightforward version of
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9493
diff changeset
     7
@{term"flatten"} is based on @{text"@"} and is thus, like @{term"rev"},
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9493
diff changeset
     8
quadratic. A linear time version of @{term"flatten"} again reqires an extra
9493
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
     9
argument, the accumulator: *}
494f8cd34df7 *** empty log message ***
nipkow
parents:
diff changeset
    10
13305
f88d0c363582 *** empty log message ***
nipkow
parents: 9792
diff changeset
    11
consts flatten2 :: "'a tree \<Rightarrow> 'a list \<Rightarrow> 'a list"
9493
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
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9493
diff changeset
    18
text{*\noindent Define @{term"flatten2"} and prove
9493
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
(*>*)