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