doc-src/Exercises/2002/a5/a5.thy
changeset 15891 260090b54ef9
parent 15890 ff6787d730d5
child 15892 153541e29155
equal deleted inserted replaced
15890:ff6787d730d5 15891:260090b54ef9
     1 (*<*)
       
     2 theory a5 = Main:
       
     3 (*>*)
       
     4 
       
     5 subsection {* Merge sort *}
       
     6 
       
     7 text {* Implement \emph{merge sort}: a list is sorted by splitting it
       
     8 into two lists, sorting them separately, and merging the results.
       
     9 
       
    10 With the help of @{text recdef} define two functions
       
    11 *}
       
    12 
       
    13 consts merge :: "nat list \<times> nat list \<Rightarrow> nat list"
       
    14        msort :: "nat list \<Rightarrow> nat list"
       
    15 
       
    16 text {* and show *}
       
    17 
       
    18 theorem "sorted (msort xs)"
       
    19 (*<*)oops(*>*)
       
    20 
       
    21 theorem "count (msort xs) x = count xs x"
       
    22 (*<*)oops(*>*)
       
    23 
       
    24 text {* where @{term sorted} and @{term count} are defined as in
       
    25 section~\ref{psv2002a2}.
       
    26 
       
    27 Hints:
       
    28 \begin{itemize}
       
    29 \item For @{text recdef} see section~3.5 of \cite{isabelle-tutorial}.
       
    30 
       
    31 \item To split a list into two halves of almost equal length you can
       
    32 use the functions \mbox{@{text "n div 2"}}, @{term take} und @{term drop},
       
    33 where @{term "take n xs"} returns the first @{text n} elements of
       
    34 @{text xs} and @{text "drop n xs"} the remainder.
       
    35 
       
    36 \item Here are some potentially useful lemmas:\\
       
    37   @{text "linorder_not_le:"} @{thm linorder_not_le [no_vars]}\\
       
    38   @{text "order_less_le:"} @{thm order_less_le [no_vars]}\\
       
    39   @{text "min_def:"} @{thm min_def [no_vars]}
       
    40 \end{itemize}
       
    41 *}
       
    42 
       
    43 (*<*)
       
    44 end 
       
    45 (*>*)