doc-src/TutorialI/Overview/LNCS/FP0.thy
author nipkow
Mon, 01 Jul 2002 15:33:03 +0200
changeset 13262 bbfc360db011
child 13439 2f98365f57a8
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13262
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     1
theory FP0 = PreList:
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     2
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     3
datatype 'a list = Nil                          ("[]")
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     4
                 | Cons 'a "'a list"            (infixr "#" 65)
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     5
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     6
consts app :: "'a list \<Rightarrow> 'a list \<Rightarrow> 'a list"   (infixr "@" 65)
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     7
       rev :: "'a list \<Rightarrow> 'a list"
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     8
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
     9
primrec
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    10
"[] @ ys       = ys"
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    11
"(x # xs) @ ys = x # (xs @ ys)"
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    12
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    13
primrec
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    14
"rev []        = []"
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    15
"rev (x # xs)  = (rev xs) @ (x # [])"
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    16
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    17
theorem rev_rev [simp]: "rev(rev xs) = xs"
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    18
(*<*)oops(*>*)
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    19
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    20
text{*
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    21
\begin{exercise}
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    22
Define a datatype of binary trees and a function @{term mirror}
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    23
that mirrors a binary tree by swapping subtrees recursively. Prove
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    24
@{prop"mirror(mirror t) = t"}.
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    25
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    26
Define a function @{term flatten} that flattens a tree into a list
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    27
by traversing it in infix order. Prove
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    28
@{prop"flatten(mirror t) = rev(flatten t)"}.
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    29
\end{exercise}
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    30
*}
bbfc360db011 *** empty log message ***
nipkow
parents:
diff changeset
    31
end