src/HOL/Data_Structures/Selection.thy
author nipkow
Wed, 06 Nov 2024 18:10:39 +0100
changeset 81357 21a493abde0f
parent 81291 d6daa049c1db
child 81465 42b0f923fd82
permissions -rw-r--r--
uniform name T_f for closed-form lemmas for function T_f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     1
(*
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     2
  File:    Data_Structures/Selection.thy
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     3
  Author:  Manuel Eberl, TU München
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     4
*)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     5
section \<open>The Median-of-Medians Selection Algorithm\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     6
theory Selection
75501
426afab39a55 insort renamings
nipkow
parents: 73526
diff changeset
     7
  imports Complex_Main Time_Funs Sorting
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     8
begin
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
     9
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    10
text \<open>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    11
  Note that there is significant overlap between this theory (which is intended mostly for the
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    12
  Functional Data Structures book) and the Median-of-Medians AFP entry.
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    13
\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    14
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    15
subsection \<open>Auxiliary material\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    16
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    17
lemma replicate_numeral: "replicate (numeral n) x = x # replicate (pred_numeral n) x"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    18
  by (simp add: numeral_eq_Suc)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    19
75501
426afab39a55 insort renamings
nipkow
parents: 73526
diff changeset
    20
lemma insort_correct: "insort xs = sort xs"
426afab39a55 insort renamings
nipkow
parents: 73526
diff changeset
    21
  using sorted_insort mset_insort by (metis properties_for_sort)
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    22
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    23
lemma sum_list_replicate [simp]: "sum_list (replicate n x) = n * x"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    24
  by (induction n) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    25
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    26
lemma mset_concat: "mset (concat xss) = sum_list (map mset xss)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    27
  by (induction xss) simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    28
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    29
lemma set_mset_sum_list [simp]: "set_mset (sum_list xs) = (\<Union>x\<in>set xs. set_mset x)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    30
  by (induction xs) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    31
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    32
lemma filter_mset_image_mset:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    33
  "filter_mset P (image_mset f A) = image_mset f (filter_mset (\<lambda>x. P (f x)) A)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    34
  by (induction A) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    35
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    36
lemma filter_mset_sum_list: "filter_mset P (sum_list xs) = sum_list (map (filter_mset P) xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    37
  by (induction xs) simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    38
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    39
lemma sum_mset_mset_mono: 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    40
  assumes "(\<And>x. x \<in># A \<Longrightarrow> f x \<subseteq># g x)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    41
  shows   "(\<Sum>x\<in>#A. f x) \<subseteq># (\<Sum>x\<in>#A. g x)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    42
  using assms by (induction A) (auto intro!: subset_mset.add_mono)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    43
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    44
lemma mset_filter_mono:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    45
  assumes "A \<subseteq># B" "\<And>x. x \<in># A \<Longrightarrow> P x \<Longrightarrow> Q x"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    46
  shows   "filter_mset P A \<subseteq># filter_mset Q B"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    47
  by (rule mset_subset_eqI) (insert assms, auto simp: mset_subset_eq_count count_eq_zero_iff)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    48
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    49
lemma size_mset_sum_mset_distrib: "size (sum_mset A :: 'a multiset) = sum_mset (image_mset size A)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    50
  by (induction A) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    51
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    52
lemma sum_mset_mono:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    53
  assumes "\<And>x. x \<in># A \<Longrightarrow> f x \<le> (g x :: 'a :: {ordered_ab_semigroup_add,comm_monoid_add})"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    54
  shows   "(\<Sum>x\<in>#A. f x) \<le> (\<Sum>x\<in>#A. g x)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    55
  using assms by (induction A) (auto intro!: add_mono)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    56
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    57
lemma filter_mset_is_empty_iff: "filter_mset P A = {#} \<longleftrightarrow> (\<forall>x. x \<in># A \<longrightarrow> \<not>P x)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    58
  by (auto simp: multiset_eq_iff count_eq_zero_iff)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    59
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    60
lemma sort_eq_Nil_iff [simp]: "sort xs = [] \<longleftrightarrow> xs = []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    61
  by (metis set_empty set_sort)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    62
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    63
lemma sort_mset_cong: "mset xs = mset ys \<Longrightarrow> sort xs = sort ys"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    64
  by (metis sorted_list_of_multiset_mset)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    65
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    66
lemma Min_set_sorted: "sorted xs \<Longrightarrow> xs \<noteq> [] \<Longrightarrow> Min (set xs) = hd xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    67
  by (cases xs; force intro: Min_insert2)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    68
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    69
lemma hd_sort:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    70
  fixes xs :: "'a :: linorder list"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    71
  shows "xs \<noteq> [] \<Longrightarrow> hd (sort xs) = Min (set xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    72
  by (subst Min_set_sorted [symmetric]) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    73
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    74
lemma length_filter_conv_size_filter_mset: "length (filter P xs) = size (filter_mset P (mset xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    75
  by (induction xs) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    76
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    77
lemma sorted_filter_less_subset_take:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    78
  assumes "sorted xs" and "i < length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    79
  shows   "{#x \<in># mset xs. x < xs ! i#} \<subseteq># mset (take i xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    80
  using assms
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    81
proof (induction xs arbitrary: i rule: list.induct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    82
  case (Cons x xs i)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    83
  show ?case
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    84
  proof (cases i)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    85
    case 0
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    86
    thus ?thesis using Cons.prems by (auto simp: filter_mset_is_empty_iff)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    87
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    88
    case (Suc i')
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    89
    have "{#y \<in># mset (x # xs). y < (x # xs) ! i#} \<subseteq># add_mset x {#y \<in># mset xs. y < xs ! i'#}"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    90
      using Suc Cons.prems by (auto)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    91
    also have "\<dots> \<subseteq># add_mset x (mset (take i' xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    92
      unfolding mset_subset_eq_add_mset_cancel using Cons.prems Suc
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    93
      by (intro Cons.IH) (auto)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    94
    also have "\<dots> = mset (take i (x # xs))" by (simp add: Suc)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    95
    finally show ?thesis .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    96
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    97
qed auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    98
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
    99
lemma sorted_filter_greater_subset_drop:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   100
  assumes "sorted xs" and "i < length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   101
  shows   "{#x \<in># mset xs. x > xs ! i#} \<subseteq># mset (drop (Suc i) xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   102
  using assms
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   103
proof (induction xs arbitrary: i rule: list.induct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   104
  case (Cons x xs i)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   105
  show ?case
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   106
  proof (cases i)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   107
    case 0
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   108
    thus ?thesis by (auto simp: sorted_append filter_mset_is_empty_iff)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   109
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   110
    case (Suc i')
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   111
    have "{#y \<in># mset (x # xs). y > (x # xs) ! i#} \<subseteq># {#y \<in># mset xs. y > xs ! i'#}"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   112
      using Suc Cons.prems by (auto simp: set_conv_nth)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   113
    also have "\<dots> \<subseteq># mset (drop (Suc i') xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   114
      using Cons.prems Suc by (intro Cons.IH) (auto)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   115
    also have "\<dots> = mset (drop (Suc i) (x # xs))" by (simp add: Suc)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   116
    finally show ?thesis .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   117
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   118
qed auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   119
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   120
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   121
subsection \<open>Chopping a list into equally-sized bits\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   122
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   123
fun chop :: "nat \<Rightarrow> 'a list \<Rightarrow> 'a list list" where
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   124
  "chop 0 _  = []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   125
| "chop _ [] = []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   126
| "chop n xs = take n xs # chop n (drop n xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   127
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   128
lemmas [simp del] = chop.simps
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   129
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   130
text \<open>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   131
  This is an alternative induction rule for \<^const>\<open>chop\<close>, which is often nicer to use.
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   132
\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   133
lemma chop_induct' [case_names trivial reduce]:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   134
  assumes "\<And>n xs. n = 0 \<or> xs = [] \<Longrightarrow> P n xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   135
  assumes "\<And>n xs. n > 0 \<Longrightarrow> xs \<noteq> [] \<Longrightarrow> P n (drop n xs) \<Longrightarrow> P n xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   136
  shows   "P n xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   137
  using assms
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   138
proof induction_schema
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   139
  show "wf (measure (length \<circ> snd))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   140
    by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   141
qed (blast | simp)+
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   142
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   143
lemma chop_eq_Nil_iff [simp]: "chop n xs = [] \<longleftrightarrow> n = 0 \<or> xs = []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   144
  by (induction n xs rule: chop.induct; subst chop.simps) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   145
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   146
lemma chop_0 [simp]: "chop 0 xs = []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   147
  by (simp add: chop.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   148
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   149
lemma chop_Nil [simp]: "chop n [] = []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   150
  by (cases n) (auto simp: chop.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   151
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   152
lemma chop_reduce: "n > 0 \<Longrightarrow> xs \<noteq> [] \<Longrightarrow> chop n xs = take n xs # chop n (drop n xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   153
  by (cases n; cases xs) (auto simp: chop.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   154
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   155
lemma concat_chop [simp]: "n > 0 \<Longrightarrow> concat (chop n xs) = xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   156
  by (induction n xs rule: chop.induct; subst chop.simps) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   157
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   158
lemma chop_elem_not_Nil [dest]: "ys \<in> set (chop n xs) \<Longrightarrow> ys \<noteq> []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   159
  by (induction n xs rule: chop.induct; subst (asm) chop.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   160
     (auto simp: eq_commute[of "[]"] split: if_splits)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   161
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   162
lemma length_chop_part_le: "ys \<in> set (chop n xs) \<Longrightarrow> length ys \<le> n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   163
  by (induction n xs rule: chop.induct; subst (asm) chop.simps) (auto split: if_splits)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   164
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   165
lemma length_chop:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   166
  assumes "n > 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   167
  shows   "length (chop n xs) = nat \<lceil>length xs / n\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   168
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   169
  from \<open>n > 0\<close> have "real n * length (chop n xs) \<ge> length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   170
    by (induction n xs rule: chop.induct; subst chop.simps) (auto simp: field_simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   171
  moreover from \<open>n > 0\<close> have "real n * length (chop n xs) < length xs + n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   172
    by (induction n xs rule: chop.induct; subst chop.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   173
       (auto simp: field_simps split: nat_diff_split_asm)+
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   174
  ultimately have "length (chop n xs) \<ge> length xs / n" and "length (chop n xs) < length xs / n + 1"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   175
    using assms by (auto simp: field_simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   176
  thus ?thesis by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   177
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   178
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   179
lemma sum_msets_chop: "n > 0 \<Longrightarrow> (\<Sum>ys\<leftarrow>chop n xs. mset ys) = mset xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   180
  by (subst mset_concat [symmetric]) simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   181
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   182
lemma UN_sets_chop: "n > 0 \<Longrightarrow> (\<Union>ys\<in>set (chop n xs). set ys) = set xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   183
  by (simp only: set_concat [symmetric] concat_chop)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   184
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   185
lemma chop_append: "d dvd length xs \<Longrightarrow> chop d (xs @ ys) = chop d xs @ chop d ys"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   186
  by (induction d xs rule: chop_induct') (auto simp: chop_reduce dvd_imp_le)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   187
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   188
lemma chop_replicate [simp]: "d > 0 \<Longrightarrow> chop d (replicate d xs) = [replicate d xs]"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   189
  by (subst chop_reduce) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   190
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   191
lemma chop_replicate_dvd [simp]:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   192
  assumes "d dvd n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   193
  shows   "chop d (replicate n x) = replicate (n div d) (replicate d x)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   194
proof (cases "d = 0")
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   195
  case False
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   196
  from assms obtain k where k: "n = d * k"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   197
    by blast
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   198
  have "chop d (replicate (d * k) x) = replicate k (replicate d x)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   199
    using False by (induction k) (auto simp: replicate_add chop_append)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   200
  thus ?thesis using False by (simp add: k)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   201
qed auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   202
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   203
lemma chop_concat:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   204
  assumes "\<forall>xs\<in>set xss. length xs = d" and "d > 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   205
  shows   "chop d (concat xss) = xss"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   206
  using assms 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   207
proof (induction xss)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   208
  case (Cons xs xss)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   209
  have "chop d (concat (xs # xss)) = chop d (xs @ concat xss)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   210
    by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   211
  also have "\<dots> = chop d xs @ chop d (concat xss)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   212
    using Cons.prems by (intro chop_append) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   213
  also have "chop d xs = [xs]"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   214
    using Cons.prems by (subst chop_reduce) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   215
  also have "chop d (concat xss) = xss"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   216
    using Cons.prems by (intro Cons.IH) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   217
  finally show ?case by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   218
qed auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   219
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   220
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   221
subsection \<open>Selection\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   222
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   223
definition select :: "nat \<Rightarrow> ('a :: linorder) list \<Rightarrow> 'a" where
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   224
  "select k xs = sort xs ! k"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   225
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   226
lemma select_0: "xs \<noteq> [] \<Longrightarrow> select 0 xs = Min (set xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   227
  by (simp add: hd_sort select_def flip: hd_conv_nth)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   228
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   229
lemma select_mset_cong: "mset xs = mset ys \<Longrightarrow> select k xs = select k ys"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   230
  using sort_mset_cong[of xs ys] unfolding select_def by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   231
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   232
lemma select_in_set [intro,simp]:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   233
  assumes "k < length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   234
  shows   "select k xs \<in> set xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   235
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   236
  from assms have "sort xs ! k \<in> set (sort xs)" by (intro nth_mem) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   237
  also have "set (sort xs) = set xs" by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   238
  finally show ?thesis by (simp add: select_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   239
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   240
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   241
lemma
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   242
  assumes "n < length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   243
  shows   size_less_than_select: "size {#y \<in># mset xs. y < select n xs#} \<le> n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   244
    and   size_greater_than_select: "size {#y \<in># mset xs. y > select n xs#} < length xs - n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   245
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   246
  have "size {#y \<in># mset (sort xs). y < select n xs#} \<le> size (mset (take n (sort xs)))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   247
    unfolding select_def using assms
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   248
    by (intro size_mset_mono sorted_filter_less_subset_take) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   249
  thus "size {#y \<in># mset xs. y < select n xs#} \<le> n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   250
    by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   251
  have "size {#y \<in># mset (sort xs). y > select n xs#} \<le> size (mset (drop (Suc n) (sort xs)))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   252
    unfolding select_def using assms
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   253
    by (intro size_mset_mono sorted_filter_greater_subset_drop) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   254
  thus "size {#y \<in># mset xs. y > select n xs#} < length xs - n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   255
    using assms by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   256
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   257
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   258
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   259
subsection \<open>The designated median of a list\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   260
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   261
definition median where "median xs = select ((length xs - 1) div 2) xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   262
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   263
lemma median_in_set [intro, simp]: 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   264
  assumes "xs \<noteq> []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   265
  shows   "median xs \<in> set xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   266
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   267
  from assms have "length xs > 0" by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   268
  hence "(length xs - 1) div 2 < length xs" by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   269
  thus ?thesis by (simp add: median_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   270
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   271
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   272
lemma size_less_than_median: "size {#y \<in># mset xs. y < median xs#} \<le> (length xs - 1) div 2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   273
proof (cases "xs = []")
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   274
  case False
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   275
  hence "length xs > 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   276
    by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   277
  hence less: "(length xs - 1) div 2 < length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   278
    by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   279
  show "size {#y \<in># mset xs. y < median xs#} \<le> (length xs - 1) div 2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   280
    using size_less_than_select[OF less] by (simp add: median_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   281
qed auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   282
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   283
lemma size_greater_than_median: "size {#y \<in># mset xs. y > median xs#} \<le> length xs div 2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   284
proof (cases "xs = []")
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   285
  case False
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   286
  hence "length xs > 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   287
    by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   288
  hence less: "(length xs - 1) div 2 < length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   289
    by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   290
  have "size {#y \<in># mset xs. y > median xs#} < length xs - (length xs - 1) div 2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   291
    using size_greater_than_select[OF less] by (simp add: median_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   292
  also have "\<dots> = length xs div 2 + 1"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   293
    using \<open>length xs > 0\<close> by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   294
  finally show "size {#y \<in># mset xs. y > median xs#} \<le> length xs div 2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   295
    by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   296
qed auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   297
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   298
lemmas median_props = size_less_than_median size_greater_than_median
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   299
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   300
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   301
subsection \<open>A recurrence for selection\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   302
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   303
definition partition3 :: "'a \<Rightarrow> 'a :: linorder list \<Rightarrow> 'a list \<times> 'a list \<times> 'a list" where
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   304
  "partition3 x xs = (filter (\<lambda>y. y < x) xs, filter (\<lambda>y. y = x) xs, filter (\<lambda>y. y > x) xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   305
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   306
lemma partition3_code [code]:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   307
  "partition3 x [] = ([], [], [])"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   308
  "partition3 x (y # ys) =
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   309
     (case partition3 x ys of (ls, es, gs) \<Rightarrow>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   310
        if y < x then (y # ls, es, gs) else if x = y then (ls, y # es, gs) else (ls, es, y # gs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   311
  by (auto simp: partition3_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   312
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   313
lemma length_partition3:
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   314
  assumes "partition3 x xs = (ls, es, gs)"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   315
  shows   "length xs = length ls + length es + length gs"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   316
  using assms by (induction xs arbitrary: ls es gs)
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   317
                 (auto simp: partition3_code split: if_splits prod.splits)
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   318
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   319
lemma sort_append:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   320
  assumes "\<forall>x\<in>set xs. \<forall>y\<in>set ys. x \<le> y"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   321
  shows   "sort (xs @ ys) = sort xs @ sort ys"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   322
  using assms by (intro properties_for_sort) (auto simp: sorted_append)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   323
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   324
lemma select_append:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   325
  assumes "\<forall>y\<in>set ys. \<forall>z\<in>set zs. y \<le> z"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   326
  shows   "k < length ys \<Longrightarrow> select k (ys @ zs) = select k ys"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   327
    and   "k \<in> {length ys..<length ys + length zs} \<Longrightarrow>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   328
             select k (ys @ zs) = select (k - length ys) zs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   329
  using assms by (simp_all add: select_def sort_append nth_append)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   330
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   331
lemma select_append':
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   332
  assumes "\<forall>y\<in>set ys. \<forall>z\<in>set zs. y \<le> z" and "k < length ys + length zs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   333
  shows   "select k (ys @ zs) = (if k < length ys then select k ys else select (k - length ys) zs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   334
  using assms by (auto intro!: select_append)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   335
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   336
theorem select_rec_partition:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   337
  assumes "k < length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   338
  shows "select k xs = (
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   339
           let (ls, es, gs) = partition3 x xs
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   340
           in
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   341
             if k < length ls then select k ls 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   342
             else if k < length ls + length es then x
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   343
             else select (k - length ls - length es) gs
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   344
          )" (is "_ = ?rhs")
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   345
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   346
  define ls es gs where "ls = filter (\<lambda>y. y < x) xs" and "es = filter (\<lambda>y. y = x) xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   347
                    and "gs = filter (\<lambda>y. y > x) xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   348
  define nl ne where [simp]: "nl = length ls" "ne = length es"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   349
  have mset_eq: "mset xs = mset ls + mset es + mset gs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   350
    unfolding ls_def es_def gs_def by (induction xs) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   351
  have length_eq: "length xs = length ls + length es + length gs"
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 73123
diff changeset
   352
    unfolding ls_def es_def gs_def 
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 73123
diff changeset
   353
    using [[simp_depth_limit = 1]] by (induction xs) auto
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   354
  have [simp]: "select i es = x" if "i < length es" for i
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   355
  proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   356
    have "select i es \<in> set (sort es)" unfolding select_def
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   357
      using that by (intro nth_mem) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   358
    thus ?thesis
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   359
      by (auto simp: es_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   360
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   361
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   362
  have "select k xs = select k (ls @ (es @ gs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   363
    by (intro select_mset_cong) (simp_all add: mset_eq)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   364
  also have "\<dots> = (if k < nl then select k ls else select (k - nl) (es @ gs))" 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   365
    unfolding nl_ne_def using assms
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   366
    by (intro select_append') (auto simp: ls_def es_def gs_def length_eq)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   367
  also have "\<dots> = (if k < nl then select k ls else if k < nl + ne then x
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   368
                    else select (k - nl - ne) gs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   369
  proof (rule if_cong)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   370
    assume "\<not>k < nl"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   371
    have "select (k - nl) (es @ gs) =
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   372
                 (if k - nl < ne then select (k - nl) es else select (k - nl - ne) gs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   373
      unfolding nl_ne_def using assms \<open>\<not>k < nl\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   374
      by (intro select_append') (auto simp: ls_def es_def gs_def length_eq)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   375
    also have "\<dots> = (if k < nl + ne then x else select (k - nl - ne) gs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   376
      using \<open>\<not>k < nl\<close> by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   377
    finally show "select (k - nl) (es @ gs) = \<dots>" .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   378
  qed simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   379
  also have "\<dots> = ?rhs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   380
    by (simp add: partition3_def ls_def es_def gs_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   381
  finally show ?thesis .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   382
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   383
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   384
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   385
subsection \<open>The size of the lists in the recursive calls\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   386
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   387
text \<open>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   388
  We now derive an upper bound for the number of elements of a list that are smaller
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   389
  (resp. bigger) than the median of medians with chopping size 5. To avoid having to do the
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   390
  same proof twice, we do it generically for an operation \<open>\<prec>\<close> that we will later instantiate
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   391
  with either \<open><\<close> or \<open>>\<close>.
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   392
\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   393
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   394
context
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   395
  fixes xs :: "'a :: linorder list"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   396
  fixes M defines "M \<equiv> median (map median (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   397
begin
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   398
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   399
lemma size_median_of_medians_aux:
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 80774
diff changeset
   400
  fixes R :: "'a :: linorder \<Rightarrow> 'a \<Rightarrow> bool" (infix \<open>\<prec>\<close> 50)
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   401
  assumes R: "R \<in> {(<), (>)}"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   402
  shows "size {#y \<in># mset xs. y \<prec> M#} \<le> nat \<lceil>0.7 * length xs + 3\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   403
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   404
  define n and m where [simp]: "n = length xs" and "m = length (chop 5 xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   405
  text \<open>We define an abbreviation for the multiset of all the chopped-up groups:\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   406
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   407
  text \<open>We then split that multiset into those groups whose medians is less than @{term M}
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   408
        and the rest.\<close>
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 80774
diff changeset
   409
  define Y_small (\<open>Y\<^sub>\<prec>\<close>) where "Y\<^sub>\<prec> = filter_mset (\<lambda>ys. median ys \<prec> M) (mset (chop 5 xs))"
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 80774
diff changeset
   410
  define Y_big (\<open>Y\<^sub>\<succeq>\<close>) where "Y\<^sub>\<succeq> = filter_mset (\<lambda>ys. \<not>(median ys \<prec> M)) (mset (chop 5 xs))"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   411
  have "m = size (mset (chop 5 xs))" by (simp add: m_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   412
  also have "mset (chop 5 xs) = Y\<^sub>\<prec> + Y\<^sub>\<succeq>" unfolding Y_small_def Y_big_def
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   413
    by (rule multiset_partition)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   414
  finally have m_eq: "m = size Y\<^sub>\<prec> + size Y\<^sub>\<succeq>" by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   415
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   416
  text \<open>At most half of the lists have a median that is smaller than the median of medians:\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   417
  have "size Y\<^sub>\<prec> = size (image_mset median Y\<^sub>\<prec>)" by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   418
  also have "image_mset median Y\<^sub>\<prec> = {#y \<in># mset (map median (chop 5 xs)). y \<prec> M#}"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   419
    unfolding Y_small_def by (subst filter_mset_image_mset [symmetric]) simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   420
  also have "size \<dots> \<le> (length (map median (chop 5 xs))) div 2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   421
    unfolding M_def using median_props[of "map median (chop 5 xs)"] R by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   422
  also have "\<dots> = m div 2" by (simp add: m_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   423
  finally have size_Y\<^sub>_small: "size Y\<^sub>\<prec> \<le> m div 2" .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   424
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   425
  text \<open>We estimate the number of elements less than @{term M} by grouping them into elements
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   426
      coming from @{term "Y\<^sub>\<prec>"} and elements coming from @{term "Y\<^sub>\<succeq>"}:\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   427
  have "{#y \<in># mset xs. y \<prec> M#} = {#y \<in># (\<Sum>ys\<leftarrow>chop 5 xs. mset ys). y \<prec> M#}"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   428
    by (subst sum_msets_chop) simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   429
  also have "\<dots> = (\<Sum>ys\<leftarrow>chop 5 xs. {#y \<in># mset ys. y \<prec> M#})"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   430
    by (subst filter_mset_sum_list) (simp add: o_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   431
  also have "\<dots> = (\<Sum>ys\<in>#mset (chop 5 xs). {#y \<in># mset ys. y \<prec> M#})"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   432
    by (subst sum_mset_sum_list [symmetric]) simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   433
  also have "mset (chop 5 xs) = Y\<^sub>\<prec> + Y\<^sub>\<succeq>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   434
    by (simp add: Y_small_def Y_big_def not_le)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   435
  also have "(\<Sum>ys\<in>#\<dots>. {#y \<in># mset ys. y \<prec> M#}) = 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   436
               (\<Sum>ys\<in>#Y\<^sub>\<prec>. {#y \<in># mset ys. y \<prec> M#}) + (\<Sum>ys\<in>#Y\<^sub>\<succeq>. {#y \<in># mset ys. y \<prec> M#})"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   437
    by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   438
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   439
  text \<open>Next, we overapproximate the elements contributed by @{term "Y\<^sub>\<prec>"}: instead of those elements
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   440
        that are smaller than the median, we take \<^emph>\<open>all\<close> the elements of each group.
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   441
        For the elements contributed by @{term "Y\<^sub>\<succeq>"}, we overapproximate by taking all those that
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   442
        are less than their median instead of only those that are less than @{term M}.\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   443
  also have "\<dots> \<subseteq># (\<Sum>ys\<in>#Y\<^sub>\<prec>. mset ys) + (\<Sum>ys\<in>#Y\<^sub>\<succeq>. {#y \<in># mset ys. y \<prec> median ys#})"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   444
    using R
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   445
    by (intro subset_mset.add_mono sum_mset_mset_mono mset_filter_mono) (auto simp: Y_big_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   446
  finally have "size {# y \<in># mset xs. y \<prec> M#} \<le> size \<dots>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   447
    by (rule size_mset_mono)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   448
  hence "size {# y \<in># mset xs. y \<prec> M#} \<le>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   449
           (\<Sum>ys\<in>#Y\<^sub>\<prec>. length ys) + (\<Sum>ys\<in>#Y\<^sub>\<succeq>. size {#y \<in># mset ys. y \<prec> median ys#})"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   450
    by (simp add: size_mset_sum_mset_distrib multiset.map_comp o_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   451
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   452
  text \<open>Next, we further overapproximate the first sum by noting that each group has
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   453
        at most size 5.\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   454
  also have "(\<Sum>ys\<in>#Y\<^sub>\<prec>. length ys) \<le> (\<Sum>ys\<in>#Y\<^sub>\<prec>. 5)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   455
    by (intro sum_mset_mono) (auto simp: Y_small_def length_chop_part_le)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   456
  also have "\<dots> = 5 * size Y\<^sub>\<prec>" by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   457
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   458
  text \<open>Next, we note that each group in @{term "Y\<^sub>\<succeq>"} can have at most 2 elements that are
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   459
        smaller than its median.\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   460
  also have "(\<Sum>ys\<in>#Y\<^sub>\<succeq>. size {#y \<in># mset ys. y \<prec> median ys#}) \<le>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   461
               (\<Sum>ys\<in>#Y\<^sub>\<succeq>. length ys div 2)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   462
  proof (intro sum_mset_mono, goal_cases)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   463
    fix ys assume "ys \<in># Y\<^sub>\<succeq>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   464
    hence "ys \<noteq> []"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   465
      by (auto simp: Y_big_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   466
    thus "size {#y \<in># mset ys. y \<prec> median ys#} \<le> length ys div 2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   467
      using R median_props[of ys] by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   468
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   469
  also have "\<dots> \<le> (\<Sum>ys\<in>#Y\<^sub>\<succeq>. 2)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   470
    by (intro sum_mset_mono div_le_mono diff_le_mono)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   471
       (auto simp: Y_big_def dest: length_chop_part_le)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   472
  also have "\<dots> = 2 * size Y\<^sub>\<succeq>" by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   473
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   474
  text \<open>Simplifying gives us the main result.\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   475
  also have "5 * size Y\<^sub>\<prec> + 2 * size Y\<^sub>\<succeq> = 2 * m + 3 * size Y\<^sub>\<prec>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   476
    by (simp add: m_eq)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   477
  also have "\<dots> \<le> 3.5 * m"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   478
    using \<open>size Y\<^sub>\<prec> \<le> m div 2\<close> by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   479
  also have "\<dots> = 3.5 * \<lceil>n / 5\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   480
    by (simp add: m_def length_chop)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   481
  also have "\<dots> \<le> 0.7 * n + 3.5"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   482
    by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   483
  finally have "size {#y \<in># mset xs. y \<prec> M#} \<le> 0.7 * n + 3.5"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   484
    by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   485
  thus "size {#y \<in># mset xs. y \<prec> M#} \<le> nat \<lceil>0.7 * n + 3\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   486
    by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   487
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   488
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   489
lemma size_less_than_median_of_medians:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   490
  "size {#y \<in># mset xs. y < M#} \<le> nat \<lceil>0.7 * length xs + 3\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   491
  using size_median_of_medians_aux[of "(<)"] by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   492
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   493
lemma size_greater_than_median_of_medians:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   494
  "size {#y \<in># mset xs. y > M#} \<le> nat \<lceil>0.7 * length xs + 3\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   495
  using size_median_of_medians_aux[of "(>)"] by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   496
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   497
end
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   498
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   499
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   500
subsection \<open>Efficient algorithm\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   501
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   502
text \<open>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   503
  We handle the base cases and computing the median for the chopped-up sublists of size 5
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   504
  using the naive selection algorithm where we sort the list using insertion sort.
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   505
\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   506
definition slow_select where
75501
426afab39a55 insort renamings
nipkow
parents: 73526
diff changeset
   507
  "slow_select k xs = insort xs ! k"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   508
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   509
definition slow_median where
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   510
  "slow_median xs = slow_select ((length xs - 1) div 2) xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   511
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   512
lemma slow_select_correct: "slow_select k xs = select k xs"
75501
426afab39a55 insort renamings
nipkow
parents: 73526
diff changeset
   513
  by (simp add: slow_select_def select_def insort_correct)
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   514
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   515
lemma slow_median_correct: "slow_median xs = median xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   516
  by (simp add: median_def slow_median_def slow_select_correct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   517
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   518
text \<open>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   519
  The definition of the selection algorithm is complicated somewhat by the fact that its
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   520
  termination is contingent on its correctness: if the first recursive call were to return an
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   521
  element for \<open>x\<close> that is e.g. smaller than all list elements, the algorithm would not terminate.
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   522
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   523
  Therefore, we first prove partial correctness, then termination, and then combine the two
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   524
  to obtain total correctness.
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   525
\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   526
function mom_select where
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   527
  "mom_select k xs = (
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   528
     let n = length xs
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   529
     in if n \<le> 20 then
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   530
       slow_select k xs
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   531
     else
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   532
       let M = mom_select (((n + 4) div 5 - 1) div 2) (map slow_median (chop 5 xs));
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   533
           (ls, es, gs) = partition3 M xs;
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   534
           nl = length ls
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   535
       in
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   536
         if k < nl then mom_select k ls 
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   537
         else let ne = length es in if k < nl + ne then M
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   538
         else mom_select (k - nl - ne) gs
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   539
      )"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   540
  by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   541
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   542
text \<open>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   543
  If @{const "mom_select"} terminates, it agrees with @{const select}:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   544
\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   545
lemma mom_select_correct_aux:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   546
  assumes "mom_select_dom (k, xs)" and "k < length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   547
  shows   "mom_select k xs = select k xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   548
  using assms
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   549
proof (induction rule: mom_select.pinduct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   550
  case (1 k xs)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   551
  show "mom_select k xs = select k xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   552
  proof (cases "length xs \<le> 20")
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   553
    case True
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   554
    thus "mom_select k xs = select k xs" using "1.prems" "1.hyps"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   555
      by (subst mom_select.psimps) (auto simp: select_def slow_select_correct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   556
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   557
    case False
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   558
    define x where
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   559
      "x = mom_select (((length xs + 4) div 5 - 1) div 2) (map slow_median (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   560
    define ls es gs where "ls = filter (\<lambda>y. y < x) xs" and "es = filter (\<lambda>y. y = x) xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   561
                      and "gs = filter (\<lambda>y. y > x) xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   562
    define nl ne where "nl = length ls" and "ne = length es"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   563
    note defs = nl_def ne_def x_def ls_def es_def gs_def
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   564
    have tw: "(ls, es, gs) = partition3 x xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   565
      unfolding partition3_def defs One_nat_def ..
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   566
    have length_eq: "length xs = nl + ne + length gs"
73526
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 73123
diff changeset
   567
      unfolding nl_def ne_def ls_def es_def gs_def
a3cc9fa1295d new automatic order prover: stateless, complete, verified
nipkow
parents: 73123
diff changeset
   568
      using [[simp_depth_limit = 1]] by (induction xs) auto
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   569
    note IH = "1.IH"(2)[OF refl False x_def tw refl refl refl]
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   570
              "1.IH"(3)[OF refl False x_def tw refl refl refl _ refl]
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   571
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   572
    have "mom_select k xs = (if k < nl then mom_select k ls else if k < nl + ne then x
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   573
                                else mom_select (k - nl - ne) gs)" using "1.hyps" False
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   574
      by (subst mom_select.psimps) (simp_all add: partition3_def flip: defs One_nat_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   575
    also have "\<dots> = (if k < nl then select k ls else if k < nl + ne then x 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   576
                       else select (k - nl - ne) gs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   577
      using IH length_eq "1.prems" by (simp add: ls_def es_def gs_def nl_def ne_def)
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   578
      try0
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   579
    also have "\<dots> = select k xs" using \<open>k < length xs\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   580
      by (subst (3) select_rec_partition[of _ _ x]) (simp_all add: nl_def ne_def flip: tw)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   581
    finally show "mom_select k xs = select k xs" .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   582
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   583
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   584
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   585
text \<open>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   586
  @{const mom_select} indeed terminates for all inputs:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   587
\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   588
lemma mom_select_termination: "All mom_select_dom"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   589
proof (relation "measure (length \<circ> snd)"; (safe)?)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   590
  fix k :: nat and xs :: "'a list"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   591
  assume "\<not> length xs \<le> 20"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   592
  thus "((((length xs + 4) div 5 - 1) div 2, map slow_median (chop 5 xs)), k, xs)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   593
           \<in> measure (length \<circ> snd)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   594
    by (auto simp: length_chop nat_less_iff ceiling_less_iff)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   595
next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   596
  fix k :: nat and xs ls es gs :: "'a list"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   597
  define x where "x = mom_select (((length xs + 4) div 5 - 1) div 2) (map slow_median (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   598
  assume A: "\<not> length xs \<le> 20" 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   599
            "(ls, es, gs) = partition3 x xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   600
            "mom_select_dom (((length xs + 4) div 5 - 1) div 2, 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   601
                             map slow_median (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   602
  have less: "((length xs + 4) div 5 - 1) div 2 < nat \<lceil>length xs / 5\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   603
    using A(1) by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   604
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   605
  text \<open>For termination, it suffices to prove that @{term x} is in the list.\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   606
  have "x = select (((length xs + 4) div 5 - 1) div 2) (map slow_median (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   607
    using less unfolding x_def by (intro mom_select_correct_aux A) (auto simp: length_chop)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   608
  also have "\<dots> \<in> set (map slow_median (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   609
    using less by (intro select_in_set) (simp_all add: length_chop)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   610
  also have "\<dots> \<subseteq> set xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   611
    unfolding set_map
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   612
  proof safe
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   613
    fix ys assume ys: "ys \<in> set (chop 5 xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   614
    hence "median ys \<in> set ys"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   615
      by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   616
    also have "set ys \<subseteq> \<Union>(set ` set (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   617
      using ys by blast
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   618
    also have "\<dots> = set xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   619
      by (rule UN_sets_chop) simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   620
    finally show "slow_median ys \<in> set xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   621
      by (simp add: slow_median_correct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   622
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   623
  finally have "x \<in> set xs" .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   624
  thus "((k, ls), k, xs) \<in> measure (length \<circ> snd)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   625
   and "((k - length ls - length es, gs), k, xs) \<in> measure (length \<circ> snd)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   626
    using A(1,2) by (auto simp: partition3_def intro!: length_filter_less[of x])
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   627
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   628
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   629
termination mom_select by (rule mom_select_termination)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   630
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   631
lemmas [simp del] = mom_select.simps
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   632
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   633
lemma mom_select_correct: "k < length xs \<Longrightarrow> mom_select k xs = select k xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   634
  using mom_select_correct_aux and mom_select_termination by blast
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   635
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   636
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   637
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   638
subsection \<open>Running time analysis\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   639
80774
a2486a4b42da get rid of manual T_f defs
nipkow
parents: 80734
diff changeset
   640
time_fun partition3 equations partition3_code
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   641
81357
21a493abde0f uniform name T_f for closed-form lemmas for function T_f
nipkow
parents: 81291
diff changeset
   642
lemma T_partition3: "T_partition3 x xs = length xs + 1"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   643
  by (induction x xs rule: T_partition3.induct) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   644
80093
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   645
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   646
time_definition slow_select
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   647
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   648
lemmas T_slow_select_def [simp del] = T_slow_select.simps
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   649
80734
7054a1bc8347 new version of time_fun that works for classes; define T_length automatically now
nipkow
parents: 80107
diff changeset
   650
time_fun slow_median
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   651
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   652
lemma T_slow_select_le:
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   653
  assumes "k < length xs"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   654
  shows   "T_slow_select k xs \<le> length xs ^ 2 + 3 * length xs + 1"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   655
proof -
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   656
  have "T_slow_select k xs = T_insort xs + T_nth (Sorting.insort xs) k"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   657
    unfolding T_slow_select_def ..
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   658
  also have "T_insort xs \<le> (length xs + 1) ^ 2"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   659
    by (rule T_insort_length)
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   660
  also have "T_nth (Sorting.insort xs) k = k + 1"
81357
21a493abde0f uniform name T_f for closed-form lemmas for function T_f
nipkow
parents: 81291
diff changeset
   661
    using assms by (subst T_nth) (auto simp: length_insort)
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   662
  also have "k + 1 \<le> length xs"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   663
    using assms by linarith
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   664
  also have "(length xs + 1) ^ 2 + length xs = length xs ^ 2 + 3 * length xs + 1"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   665
    by (simp add: algebra_simps power2_eq_square)
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   666
  finally show ?thesis by - simp_all
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   667
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   668
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   669
lemma T_slow_median_le:
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   670
  assumes "xs \<noteq> []"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   671
  shows   "T_slow_median xs \<le> length xs ^ 2 + 4 * length xs + 2"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   672
proof -
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   673
  have "T_slow_median xs = length xs + T_slow_select ((length xs - 1) div 2) xs + 1"
81357
21a493abde0f uniform name T_f for closed-form lemmas for function T_f
nipkow
parents: 81291
diff changeset
   674
    by (simp add: T_length)
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   675
  also from assms have "length xs > 0"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   676
    by simp
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   677
  hence "(length xs - 1) div 2 < length xs"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   678
    by linarith
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   679
  hence "T_slow_select ((length xs - 1) div 2) xs \<le> length xs ^ 2 + 3 * length xs + 1"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   680
    by (intro T_slow_select_le) auto
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   681
  also have "length xs + \<dots> + 1 = length xs ^ 2 + 4 * length xs + 2"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   682
    by (simp add: algebra_simps)
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   683
  finally show ?thesis by - simp_all
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   684
qed
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   685
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   686
80093
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   687
time_fun chop
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   688
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   689
lemmas [simp del] = T_chop.simps
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   690
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   691
lemma T_chop_Nil [simp]: "T_chop d [] = 1"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   692
  by (cases d) (auto simp: T_chop.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   693
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   694
lemma T_chop_0 [simp]: "T_chop 0 xs = 1"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   695
  by (auto simp: T_chop.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   696
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   697
lemma T_chop_reduce:
80093
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   698
  "n > 0 \<Longrightarrow> xs \<noteq> [] \<Longrightarrow> T_chop n xs = T_take n xs + T_drop n xs + T_chop n (drop n xs) + 1"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   699
  by (cases n; cases xs) (auto simp: T_chop.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   700
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   701
lemma T_chop_le: "T_chop d xs \<le> 5 * length xs + 1"
81357
21a493abde0f uniform name T_f for closed-form lemmas for function T_f
nipkow
parents: 81291
diff changeset
   702
  by (induction d xs rule: T_chop.induct) (auto simp: T_chop_reduce T_take T_drop)
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   703
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   704
time_fun mom_select
80093
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   705
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   706
lemmas [simp del] = T_mom_select.simps
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   707
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   708
lemma T_mom_select_simps:
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   709
  "length xs \<le> 20 \<Longrightarrow> T_mom_select k xs = T_slow_select k xs + T_length xs + 1"
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   710
  "length xs > 20 \<Longrightarrow> T_mom_select k xs = (
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   711
       let xss = chop 5 xs;
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   712
           ms = map slow_median xss;
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   713
           idx = (((length xs + 4) div 5 - 1) div 2);
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   714
           x = mom_select idx ms;
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   715
           (ls, es, gs) = partition3 x xs;
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   716
           nl = length ls;
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   717
           ne = length es
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   718
       in
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   719
         (if k < nl then T_mom_select k ls 
80093
c0d689c4fd15 tweaked time functions for median-of-medians selection in HOL-Data_Structures
Manuel Eberl <manuel@pruvisto.org>
parents: 75501
diff changeset
   720
          else T_length es + (if k < nl + ne then 0 else T_mom_select (k - nl - ne) gs)) +
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   721
         T_mom_select idx ms + T_chop 5 xs + T_map T_slow_median xss +
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   722
         T_partition3 x xs + T_length ls + T_length xs + 1
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   723
      )"
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   724
   by (subst T_mom_select.simps; simp add: Let_def case_prod_unfold)+
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   725
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   726
function T'_mom_select :: "nat \<Rightarrow> nat" where
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   727
  "T'_mom_select n =
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   728
     (if n \<le> 20 then
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   729
        483
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   730
      else
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   731
        T'_mom_select (nat \<lceil>0.2*n\<rceil>) + T'_mom_select (nat \<lceil>0.7*n+3\<rceil>) + 19 * n + 54)"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   732
  by force+
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   733
termination by (relation "measure id"; simp; linarith)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   734
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   735
lemmas [simp del] = T'_mom_select.simps
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   736
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   737
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   738
lemma T'_mom_select_ge: "T'_mom_select n \<ge> 483"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   739
  by (induction n rule: T'_mom_select.induct; subst T'_mom_select.simps) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   740
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   741
lemma T'_mom_select_mono:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   742
  "m \<le> n \<Longrightarrow> T'_mom_select m \<le> T'_mom_select n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   743
proof (induction n arbitrary: m rule: less_induct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   744
  case (less n m)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   745
  show ?case
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   746
  proof (cases "m \<le> 20")
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   747
    case True
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   748
    hence "T'_mom_select m = 483"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   749
      by (subst T'_mom_select.simps) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   750
    also have "\<dots> \<le> T'_mom_select n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   751
      by (rule T'_mom_select_ge)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   752
    finally show ?thesis .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   753
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   754
    case False
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   755
    hence "T'_mom_select m =
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   756
             T'_mom_select (nat \<lceil>0.2*m\<rceil>) + T'_mom_select (nat \<lceil>0.7*m + 3\<rceil>) + 19 * m + 54"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   757
      by (subst T'_mom_select.simps) auto
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   758
    also have "\<dots> \<le> T'_mom_select (nat \<lceil>0.2*n\<rceil>) + T'_mom_select (nat \<lceil>0.7*n + 3\<rceil>) + 19 * n + 54"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   759
      using \<open>m \<le> n\<close> and False by (intro add_mono less.IH; linarith)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   760
    also have "\<dots> = T'_mom_select n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   761
      using \<open>m \<le> n\<close> and False by (subst T'_mom_select.simps) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   762
    finally show ?thesis .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   763
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   764
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   765
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   766
lemma T_mom_select_le_aux:
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   767
  assumes "k < length xs"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   768
  shows   "T_mom_select k xs \<le> T'_mom_select (length xs)"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   769
  using assms
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   770
proof (induction k xs rule: T_mom_select.induct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   771
  case (1 k xs)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   772
  define n where [simp]: "n = length xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   773
  define x where
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   774
    "x = mom_select (((n + 4) div 5 - 1) div 2) (map slow_median (chop 5 xs))"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   775
  define ls es gs where "ls = filter (\<lambda>y. y < x) xs" and "es = filter (\<lambda>y. y = x) xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   776
                    and "gs = filter (\<lambda>y. y > x) xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   777
  define nl ne where "nl = length ls" and "ne = length es"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   778
  note defs = nl_def ne_def x_def ls_def es_def gs_def
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   779
  have tw: "(ls, es, gs) = partition3 x xs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   780
    unfolding partition3_def defs One_nat_def ..
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   781
  note IH = "1.IH"(1)[OF n_def]
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   782
            "1.IH"(2)[OF n_def _ x_def tw refl refl nl_def]
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   783
            "1.IH"(3)[OF n_def _ x_def tw refl refl nl_def _ ne_def]
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   784
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   785
  show ?case
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   786
  proof (cases "length xs \<le> 20")
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   787
    case True \<comment> \<open>base case\<close>
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   788
    hence "T_mom_select k xs \<le> (length xs)\<^sup>2 + 4 * length xs + 3"
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   789
      using T_slow_select_le[of k xs] \<open>k < length xs\<close>
81357
21a493abde0f uniform name T_f for closed-form lemmas for function T_f
nipkow
parents: 81291
diff changeset
   790
      by (subst T_mom_select_simps(1)) (auto simp: T_length)
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   791
    also have "\<dots> \<le> 20\<^sup>2 + 4 * 20 + 3"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   792
      using True by (intro add_mono power_mono) auto
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   793
    also have "\<dots> = 483"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   794
      by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   795
    also have "\<dots> = T'_mom_select (length xs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   796
      using True by (simp add: T'_mom_select.simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   797
    finally show ?thesis by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   798
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   799
    case False \<comment> \<open>recursive case\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   800
    have "((n + 4) div 5 - 1) div 2 < nat \<lceil>n / 5\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   801
      using False unfolding n_def by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   802
    hence "x = select (((n + 4) div 5 - 1) div 2) (map slow_median (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   803
      unfolding x_def n_def by (intro mom_select_correct) (auto simp: length_chop)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   804
    also have "((n + 4) div 5 - 1) div 2 = (nat \<lceil>n / 5\<rceil> - 1) div 2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   805
      by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   806
    also have "select \<dots> (map slow_median (chop 5 xs)) = median (map slow_median (chop 5 xs))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   807
      by (auto simp: median_def length_chop)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   808
    finally have x_eq: "x = median (map slow_median (chop 5 xs))" .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   809
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   810
    text \<open>The cost of computing the medians of all the subgroups:\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   811
    define T_ms where "T_ms = T_map T_slow_median (chop 5 xs)"
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   812
    have "T_ms \<le> 10 * n + 48"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   813
    proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   814
      have "T_ms = (\<Sum>ys\<leftarrow>chop 5 xs. T_slow_median ys) + length (chop 5 xs) + 1"
81357
21a493abde0f uniform name T_f for closed-form lemmas for function T_f
nipkow
parents: 81291
diff changeset
   815
        by (simp add: T_ms_def T_map)
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   816
      also have "(\<Sum>ys\<leftarrow>chop 5 xs. T_slow_median ys) \<le> (\<Sum>ys\<leftarrow>chop 5 xs. 47)"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   817
      proof (intro sum_list_mono)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   818
        fix ys assume "ys \<in> set (chop 5 xs)"
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   819
        hence "length ys \<le> 5" "ys \<noteq> []"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   820
          using length_chop_part_le[of ys 5 xs] by auto
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   821
        from \<open>ys \<noteq> []\<close> have "T_slow_median ys \<le> (length ys) ^ 2 + 4 * length ys + 2"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   822
          by (rule T_slow_median_le)
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   823
        also have "\<dots> \<le> 5 ^ 2 + 4 * 5 + 2"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   824
          using \<open>length ys \<le> 5\<close> by (intro add_mono power_mono) auto
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   825
        finally show "T_slow_median ys \<le> 47" by simp
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   826
      qed
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   827
      also have "(\<Sum>ys\<leftarrow>chop 5 xs. 47) + length (chop 5 xs) + 1 =
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   828
                   48 * nat \<lceil>real n / 5\<rceil> + 1"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   829
        by (simp add: map_replicate_const length_chop)
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   830
      also have "\<dots> \<le> 10 * n + 48"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   831
        by linarith
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   832
      finally show "T_ms \<le> 10 * n + 48" by simp
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   833
    qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   834
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   835
    text \<open>The cost of the first recursive call (to compute the median of medians):\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   836
    define T_rec1 where
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   837
      "T_rec1 = T_mom_select (((n + 4) div 5 - 1) div 2) (map slow_median (chop 5 xs))"
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   838
    from False have "((length xs + 4) div 5 - Suc 0) div 2 < nat \<lceil>real (length xs) / 5\<rceil>"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   839
      by linarith
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   840
    hence "T_rec1 \<le> T'_mom_select (length (map slow_median (chop 5 xs)))"
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   841
      using False unfolding T_rec1_def by (intro IH(1)) (auto simp: length_chop)
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   842
    hence "T_rec1 \<le> T'_mom_select (nat \<lceil>0.2 * n\<rceil>)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   843
      by (simp add: length_chop)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   844
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   845
    text \<open>The cost of the second recursive call (to compute the final result):\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   846
    define T_rec2 where "T_rec2 = (if k < nl then T_mom_select k ls
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   847
                                 else if k < nl + ne then 0
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   848
                                 else T_mom_select (k - nl - ne) gs)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   849
    consider "k < nl" | "k \<in> {nl..<nl+ne}" | "k \<ge> nl+ne"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   850
      by force
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   851
    hence "T_rec2 \<le> T'_mom_select (nat \<lceil>0.7 * n + 3\<rceil>)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   852
    proof cases
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   853
      assume "k < nl"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   854
      hence "T_rec2 = T_mom_select k ls"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   855
        by (simp add: T_rec2_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   856
      also have "\<dots> \<le> T'_mom_select (length ls)"
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   857
        by (rule IH(2)) (use \<open>k < nl\<close> False in \<open>auto simp: defs\<close>)
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   858
      also have "length ls \<le> nat \<lceil>0.7 * n + 3\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   859
        unfolding ls_def using size_less_than_median_of_medians[of xs]
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   860
        by (auto simp: length_filter_conv_size_filter_mset slow_median_correct[abs_def] x_eq)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   861
      hence "T'_mom_select (length ls) \<le> T'_mom_select (nat \<lceil>0.7 * n + 3\<rceil>)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   862
        by (rule T'_mom_select_mono)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   863
      finally show ?thesis .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   864
    next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   865
      assume "k \<in> {nl..<nl + ne}"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   866
      hence "T_rec2 = 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   867
        by (simp add: T_rec2_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   868
      thus ?thesis
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   869
        using T'_mom_select_ge[of "nat \<lceil>0.7 * n + 3\<rceil>"] by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   870
    next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   871
      assume "k \<ge> nl + ne"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   872
      hence "T_rec2 = T_mom_select (k - nl - ne) gs"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   873
        by (simp add: T_rec2_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   874
      also have "\<dots> \<le> T'_mom_select (length gs)"
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   875
      proof (rule IH(3))
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   876
        show "\<not>n \<le> 20"
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   877
          using False by auto
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   878
        show "\<not> k < nl" "\<not>k < nl + ne"
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   879
          using \<open>k \<ge> nl + ne\<close> by (auto simp: nl_def ne_def)
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   880
        have "length xs = nl + ne + length gs"
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   881
          unfolding defs by (rule length_partition3) (simp_all add: partition3_def)
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   882
        thus "k - nl - ne < length gs"
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   883
          using \<open>k \<ge> nl + ne\<close> \<open>k < length xs\<close> by (auto simp: nl_def ne_def)
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   884
      qed
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   885
      also have "length gs \<le> nat \<lceil>0.7 * n + 3\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   886
        unfolding gs_def using size_greater_than_median_of_medians[of xs]
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   887
        by (auto simp: length_filter_conv_size_filter_mset slow_median_correct[abs_def] x_eq)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   888
      hence "T'_mom_select (length gs) \<le> T'_mom_select (nat \<lceil>0.7 * n + 3\<rceil>)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   889
        by (rule T'_mom_select_mono)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   890
      finally show ?thesis .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   891
    qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   892
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   893
    text \<open>Now for the final inequality chain:\<close>
81291
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   894
    have "T_mom_select k xs =
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   895
            (if k < nl then T_mom_select k ls
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   896
             else T_length es +
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   897
               (if k < nl + ne then 0 else T_mom_select (k - nl - ne) gs)) +
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   898
             T_mom_select (((n + 4) div 5 - 1) div 2) (map slow_median (chop 5 xs)) +
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   899
             T_chop 5 xs + T_map T_slow_median (chop 5 xs) + T_partition3 x xs +
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   900
             T_length ls + T_length xs + 1" using False
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   901
      by (subst T_mom_select_simps;
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   902
          unfold Let_def n_def [symmetric] x_def [symmetric] nl_def [symmetric] 
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   903
          ne_def [symmetric] prod.case tw [symmetric]) simp_all
d6daa049c1db use automatically generated time function in HOL-Data_Structures.Selection
Manuel Eberl <manuel@pruvisto.org>
parents: 80914
diff changeset
   904
    also have "\<dots> \<le> T_rec2 + T_rec1 + T_ms + 2 * n + nl + ne + T_chop 5 xs + 5" using False
81357
21a493abde0f uniform name T_f for closed-form lemmas for function T_f
nipkow
parents: 81291
diff changeset
   905
      by (auto simp add: T_rec1_def T_rec2_def T_partition3
21a493abde0f uniform name T_f for closed-form lemmas for function T_f
nipkow
parents: 81291
diff changeset
   906
                         T_length T_ms_def nl_def ne_def)
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   907
    also have "nl \<le> n" by (simp add: nl_def ls_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   908
    also have "ne \<le> n" by (simp add: ne_def es_def)
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   909
    also note \<open>T_ms \<le> 10 * n + 48\<close>
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   910
    also have "T_chop 5 xs \<le> 5 * n + 1"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   911
      using T_chop_le[of 5 xs] by simp 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   912
    also note \<open>T_rec1 \<le> T'_mom_select (nat \<lceil>0.2*n\<rceil>)\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   913
    also note \<open>T_rec2 \<le> T'_mom_select (nat \<lceil>0.7*n + 3\<rceil>)\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   914
    finally have "T_mom_select k xs \<le>
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
   915
                    T'_mom_select (nat \<lceil>0.7*n + 3\<rceil>) + T'_mom_select (nat \<lceil>0.2*n\<rceil>) + 19 * n + 54"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   916
      by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   917
    also have "\<dots> = T'_mom_select n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   918
      using False by (subst T'_mom_select.simps) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   919
    finally show ?thesis by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   920
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   921
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   922
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   923
subsection \<open>Akra--Bazzi Light\<close>
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   924
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   925
lemma akra_bazzi_light_aux1:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   926
  fixes a b :: real and n n0 :: nat
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   927
  assumes ab: "a > 0" "a < 1" "n > n0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   928
  assumes "n0 \<ge> (max 0 b + 1) / (1 - a)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   929
  shows "nat \<lceil>a*n+b\<rceil> < n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   930
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   931
  have "a * real n + max 0 b \<ge> 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   932
    using ab by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   933
  hence "real (nat \<lceil>a*n+b\<rceil>) \<le> a * n + max 0 b + 1"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   934
    by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   935
  also {
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   936
    have "n0 \<ge> (max 0 b + 1) / (1 - a)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   937
      by fact
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   938
    also have "\<dots> < real n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   939
      using assms by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   940
    finally have "a * real n + max 0 b + 1 < real n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   941
      using ab by (simp add: field_simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   942
  }
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   943
  finally show "nat \<lceil>a*n+b\<rceil> < n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   944
    using \<open>n > n0\<close> by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   945
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   946
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   947
lemma akra_bazzi_light_aux2:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   948
  fixes f :: "nat \<Rightarrow> real"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   949
  fixes n\<^sub>0 :: nat and a b c d :: real and C1 C2 C\<^sub>1 C\<^sub>2 :: real
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   950
  assumes bounds: "a > 0" "c > 0" "a + c < 1" "C\<^sub>1 \<ge> 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   951
  assumes rec: "\<forall>n>n\<^sub>0. f n = f (nat \<lceil>a*n+b\<rceil>) + f (nat \<lceil>c*n+d\<rceil>) + C\<^sub>1 * n + C\<^sub>2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   952
  assumes ineqs: "n\<^sub>0 > (max 0 b + max 0 d + 2) / (1 - a - c)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   953
                 "C\<^sub>3 \<ge> C\<^sub>1 / (1 - a - c)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   954
                 "C\<^sub>3 \<ge> (C\<^sub>1 * n\<^sub>0 + C\<^sub>2 + C\<^sub>4) / ((1 - a - c) * n\<^sub>0 - max 0 b - max 0 d - 2)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   955
                 "\<forall>n\<le>n\<^sub>0. f n \<le> C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   956
  shows   "f n \<le> C\<^sub>3 * n + C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   957
proof (induction n rule: less_induct)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   958
  case (less n)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   959
  have "0 \<le> C\<^sub>1 / (1 - a - c)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   960
    using bounds by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   961
  also have "\<dots> \<le> C\<^sub>3"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   962
    by fact
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   963
  finally have "C\<^sub>3 \<ge> 0" .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   964
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   965
  show ?case
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   966
  proof (cases "n > n\<^sub>0")
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   967
    case False
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   968
    hence "f n \<le> C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   969
      using ineqs(4) by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   970
    also have "\<dots> \<le> C\<^sub>3 * real n + C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   971
      using bounds \<open>C\<^sub>3 \<ge> 0\<close> by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   972
    finally show ?thesis .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   973
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   974
    case True
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   975
    have nonneg: "a * n \<ge> 0" "c * n \<ge> 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   976
      using bounds by simp_all
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   977
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   978
    have "(max 0 b + 1) / (1 - a) \<le> (max 0 b + max 0 d + 2) / (1 - a - c)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   979
      using bounds by (intro frac_le) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   980
    hence "n\<^sub>0 \<ge> (max 0 b + 1) / (1 - a)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   981
      using ineqs(1) by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   982
    hence rec_less1: "nat \<lceil>a*n+b\<rceil> < n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   983
      using bounds \<open>n > n\<^sub>0\<close> by (intro akra_bazzi_light_aux1[of _ n\<^sub>0]) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   984
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   985
    have "(max 0 d + 1) / (1 - c) \<le> (max 0 b + max 0 d + 2) / (1 - a - c)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   986
      using bounds by (intro frac_le) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   987
    hence "n\<^sub>0 \<ge> (max 0 d + 1) / (1 - c)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   988
      using ineqs(1) by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   989
    hence rec_less2: "nat \<lceil>c*n+d\<rceil> < n"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   990
      using bounds \<open>n > n\<^sub>0\<close> by (intro akra_bazzi_light_aux1[of _ n\<^sub>0]) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   991
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   992
    have "f n = f (nat \<lceil>a*n+b\<rceil>) + f (nat \<lceil>c*n+d\<rceil>) + C\<^sub>1 * n + C\<^sub>2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   993
      using \<open>n > n\<^sub>0\<close> by (subst rec) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   994
    also have "\<dots> \<le> (C\<^sub>3 * nat \<lceil>a*n+b\<rceil> + C\<^sub>4) + (C\<^sub>3 * nat \<lceil>c*n+d\<rceil> + C\<^sub>4) + C\<^sub>1 * n + C\<^sub>2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   995
      using rec_less1 rec_less2 by (intro add_mono less.IH) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   996
    also have "\<dots> \<le> (C\<^sub>3 * (a*n+max 0 b+1) + C\<^sub>4) + (C\<^sub>3 * (c*n+max 0 d+1) + C\<^sub>4) + C\<^sub>1 * n + C\<^sub>2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   997
      using bounds \<open>C\<^sub>3 \<ge> 0\<close> nonneg by (intro add_mono mult_left_mono order.refl; linarith)      
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   998
    also have "\<dots> = C\<^sub>3 * n  +  ((C\<^sub>3 * (max 0 b + max 0 d + 2) + 2 * C\<^sub>4 + C\<^sub>2) -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
   999
                                 (C\<^sub>3 * (1 - a - c) - C\<^sub>1) * n)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1000
      by (simp add: algebra_simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1001
    also have "\<dots> \<le> C\<^sub>3 * n  +  ((C\<^sub>3 * (max 0 b + max 0 d + 2) + 2 * C\<^sub>4 + C\<^sub>2) -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1002
                                 (C\<^sub>3 * (1 - a - c) - C\<^sub>1) * n\<^sub>0)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1003
      using \<open>n > n\<^sub>0\<close> ineqs(2) bounds
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1004
      by (intro add_mono diff_mono order.refl mult_left_mono) (auto simp: field_simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1005
    also have "(C\<^sub>3 * (max 0 b + max 0 d + 2) + 2 * C\<^sub>4 + C\<^sub>2) - (C\<^sub>3 * (1 - a - c) - C\<^sub>1) * n\<^sub>0 \<le> C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1006
      using ineqs bounds by (simp add: field_simps)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1007
    finally show "f n \<le> C\<^sub>3 * real n + C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1008
      by (simp add: mult_right_mono)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1009
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1010
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1011
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1012
lemma akra_bazzi_light:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1013
  fixes f :: "nat \<Rightarrow> real"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1014
  fixes n\<^sub>0 :: nat and a b c d C\<^sub>1 C\<^sub>2 :: real
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1015
  assumes bounds: "a > 0" "c > 0" "a + c < 1" "C\<^sub>1 \<ge> 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1016
  assumes rec: "\<forall>n>n\<^sub>0. f n = f (nat \<lceil>a*n+b\<rceil>) + f (nat \<lceil>c*n+d\<rceil>) + C\<^sub>1 * n + C\<^sub>2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1017
  shows "\<exists>C\<^sub>3 C\<^sub>4. \<forall>n. f n \<le> C\<^sub>3 * real n + C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1018
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1019
  define n\<^sub>0' where "n\<^sub>0' = max n\<^sub>0 (nat \<lceil>(max 0 b + max 0 d + 2) / (1 - a - c) + 1\<rceil>)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1020
  define C\<^sub>4 where "C\<^sub>4 = Max (f ` {..n\<^sub>0'})"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1021
  define C\<^sub>3 where "C\<^sub>3 = max (C\<^sub>1 / (1 - a - c))
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1022
                         ((C\<^sub>1 * n\<^sub>0' + C\<^sub>2 + C\<^sub>4) / ((1 - a - c) * n\<^sub>0' - max 0 b - max 0 d - 2))"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1023
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1024
  have "f n \<le> C\<^sub>3 * n + C\<^sub>4" for n
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1025
  proof (rule akra_bazzi_light_aux2[OF bounds _])
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1026
    show "\<forall>n>n\<^sub>0'. f n = f (nat \<lceil>a*n+b\<rceil>) + f (nat \<lceil>c*n+d\<rceil>) + C\<^sub>1 * n + C\<^sub>2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1027
      using rec by (auto simp: n\<^sub>0'_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1028
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1029
    show "C\<^sub>3 \<ge> C\<^sub>1 / (1 - a - c)" 
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1030
     and "C\<^sub>3 \<ge> (C\<^sub>1 * n\<^sub>0' + C\<^sub>2 + C\<^sub>4) / ((1 - a - c) * n\<^sub>0' - max 0 b - max 0 d - 2)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1031
      by (simp_all add: C\<^sub>3_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1032
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1033
    have "(max 0 b + max 0 d + 2) / (1 - a - c) < nat \<lceil>(max 0 b + max 0 d + 2) / (1 - a - c) + 1\<rceil>"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1034
      by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1035
    also have "\<dots> \<le> n\<^sub>0'"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1036
      by (simp add: n\<^sub>0'_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1037
    finally show "(max 0 b + max 0 d + 2) / (1 - a - c) < real n\<^sub>0'" .
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1038
  next
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1039
    show "\<forall>n\<le>n\<^sub>0'. f n \<le> C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1040
      by (auto simp: C\<^sub>4_def)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1041
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1042
  thus ?thesis by blast
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1043
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1044
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1045
lemma akra_bazzi_light_nat:
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1046
  fixes f :: "nat \<Rightarrow> nat"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1047
  fixes n\<^sub>0 :: nat and a b c d :: real and C\<^sub>1 C\<^sub>2 :: nat
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1048
  assumes bounds: "a > 0" "c > 0" "a + c < 1" "C\<^sub>1 \<ge> 0"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1049
  assumes rec: "\<forall>n>n\<^sub>0. f n = f (nat \<lceil>a*n+b\<rceil>) + f (nat \<lceil>c*n+d\<rceil>) + C\<^sub>1 * n + C\<^sub>2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1050
  shows "\<exists>C\<^sub>3 C\<^sub>4. \<forall>n. f n \<le> C\<^sub>3 * n + C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1051
proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1052
  have "\<exists>C\<^sub>3 C\<^sub>4. \<forall>n. real (f n) \<le> C\<^sub>3 * real n + C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1053
    using assms by (intro akra_bazzi_light[of a c C\<^sub>1 n\<^sub>0 f b d C\<^sub>2]) auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1054
  then obtain C\<^sub>3 C\<^sub>4 where le: "\<forall>n. real (f n) \<le> C\<^sub>3 * real n + C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1055
    by blast
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1056
  have "f n \<le> nat \<lceil>C\<^sub>3\<rceil> * n + nat \<lceil>C\<^sub>4\<rceil>" for n
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1057
  proof -
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1058
    have "real (f n) \<le> C\<^sub>3 * real n + C\<^sub>4"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1059
      using le by blast
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1060
    also have "\<dots> \<le> real (nat \<lceil>C\<^sub>3\<rceil>) * real n + real (nat \<lceil>C\<^sub>4\<rceil>)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1061
      by (intro add_mono mult_right_mono; linarith)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1062
    also have "\<dots> = real (nat \<lceil>C\<^sub>3\<rceil> * n + nat \<lceil>C\<^sub>4\<rceil>)"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1063
      by simp
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1064
    finally show ?thesis by linarith
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1065
  qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1066
  thus ?thesis by blast
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1067
qed
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1068
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1069
lemma T'_mom_select_le': "\<exists>C\<^sub>1 C\<^sub>2. \<forall>n. T'_mom_select n \<le> C\<^sub>1 * n + C\<^sub>2"
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1070
proof (rule akra_bazzi_light_nat)
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1071
  show "\<forall>n>20. T'_mom_select n = T'_mom_select (nat \<lceil>0.2 * n + 0\<rceil>) +
80107
247751d25102 canonical time function for List.nth
Manuel Eberl <eberlm@in.tum.de>
parents: 80093
diff changeset
  1072
                 T'_mom_select (nat \<lceil>0.7 * n + 3\<rceil>) + 19 * n + 54"
73108
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1073
    using T'_mom_select.simps by auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1074
qed auto
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1075
981a383610df HOL-Data_Structures: added Selection and time functions for list functions
Manuel Eberl <eberlm@in.tum.de>
parents:
diff changeset
  1076
end