src/HOL/ex/Bubblesort.thy
author nipkow
Fri, 19 Jun 2015 15:55:22 +0200
changeset 60515 484559628038
parent 58889 5b7a9633cfa8
child 61343 5b5656a63bd6
permissions -rw-r--r--
renamed multiset_of -> mset
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     1
(* Author: Tobias Nipkow *)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     2
58889
5b7a9633cfa8 modernized header uniformly as section;
wenzelm
parents: 58644
diff changeset
     3
section {* Bubblesort *}
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     4
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     5
theory Bubblesort
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     6
imports "~~/src/HOL/Library/Multiset"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     7
begin
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     8
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     9
text{* This is \emph{a} version of bubblesort. *}
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    10
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    11
context linorder
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    12
begin
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    13
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    14
fun bubble_min where
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    15
"bubble_min [] = []" |
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    16
"bubble_min [x] = [x]" |
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    17
"bubble_min (x#xs) =
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    18
  (case bubble_min xs of y#ys \<Rightarrow> if x>y then y#x#ys else x#y#ys)"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    19
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    20
lemma size_bubble_min: "size(bubble_min xs) = size xs"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    21
by(induction xs rule: bubble_min.induct) (auto split: list.split)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    22
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    23
lemma bubble_min_eq_Nil_iff[simp]: "bubble_min xs = [] \<longleftrightarrow> xs = []"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    24
by (metis length_0_conv size_bubble_min)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    25
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    26
lemma bubble_minD_size: "bubble_min (xs) = ys \<Longrightarrow> size xs = size ys"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    27
by(auto simp: size_bubble_min)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    28
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    29
function (sequential) bubblesort where
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    30
"bubblesort []  = []" |
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    31
"bubblesort [x] = [x]" |
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    32
"bubblesort xs  = (case bubble_min xs of y#ys \<Rightarrow> y # bubblesort ys)"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    33
by pat_completeness auto
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    34
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    35
termination
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    36
proof
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    37
  show "wf(measure size)" by simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    38
next
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    39
  fix x1 x2 y :: 'a fix xs ys :: "'a list"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    40
  show "bubble_min(x1#x2#xs) = y#ys \<Longrightarrow> (ys, x1#x2#xs) \<in> measure size"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    41
    by(auto simp: size_bubble_min dest!: bubble_minD_size split: list.splits if_splits)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    42
qed
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    43
60515
484559628038 renamed multiset_of -> mset
nipkow
parents: 58889
diff changeset
    44
lemma mset_bubble_min: "mset (bubble_min xs) = mset xs"
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    45
apply(induction xs rule: bubble_min.induct)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    46
  apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    47
 apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    48
apply (auto simp: add_eq_conv_ex split: list.split)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    49
done
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    50
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    51
lemma bubble_minD_mset:
60515
484559628038 renamed multiset_of -> mset
nipkow
parents: 58889
diff changeset
    52
  "bubble_min (xs) = ys \<Longrightarrow> mset xs = mset ys"
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    53
by(auto simp: mset_bubble_min)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    54
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    55
lemma mset_bubblesort:
60515
484559628038 renamed multiset_of -> mset
nipkow
parents: 58889
diff changeset
    56
  "mset (bubblesort xs) = mset xs"
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    57
apply(induction xs rule: bubblesort.induct)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    58
  apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    59
 apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    60
by(auto split: list.splits if_splits dest: bubble_minD_mset)
60515
484559628038 renamed multiset_of -> mset
nipkow
parents: 58889
diff changeset
    61
  (metis add_eq_conv_ex mset_bubble_min mset.simps(2))
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    62
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    63
lemma set_bubblesort: "set (bubblesort xs) = set xs"
60515
484559628038 renamed multiset_of -> mset
nipkow
parents: 58889
diff changeset
    64
by(rule mset_bubblesort[THEN mset_eq_setD])
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    65
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    66
lemma bubble_min_min: "bubble_min xs = y#ys \<Longrightarrow> z \<in> set ys \<Longrightarrow> y \<le> z"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    67
apply(induction xs arbitrary: y ys z rule: bubble_min.induct)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    68
  apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    69
 apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    70
apply (fastforce split: list.splits if_splits dest!: sym[of "a#b" for a b])
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    71
done
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    72
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    73
lemma sorted_bubblesort: "sorted(bubblesort xs)"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    74
apply(induction xs rule: bubblesort.induct)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    75
  apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    76
 apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    77
apply (fastforce simp: set_bubblesort split: list.split if_splits
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    78
  intro!: sorted.Cons dest: bubble_min_min)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    79
done
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    80
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    81
end
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    82
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    83
end