src/HOL/ex/Sorting_Algorithms_Examples.thy
author nipkow
Sun, 18 Nov 2018 09:51:41 +0100
changeset 69312 e0f68a507683
parent 69252 fc359b60121c
child 69597 ff784d5a5bfb
permissions -rw-r--r--
added and tuned lemmas
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69252
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     1
(*  Title:      HOL/ex/Sorting_Algorithms_Examples.thy
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     3
*)
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     4
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     5
theory Sorting_Algorithms_Examples
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     6
  imports Main "HOL-Library.Sorting_Algorithms"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     7
begin
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     8
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
     9
subsection \<open>Evaluation examples\<close>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    10
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    11
definition int_abs_reversed :: "int comparator"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    12
  where "int_abs_reversed = key abs (reversed default)"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    13
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    14
definition example_1 :: "int list"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    15
  where "example_1 = [65, 1705, -2322, 734, 4, (-17::int)]"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    16
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    17
definition example_2 :: "int list"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    18
  where "example_2 = [-3000..3000]"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    19
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    20
ML \<open>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    21
local
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    22
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    23
  val term_of_int_list = HOLogic.mk_list @{typ int}
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    24
    o map (HOLogic.mk_number @{typ int} o @{code integer_of_int});
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    25
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    26
  fun raw_sort (ctxt, ct, ks) = Thm.mk_binop @{cterm "Pure.eq :: int list \<Rightarrow> int list \<Rightarrow> prop"}
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    27
    ct (Thm.cterm_of ctxt (term_of_int_list ks));
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    28
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    29
  val (_, sort_oracle) = Context.>>> (Context.map_theory_result
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    30
    (Thm.add_oracle (@{binding sort}, raw_sort)));
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    31
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    32
in
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    33
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    34
  val sort_int_abs_reversed_conv = @{computation_conv "int list" terms: int_abs_reversed
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    35
    "sort :: int comparator \<Rightarrow> _"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    36
    "quicksort :: int comparator \<Rightarrow> _"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    37
    "mergesort :: int comparator \<Rightarrow> _"
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    38
    example_1 example_2
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    39
  } (fn ctxt => fn ct => fn ks => sort_oracle (ctxt, ks, ct))
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    40
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    41
end
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    42
\<close>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    43
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    44
declare [[code_timing]]
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    45
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    46
ML_val \<open>sort_int_abs_reversed_conv @{context}
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    47
  @{cterm "sort int_abs_reversed example_1"}\<close>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    48
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    49
ML_val \<open>sort_int_abs_reversed_conv @{context}
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    50
  @{cterm "quicksort int_abs_reversed example_1"}\<close>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    51
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    52
ML_val \<open>sort_int_abs_reversed_conv @{context}
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    53
  @{cterm "mergesort int_abs_reversed example_1"}\<close>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    54
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    55
ML_val \<open>sort_int_abs_reversed_conv @{context}
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    56
  @{cterm "sort int_abs_reversed example_2"}\<close>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    57
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    58
ML_val \<open>sort_int_abs_reversed_conv @{context}
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    59
  @{cterm "quicksort int_abs_reversed example_2"}\<close>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    60
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    61
ML_val \<open>sort_int_abs_reversed_conv @{context}
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    62
  @{cterm "mergesort int_abs_reversed example_2"}\<close>
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    63
fc359b60121c dedicated examples for sorting
haftmann
parents:
diff changeset
    64
end