| author | wenzelm | 
| Wed, 21 Jun 2023 15:20:58 +0200 | |
| changeset 78188 | fd68b98de1f6 | 
| 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: 
61343diff
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: 
34055diff
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: 
34055diff
changeset | 26 | lemma set_merge [simp]: | 
| 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
changeset | 27 | "set (merge xs ys) = set xs \<union> set ys" | 
| 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
changeset | 28 | by (induct xs ys rule: merge.induct) auto | 
| 13201 | 29 | |
| 37076 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
changeset | 30 | lemma sorted_merge [simp]: | 
| 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
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: 
30661diff
changeset | 39 | (msort (drop (size xs div 2) xs))" | 
| 13201 | 40 | |
| 37076 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
changeset | 41 | lemma sorted_msort: | 
| 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
changeset | 42 | "sorted (msort xs)" | 
| 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
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: 
34055diff
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: 
34055diff
changeset | 49 | |
| 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
changeset | 50 | theorem msort_sort: | 
| 
4d57f872dc2c
modernized sorting algorithms; quicksort implements sort
 haftmann parents: 
34055diff
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 |