src/HOL/ex/Bubblesort.thy
author wenzelm
Tue, 05 Nov 2019 14:16:16 +0100
changeset 71046 b8aeeedf7e68
parent 68109 cebf36c14226
permissions -rw-r--r--
support for Linux user management;
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
61343
5b5656a63bd6 isabelle update_cartouches;
wenzelm
parents: 60515
diff changeset
     3
section \<open>Bubblesort\<close>
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     4
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     5
theory Bubblesort
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 66110
diff changeset
     6
imports "HOL-Library.Multiset"
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     7
begin
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
     8
61343
5b5656a63bd6 isabelle update_cartouches;
wenzelm
parents: 60515
diff changeset
     9
text\<open>This is \emph{a} version of bubblesort.\<close>
58644
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
66110
d59f9f696110 adapted to new simp lemmas
nipkow
parents: 63793
diff changeset
    48
apply (auto split: list.split)
58644
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)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    61
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    62
lemma set_bubblesort: "set (bubblesort xs) = set xs"
60515
484559628038 renamed multiset_of -> mset
nipkow
parents: 58889
diff changeset
    63
by(rule mset_bubblesort[THEN mset_eq_setD])
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    64
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    65
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
    66
apply(induction xs arbitrary: y ys z rule: bubble_min.induct)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    67
  apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    68
 apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    69
apply (fastforce split: list.splits if_splits dest!: sym[of "a#b" for a b])
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    70
done
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    71
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    72
lemma sorted_bubblesort: "sorted(bubblesort xs)"
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    73
apply(induction xs rule: bubblesort.induct)
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    74
  apply simp
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    75
 apply simp
68109
cebf36c14226 new def of sorted and sorted_wrt
nipkow
parents: 67479
diff changeset
    76
apply (fastforce simp: set_bubblesort split: list.split if_splits dest: bubble_min_min)
58644
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    77
done
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    78
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    79
end
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    80
8171ef293634 New example Bubblesort
nipkow
parents:
diff changeset
    81
end