| 24615 |      1 | (*  ID:         $Id$
 | 
|  |      2 |     Author:     Tobias Nipkow
 | 
|  |      3 |     Copyright   1994 TU Muenchen
 | 
|  |      4 | *)
 | 
|  |      5 | 
 | 
|  |      6 | header{*Quicksort*}
 | 
|  |      7 | 
 | 
|  |      8 | theory Quicksort
 | 
|  |      9 | imports Multiset
 | 
|  |     10 | begin
 | 
|  |     11 | 
 | 
|  |     12 | context linorder
 | 
|  |     13 | begin
 | 
|  |     14 | 
 | 
|  |     15 | function quicksort :: "'a list \<Rightarrow> 'a list" where
 | 
|  |     16 | "quicksort []     = []" |
 | 
| 25062 |     17 | "quicksort (x#xs) = quicksort([y\<leftarrow>xs. ~ x\<le>y]) @ [x] @ quicksort([y\<leftarrow>xs. x\<le>y])"
 | 
| 24615 |     18 | by pat_completeness auto
 | 
|  |     19 | 
 | 
|  |     20 | termination
 | 
|  |     21 | by (relation "measure size")
 | 
|  |     22 |    (auto simp: length_filter_le[THEN order_class.le_less_trans])
 | 
|  |     23 | 
 | 
|  |     24 | end
 | 
|  |     25 | context linorder
 | 
|  |     26 | begin
 | 
|  |     27 | 
 | 
|  |     28 | lemma quicksort_permutes [simp]:
 | 
|  |     29 |   "multiset_of (quicksort xs) = multiset_of xs"
 | 
|  |     30 | by (induct xs rule: quicksort.induct) (auto simp: union_ac)
 | 
|  |     31 | 
 | 
|  |     32 | lemma set_quicksort [simp]: "set (quicksort xs) = set xs"
 | 
|  |     33 | by(simp add: set_count_greater_0)
 | 
|  |     34 | 
 | 
|  |     35 | lemma sorted_quicksort: "sorted(quicksort xs)"
 | 
|  |     36 | apply (induct xs rule: quicksort.induct)
 | 
|  |     37 |  apply simp
 | 
|  |     38 | apply (simp add:sorted_Cons sorted_append not_le less_imp_le)
 | 
|  |     39 | apply (metis leD le_cases le_less_trans)
 | 
|  |     40 | done
 | 
|  |     41 | 
 | 
|  |     42 | end
 | 
|  |     43 | 
 | 
|  |     44 | end
 |