| author | nipkow | 
| Mon, 11 Jun 2018 20:45:51 +0200 | |
| changeset 68415 | d74ba11680d4 | 
| parent 68109 | cebf36c14226 | 
| permissions | -rw-r--r-- | 
| 34055 | 1  | 
(* Title: HOL/ex/MergeSort.thy  | 
| 13201 | 2  | 
Author: Tobias Nipkow  | 
3  | 
Copyright 2002 TU Muenchen  | 
|
4  | 
*)  | 
|
5  | 
||
| 61343 | 6  | 
section\<open>Merge Sort\<close>  | 
| 15815 | 7  | 
|
8  | 
theory MergeSort  | 
|
| 
66453
 
cc19f7ca2ed6
session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
 
wenzelm 
parents: 
61343 
diff
changeset
 | 
9  | 
imports "HOL-Library.Multiset"  | 
| 15815 | 10  | 
begin  | 
| 13201 | 11  | 
|
| 29780 | 12  | 
context linorder  | 
13  | 
begin  | 
|
| 13201 | 14  | 
|
| 29780 | 15  | 
fun merge :: "'a list \<Rightarrow> 'a list \<Rightarrow> 'a list"  | 
16  | 
where  | 
|
17  | 
"merge (x#xs) (y#ys) =  | 
|
18  | 
(if x \<le> y then x # merge xs (y#ys) else y # merge (x#xs) ys)"  | 
|
19  | 
| "merge xs [] = xs"  | 
|
20  | 
| "merge [] ys = ys"  | 
|
| 13201 | 21  | 
|
| 60515 | 22  | 
lemma mset_merge [simp]:  | 
23  | 
"mset (merge xs ys) = mset xs + mset ys"  | 
|
| 
37076
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
24  | 
by (induct xs ys rule: merge.induct) (simp_all add: ac_simps)  | 
| 13201 | 25  | 
|
| 
37076
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
26  | 
lemma set_merge [simp]:  | 
| 
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
27  | 
"set (merge xs ys) = set xs \<union> set ys"  | 
| 
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
28  | 
by (induct xs ys rule: merge.induct) auto  | 
| 13201 | 29  | 
|
| 
37076
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
30  | 
lemma sorted_merge [simp]:  | 
| 
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
31  | 
"sorted (merge xs ys) \<longleftrightarrow> sorted xs \<and> sorted ys"  | 
| 68109 | 32  | 
by (induct xs ys rule: merge.induct) (auto simp add: ball_Un not_le less_le)  | 
| 13201 | 33  | 
|
| 29780 | 34  | 
fun msort :: "'a list \<Rightarrow> 'a list"  | 
35  | 
where  | 
|
36  | 
"msort [] = []"  | 
|
37  | 
| "msort [x] = [x]"  | 
|
38  | 
| "msort xs = merge (msort (take (size xs div 2) xs))  | 
|
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
30661 
diff
changeset
 | 
39  | 
(msort (drop (size xs div 2) xs))"  | 
| 13201 | 40  | 
|
| 
37076
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
41  | 
lemma sorted_msort:  | 
| 
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
42  | 
"sorted (msort xs)"  | 
| 
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
43  | 
by (induct xs rule: msort.induct) simp_all  | 
| 13201 | 44  | 
|
| 60515 | 45  | 
lemma mset_msort:  | 
46  | 
"mset (msort xs) = mset xs"  | 
|
| 
37076
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
47  | 
by (induct xs rule: msort.induct)  | 
| 68109 | 48  | 
(simp_all, metis append_take_drop_id mset.simps(2) mset_append)  | 
| 
37076
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
49  | 
|
| 
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
50  | 
theorem msort_sort:  | 
| 
 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 
haftmann 
parents: 
34055 
diff
changeset
 | 
51  | 
"sort = msort"  | 
| 60515 | 52  | 
by (rule ext, rule properties_for_sort) (fact mset_msort sorted_msort)+  | 
| 13201 | 53  | 
|
54  | 
end  | 
|
| 29780 | 55  | 
|
56  | 
end  |