author | nipkow |
Wed, 06 Nov 2024 18:10:39 +0100 | |
changeset 81357 | 21a493abde0f |
parent 81291 | d6daa049c1db |
child 81465 | 42b0f923fd82 |
permissions | -rw-r--r-- |
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 | 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 | 20 |
lemma insort_correct: "insort xs = sort xs" |
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 | 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 | 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 | 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 |