lemma distinctI: assumes"∧i j. i < j ==> i < length xs ==> j < length xs ==> xs ! i ≠ xs ! j" shows"distinct xs" by (metis assms distinct_conv_nth nat_neq_iff)
lemma filter_nth_pairE: assumes"i < j"and"i < length (filter P xs)"and"j < length (filter P xs)" obtains i' j' where"i' < j'"and"i' < length xs"and"j' < length xs" and"(filter P xs) ! i = xs ! i'"and"(filter P xs) ! j = xs ! j'" using assms proof (induct xs arbitrary: i j thesis) case Nil from Nil(3) show ?caseby simp next case (Cons x xs) let ?ys = "filter P (x # xs)" show ?case proof (cases "P x") case True hence *: "?ys = x # (filter P xs)"by simp from‹i < j›obtain j0 where j: "j = Suc j0"using lessE by blast have len_ys: "length ?ys = Suc (length (filter P xs))"and ys_j: "?ys ! j = (filter P xs) ! j0" by (simp only: * length_Cons, simp only: j * nth_Cons_Suc) from Cons(5) have"j0 < length (filter P xs)"unfolding len_ys j by auto show ?thesis proof (cases "i = 0") case True from‹j0 < length (filter P xs)›obtain j' where"j' < length xs"and **: "(filter P xs) ! j0 = xs ! j'" by (metis (no_types, lifting) in_set_conv_nth mem_Collect_eq nth_mem set_filter) have"0 < Suc j'"by simp thus ?thesis by (rule Cons(2), simp, simp add: ‹j' < length xs›, simp only: True * nth_Cons_0,
simp only: ys_j nth_Cons_Suc **) next case False thenobtain i0 where i: "i = Suc i0"using lessE by blast have ys_i: "?ys ! i = (filter P xs) ! i0"by (simp only: i * nth_Cons_Suc) from Cons(3) have"i0 < j0"by (simp add: i j) from Cons(4) have"i0 < length (filter P xs)"unfolding len_ys i by auto from _ ‹i0 < j0› this ‹j0 < length (filter P xs)›obtain i' j' where"i' < j'"and"i' < length xs"and"j' < length xs" and i': "filter P xs ! i0 = xs ! i'"and j': "filter P xs ! j0 = xs ! j'" by (rule Cons(1)) from‹i' < j'›have"Suc i' < Suc j'"by simp thus ?thesis by (rule Cons(2), simp add: ‹i' < length xs›, simp add: ‹j' < length xs›,
simp only: ys_i nth_Cons_Suc i', simp only: ys_j nth_Cons_Suc j') qed next case False hence *: "?ys = filter P xs"by simp with Cons(4) Cons(5) have"i < length (filter P xs)"and"j < length (filter P xs)"by simp_all with _ ‹i < j›obtain i' j' where"i' < j'"and"i' < length xs"and"j' < length xs" and i': "filter P xs ! i = xs ! i'"and j': "filter P xs ! j = xs ! j'" by (rule Cons(1)) from‹i' < j'›have"Suc i' < Suc j'"by simp thus ?thesis by (rule Cons(2), simp add: ‹i' < length xs›, simp add: ‹j' < length xs›,
simp only: * nth_Cons_Suc i', simp only: * nth_Cons_Suc j') qed qed
lemma distinct_filterI: assumes"∧i j. i < j ==> i < length xs ==> j < length xs ==> P (xs ! i) ==> P (xs ! j) ==> xs ! i ≠ xs ! j" shows"distinct (filter P xs)" proof (rule distinctI) fix i j::nat assume"i < j"and"i < length (filter P xs)"and"j < length (filter P xs)" thenobtain i' j' where"i' < j'"and"i' < length xs"and"j' < length xs" and i: "(filter P xs) ! i = xs ! i'"and j: "(filter P xs) ! j = xs ! j'"by (rule filter_nth_pairE) from‹i' < j'›‹i' < length xs›‹j' < length xs›show"(filter P xs) ! i ≠ (filter P xs) ! j"unfolding i j proof (rule assms) from‹i < length (filter P xs)›show"P (xs ! i')"unfolding i[symmetric] using nth_mem by force next from‹j < length (filter P xs)›show"P (xs ! j')"unfolding j[symmetric] using nth_mem by force qed qed
lemma set_zip_map: "set (zip (map f xs) (map g xs)) = (λx. (f x, g x)) ` (set xs)" by (auto simp add: set_zip) (metis in_set_conv_nth nth_map)
lemma set_zip_map1: "set (zip (map f xs) xs) = (λx. (f x, x)) ` (set xs)" by (metis set_zip_map map_ident)
lemma set_zip_map2: "set (zip xs (map f xs)) = (λx. (x, f x)) ` (set xs)" by (metis (no_types, lifting) ext map_ident set_zip_map)
lemma UN_upt: "(∪i∈{0..<length xs}. f (xs ! i)) = (∪x∈set xs. f x)" by (metis image_image map_nth set_map set_upt)
lemma sum_list_zeroI': assumes"∧i. i < length xs ==> xs ! i = 0" shows"sum_list xs = 0" by (metis assms in_set_conv_nth insert_iff subsetI sum_list_zeroI)
lemma sum_list_map2_plus: assumes"length xs = length ys" shows"sum_list (map2 (+) xs ys) = sum_list xs + sum_list (ys::'a::comm_monoid_add list)" using assms proof (induct rule: list_induct2) case Nil show ?caseby simp next case (Cons x xs y ys) show ?caseby (simp add: Cons(2) ac_simps) qed
lemma sum_list_eq_nthI: assumes"i < length xs"and"∧j. j < length xs ==> j ≠ i ==> xs ! j = 0" shows"sum_list xs = xs ! i" using assms proof (induct xs arbitrary: i) case Nil from Nil(1) show ?caseby simp next case (Cons x xs) have *: "xs ! j = 0"if"j < length xs"and"Suc j ≠ i"for j proof - have"xs ! j = (x # xs) ! (Suc j)"by simp alsohave"... = 0"by (rule Cons(3), simp add: ‹j < length xs›, fact) finallyshow ?thesis . qed show ?case proof (cases i) case0 have"sum_list xs = 0"by (rule sum_list_zeroI', erule *, simp add: 0) with0show ?thesis by simp next case (Suc k) with Cons(2) have"k < length xs"by simp hence"sum_list xs = xs ! k" proof (rule Cons(1)) fix j assume"j < length xs" assume"j ≠ k" hence"Suc j ≠ i"by (simp add: Suc) with‹j < length xs›show"xs ! j = 0"by (rule *) qed moreoverhave"x = 0" proof - have"x = (x # xs) ! 0"by simp alsohave"... = 0"by (rule Cons(3), simp_all add: Suc) finallyshow ?thesis . qed ultimatelyshow ?thesis by (simp add: Suc) qed qed
subsubsection‹‹max_list››
fun (in ord) max_list :: "'a list ==> 'a"where "max_list (x # xs) = (case xs of [] ==> x | _ ==> max x (max_list xs))"
context linorder begin
lemma max_list_Max: "xs ≠ [] ==> max_list xs = Max (set xs)" by (induct xs rule: induct_list012, auto)
lemma max_list_ge: assumes"x ∈ set xs" shows"x ≤ max_list xs" proof - from assms have"xs ≠ []"by auto from finite_set assms have"x ≤ Max (set xs)"by (rule Max_ge) alsofrom‹xs ≠ []›have"Max (set xs) = max_list xs"by (rule max_list_Max[symmetric]) finallyshow ?thesis . qed
lemma max_list_boundedI: assumes"xs ≠ []"and"∧x. x ∈ set xs ==> x ≤ a" shows"max_list xs ≤ a" proof - from assms(1) have"set xs ≠ {}"by simp from assms(1) have"max_list xs = Max (set xs)"by (rule max_list_Max) alsofrom finite_set ‹set xs ≠ {}› assms(2) have"…≤ a"by (rule Max.boundedI) finallyshow ?thesis . qed
end
subsubsection‹‹insort_wrt››
primrec insort_wrt :: "('c ==> 'c ==> bool) ==> 'c ==> 'c list ==> 'c list"where "insort_wrt _ x [] = [x]" | "insort_wrt r x (y # ys) = (if r x y then (x # y # ys) else y # (insort_wrt r x ys))"
lemma insort_wrt_not_Nil [simp]: "insort_wrt r x xs ≠ []" by (induct xs, simp_all)
lemma length_insort_wrt [simp]: "length (insort_wrt r x xs) = Suc (length xs)" by (induct xs, simp_all)
lemma set_insort_wrt [simp]: "set (insort_wrt r x xs) = insert x (set xs)" by (induct xs, auto)
lemma sorted_wrt_insort_wrt_imp_sorted_wrt: assumes"sorted_wrt r (insort_wrt s x xs)" shows"sorted_wrt r xs" using assms proof (induct xs) case Nil show ?caseby simp next case (Cons a xs) show ?case proof (cases "s x a") case True with Cons.prems have"sorted_wrt r (x # a # xs)"by simp thus ?thesis by simp next case False with Cons(2) have"sorted_wrt r (a # (insort_wrt s x xs))"by simp hence *: "(∀y∈set xs. r a y)"and"sorted_wrt r (insort_wrt s x xs)" by (simp_all) from this(2) have"sorted_wrt r xs"by (rule Cons(1)) with * show ?thesis by (simp) qed qed
lemma sorted_wrt_imp_sorted_wrt_insort_wrt: assumes"transp r"and"∧a. r a x ∨ r x a"and"sorted_wrt r xs" shows"sorted_wrt r (insort_wrt r x xs)" using assms(3) proof (induct xs) case Nil show ?caseby simp next case (Cons a xs) show ?case proof (cases "r x a") case True with Cons(2) assms(1) show ?thesis by (auto dest: transpD) next case False with assms(2) have"r a x"by blast from Cons(2) have *: "(∀y∈set xs. r a y)"and"sorted_wrt r xs" by (simp_all) from this(2) have"sorted_wrt r (insort_wrt r x xs)"by (rule Cons(1)) with‹r a x› * show ?thesis by (simp add: False) qed qed
corollary sorted_wrt_insort_wrt: assumes"transp r"and"∧a. r a x ∨ r x a" shows"sorted_wrt r (insort_wrt r x xs) ⟷ sorted_wrt r xs" (is"?l ⟷ ?r") proof assume ?l thenshow ?r by (rule sorted_wrt_insort_wrt_imp_sorted_wrt) next assume ?r with assms show ?l by (rule sorted_wrt_imp_sorted_wrt_insort_wrt) qed
subsubsection‹‹diff_list› and ‹insert_list››
notation minus_list_set (infixl‹--›65) declare set_minus_list_set[simp] definition insert_list :: "'a ==> 'a list ==> 'a list" where"insert_list x xs = (if x ∈ set xs then xs else x # xs)"
lemma set_insert_list: "set (insert_list x xs) = insert x (set xs)" by (auto simp add: insert_list_def)
subsubsection‹‹remdups_wrt››
primrec remdups_wrt :: "('a ==> 'b) ==> 'a list ==> 'a list"where
remdups_wrt_base: "remdups_wrt _ [] = []" |
remdups_wrt_rec: "remdups_wrt f (x # xs) = (if f x ∈ f ` set xs then remdups_wrt f xs else x # remdups_wrt f xs)"
lemma set_remdups_wrt: "f ` set (remdups_wrt f xs) = f ` set xs" proof (induct xs) case Nil show ?caseunfolding remdups_wrt_base .. next case (Cons a xs) show ?caseunfolding remdups_wrt_rec proof (simp only: split: if_splits, intro conjI, intro impI) assume"f a ∈ f ` set xs" have"f ` set (a # xs) = insert (f a) (f ` set xs)"by simp have"f ` set (remdups_wrt f xs) = f ` set xs"by fact alsofrom‹f a ∈ f ` set xs›have"... = insert (f a) (f ` set xs)"by (simp add: insert_absorb) alsohave"... = f ` set (a # xs)"by simp finallyshow"f ` set (remdups_wrt f xs) = f ` set (a # xs)" . qed (simp add: Cons.hyps) qed
lemma subset_remdups_wrt: "set (remdups_wrt f xs) ⊆ set xs" by (induct xs, auto)
lemma remdups_wrt_distinct_wrt: assumes"x ∈ set (remdups_wrt f xs)"and"y ∈ set (remdups_wrt f xs)"and"x ≠ y" shows"f x ≠ f y" using assms(1) assms(2) proof (induct xs) case Nil thus ?caseunfolding remdups_wrt_base by simp next case (Cons a xs) from Cons(2) Cons(3) show ?caseunfolding remdups_wrt_rec proof (simp only: split: if_splits) assume"x ∈ set (remdups_wrt f xs)"and"y ∈ set (remdups_wrt f xs)" thus"f x ≠ f y"by (rule Cons.hyps) next assume"¬ True" thus"f x ≠ f y"by simp next assume"f a ∉ f ` set xs"and xin: "x ∈ set (a # remdups_wrt f xs)"and yin: "y ∈ set (a # remdups_wrt f xs)" from yin have y: "y = a ∨ y ∈ set (remdups_wrt f xs)"by simp from xin have"x = a ∨ x ∈ set (remdups_wrt f xs)"by simp thus"f x ≠ f y" proof assume"x = a" from y show ?thesis proof assume"y = a" with‹x ≠ y›show ?thesis unfolding‹x = a›by simp next assume"y ∈ set (remdups_wrt f xs)" have"y ∈ set xs"by (rule, fact, rule subset_remdups_wrt) hence"f y ∈ f ` set xs"by simp with‹f a ∉ f ` set xs›show ?thesis unfolding‹x = a›by auto qed next assume"x ∈ set (remdups_wrt f xs)" from y show ?thesis proof assume"y = a" have"x ∈ set xs"by (rule, fact, rule subset_remdups_wrt) hence"f x ∈ f ` set xs"by simp with‹f a ∉ f ` set xs›show ?thesis unfolding‹y = a›by auto next assume"y ∈ set (remdups_wrt f xs)" with‹x ∈ set (remdups_wrt f xs)›show ?thesis by (rule Cons.hyps) qed qed qed qed
lemma distinct_remdups_wrt: "distinct (remdups_wrt f xs)" proof (induct xs) case Nil show ?caseunfolding remdups_wrt_base by simp next case (Cons a xs) show ?caseunfolding remdups_wrt_rec proof (split if_split, intro conjI impI, rule Cons.hyps) assume"f a ∉ f ` set xs" hence"a ∉ set xs"by auto hence"a ∉ set (remdups_wrt f xs)"using subset_remdups_wrt[of f xs] by auto with Cons.hyps show"distinct (a # remdups_wrt f xs)"by simp qed qed
lemma map_remdups_wrt: "map f (remdups_wrt f xs) = remdups (map f xs)" by (induct xs, auto)
lemma remdups_wrt_append: "remdups_wrt f (xs @ ys) = (filter (λa. f a ∉ f ` set ys) (remdups_wrt f xs)) @ (remdups_wrt f ys)" by (induct xs, auto)
subsubsection‹‹map_idx››
primrec map_idx :: "('a ==> nat ==> 'b) ==> 'a list ==> nat ==> 'b list"where "map_idx f [] n = []"| "map_idx f (x # xs) n = (f x n) # (map_idx f xs (Suc n))"
lemma map_idx_eq_map2: "map_idx f xs n = map2 f xs [n..<n + length xs]" proof (induct xs arbitrary: n) case Nil show ?caseby simp next case (Cons x xs) have eq: "[n..<n + length (x # xs)] = n # [Suc n..<Suc (n + length xs)]" by (metis add_Suc_right length_Cons less_add_Suc1 upt_conv_Cons) show ?caseunfolding eq by (simp add: Cons del: upt_Suc) qed
lemma length_map_idx [simp]: "length (map_idx f xs n) = length xs" by (simp add: map_idx_eq_map2)
lemma map_idx_append: "map_idx f (xs @ ys) n = (map_idx f xs n) @ (map_idx f ys (n + length xs))" by (simp add: map_idx_eq_map2 ab_semigroup_add_class.add_ac(1) zip_append1)
lemma map_idx_nth: assumes"i < length xs" shows"(map_idx f xs n) ! i = f (xs ! i) (n + i)" using assms by (simp add: map_idx_eq_map2)
lemma map_map_idx: "map f (map_idx g xs n) = map_idx (λx i. f (g x i)) xs n" by (auto simp add: map_idx_eq_map2)
lemma map_idx_map: "map_idx f (map g xs) n = map_idx (f ∘ g) xs n" by (simp add: map_idx_eq_map2 map_zip_map)
lemma map_idx_no_idx: "map_idx (λx _. f x) xs n = map f xs" by (induct xs arbitrary: n, simp_all)
lemma map_idx_no_elem: "map_idx (λ_. f) xs n = map f [n..<n + length xs]" proof (induct xs arbitrary: n) case Nil show ?caseby simp next case (Cons x xs) have eq: "[n..<n + length (x # xs)] = n # [Suc n..<Suc (n + length xs)]" by (metis add_Suc_right length_Cons less_add_Suc1 upt_conv_Cons) show ?caseunfolding eq by (simp add: Cons del: upt_Suc) qed
lemma map_idx_eq_map: "map_idx f xs n = map (λi. f (xs ! i) (i + n)) [0..<length xs]" proof (induct xs arbitrary: n) case Nil show ?caseby simp next case (Cons x xs) have eq: "[0..<length (x # xs)] = 0 # [Suc 0..<Suc (length xs)]" by (metis length_Cons upt_conv_Cons zero_less_Suc) have"map (λi. f ((x # xs) ! i) (i + n)) [Suc 0..<Suc (length xs)] = map ((λi. f ((x # xs) ! i) (i + n)) ∘ Suc) [0..<length xs]" by (metis map_Suc_upt map_map) alsohave"... = map (λi. f (xs ! i) (Suc (i + n))) [0..<length xs]" by (rule map_cong, fact refl, simp) finallyshow ?caseunfolding eq by (simp add: Cons del: upt_Suc) qed
lemma set_map_idx: "set (map_idx f xs n) = (λi. f (xs ! i) (i + n)) ` {0..<length xs}" by (simp add: map_idx_eq_map)
subsubsection‹‹map_dup››
primrec map_dup :: "('a ==> 'b) ==> ('a ==> 'b) ==> 'a list ==> 'b list"where "map_dup _ _ [] = []"| "map_dup f g (x # xs) = (if x ∈ set xs then g x else f x) # (map_dup f g xs)"
lemma length_map_dup[simp]: "length (map_dup f g xs) = length xs" by (induct xs, simp_all)
lemma map_dup_distinct: assumes"distinct xs" shows"map_dup f g xs = map f xs" using assms by (induct xs, simp_all)
lemma filter_map_dup_const: "filter (λx. x ≠ c) (map_dup f (λ_. c) xs) = filter (λx. x ≠ c) (map f (remdups xs))" by (induct xs, simp_all)
lemma filter_zip_map_dup_const: "filter (λ(a, b). a ≠ c) (zip (map_dup f (λ_. c) xs) xs) = filter (λ(a, b). a ≠ c) (zip (map f (remdups xs)) (remdups xs))" by (induct xs, simp_all)
subsubsection‹Filtering Minimal Elements›
context fixes rel :: "'a ==> 'a ==> bool" begin
primrec filter_min_aux :: "'a list ==> 'a list ==> 'a list"where "filter_min_aux [] ys = ys"| "filter_min_aux (x # xs) ys = (if (∃y∈(set xs ∪ set ys). rel y x) then (filter_min_aux xs ys) else (filter_min_aux xs (x # ys)))"
definition filter_min :: "'a list ==> 'a list" where"filter_min xs = filter_min_aux xs []"
definition filter_min_append :: "'a list ==> 'a list ==> 'a list" where"filter_min_append xs ys = (let P = (λzs. λx. ¬ (∃z∈set zs. rel z x)); ys1 = filter (P xs) ys in (filter (P ys1) xs) @ ys1)"
lemma filter_min_aux_supset: "set ys ⊆ set (filter_min_aux xs ys)" proof (induct xs arbitrary: ys) case Nil show ?caseby simp next case (Cons x xs) have"set ys ⊆ set (x # ys)"by auto alsohave"set (x # ys) ⊆ set (filter_min_aux xs (x # ys))"by (rule Cons.hyps) finallyhave"set ys ⊆ set (filter_min_aux xs (x # ys))" . moreoverhave"set ys ⊆ set (filter_min_aux xs ys)"by (rule Cons.hyps) ultimatelyshow ?caseby simp qed
lemma filter_min_aux_subset: "set (filter_min_aux xs ys) ⊆ set xs ∪ set ys" proof (induct xs arbitrary: ys) case Nil show ?caseby simp next case (Cons x xs) note Cons.hyps alsohave"set xs ∪ set ys ⊆ set (x # xs) ∪ set ys"by fastforce finallyhave c1: "set (filter_min_aux xs ys) ⊆ set (x # xs) ∪ set ys" .
note Cons.hyps alsohave"set xs ∪ set (x # ys) = set (x # xs) ∪ set ys"by simp finallyhave"set (filter_min_aux xs (x # ys)) ⊆ set (x # xs) ∪ set ys" . with c1 show ?caseby simp qed
lemma filter_min_aux_relE: assumes"transp rel"and"x ∈ set xs"and"x ∉ set (filter_min_aux xs ys)" obtains y where"y ∈ set (filter_min_aux xs ys)"and"rel y x" using assms(2, 3) proof (induct xs arbitrary: x ys thesis) case Nil from Nil(2) show ?caseby simp next case (Cons x0 xs) from Cons(3) have"x = x0 ∨ x ∈ set xs"by simp thus ?case proof assume"x = x0" from Cons(4) have *: "∃y∈set xs ∪ set ys. rel y x0" proof (simp add: ‹x = x0› split: if_splits) assume"x0 ∉ set (filter_min_aux xs (x0 # ys))" moreoverfrom filter_min_aux_supset have"x0 ∈ set (filter_min_aux xs (x0 # ys))" by (rule subsetD) simp ultimatelyshow False .. qed hence eq: "filter_min_aux (x0 # xs) ys = filter_min_aux xs ys"by simp from * obtain x1 where"x1 ∈ set xs ∪ set ys"and"rel x1 x"unfolding‹x = x0› .. from this(1) show ?thesis proof assume"x1 ∈ set xs" show ?thesis proof (cases "x1 ∈ set (filter_min_aux xs ys)") case True hence"x1 ∈ set (filter_min_aux (x0 # xs) ys)"by (simp only: eq) thus ?thesis using‹rel x1 x›by (rule Cons(2)) next case False with‹x1 ∈ set xs›obtain y where"y ∈ set (filter_min_aux xs ys)"and"rel y x1" using Cons.hyps by blast from this(1) have"y ∈ set (filter_min_aux (x0 # xs) ys)"by (simp only: eq) moreoverfrom assms(1) ‹rel y x1›‹rel x1 x›have"rel y x"by (rule transpD) ultimatelyshow ?thesis by (rule Cons(2)) qed next assume"x1 ∈ set ys" hence"x1 ∈ set (filter_min_aux (x0 # xs) ys)"using filter_min_aux_supset .. thus ?thesis using‹rel x1 x›by (rule Cons(2)) qed next assume"x ∈ set xs" show ?thesis proof (cases "∃y∈set xs ∪ set ys. rel y x0") case True hence eq: "filter_min_aux (x0 # xs) ys = filter_min_aux xs ys"by simp with Cons(4) have"x ∉ set (filter_min_aux xs ys)"by simp with‹x ∈ set xs›obtain y where"y ∈ set (filter_min_aux xs ys)"and"rel y x" using Cons.hyps by blast from this(1) have"y ∈ set (filter_min_aux (x0 # xs) ys)"by (simp only: eq) thus ?thesis using‹rel y x›by (rule Cons(2)) next case False hence eq: "filter_min_aux (x0 # xs) ys = filter_min_aux xs (x0 # ys)"by simp with Cons(4) have"x ∉ set (filter_min_aux xs (x0 # ys))"by simp with‹x ∈ set xs›obtain y where"y ∈ set (filter_min_aux xs (x0 # ys))"and"rel y x" using Cons.hyps by blast from this(1) have"y ∈ set (filter_min_aux (x0 # xs) ys)"by (simp only: eq) thus ?thesis using‹rel y x›by (rule Cons(2)) qed qed qed
lemma filter_min_aux_minimal: assumes"transp rel"and"x ∈ set (filter_min_aux xs ys)"and"y ∈ set (filter_min_aux xs ys)" and"rel x y" assumes"∧a b. a ∈ set xs ∪ set ys ==> b ∈ set ys ==> rel a b ==> a = b" shows"x = y" using assms(2-5) proof (induct xs arbitrary: x y ys) case Nil from Nil(1) have"x ∈ set [] ∪ set ys"by simp moreoverfrom Nil(2) have"y ∈ set ys"by simp ultimatelyshow ?caseusing Nil(3) by (rule Nil(4)) next case (Cons x0 xs) show ?case proof (cases "∃y∈set xs ∪ set ys. rel y x0") case True hence eq: "filter_min_aux (x0 # xs) ys = filter_min_aux xs ys"by simp with Cons(2, 3) have"x ∈ set (filter_min_aux xs ys)"and"y ∈ set (filter_min_aux xs ys)" by simp_all thus ?thesis using Cons(4) proof (rule Cons.hyps) fix a b assume"a ∈ set xs ∪ set ys" hence"a ∈ set (x0 # xs) ∪ set ys"by simp moreoverassume"b ∈ set ys"and"rel a b" ultimatelyshow"a = b"by (rule Cons(5)) qed next case False hence eq: "filter_min_aux (x0 # xs) ys = filter_min_aux xs (x0 # ys)"by simp with Cons(2, 3) have"x ∈ set (filter_min_aux xs (x0 # ys))"and"y ∈ set (filter_min_aux xs (x0 # ys))" by simp_all thus ?thesis using Cons(4) proof (rule Cons.hyps) fix a b assume a: "a ∈ set xs ∪ set (x0 # ys)"and"b ∈ set (x0 # ys)"and"rel a b" from this(2) have"b = x0 ∨ b ∈ set ys"by simp thus"a = b" proof assume"b = x0" from a have"a = x0 ∨ a ∈ set xs ∪ set ys"by simp thus ?thesis proof assume"a = x0" with‹b = x0›show ?thesis by simp next assume"a ∈ set xs ∪ set ys" hence"∃y∈set xs ∪ set ys. rel y x0"using‹rel a b›unfolding‹b = x0› .. with False show ?thesis .. qed next from a have"a ∈ set (x0 # xs) ∪ set ys"by simp moreoverassume"b ∈ set ys" ultimatelyshow ?thesis using‹rel a b›by (rule Cons(5)) qed qed qed qed
lemma filter_min_aux_distinct: assumes"reflp rel"and"distinct ys" shows"distinct (filter_min_aux xs ys)" using assms(2) proof (induct xs arbitrary: ys) case Nil thus ?caseby simp next case (Cons x xs) show ?case proof (simp split: if_split, intro conjI impI) from Cons(2) show"distinct (filter_min_aux xs ys)"by (rule Cons.hyps) next assume a: "∀y∈set xs ∪ set ys. ¬ rel y x" show"distinct (filter_min_aux xs (x # ys))" proof (rule Cons.hyps) have"x ∉ set ys" proof assume"x ∈ set ys" hence"x ∈ set xs ∪ set ys"by simp with a have"¬ rel x x" .. moreoverfrom assms(1) have"rel x x"by (rule reflpD) ultimatelyshow False .. qed with Cons(2) show"distinct (x # ys)"by simp qed qed qed
lemma filter_min_subset: "set (filter_min xs) ⊆ set xs" using filter_min_aux_subset[of xs "[]"] by (simp add: filter_min_def)
lemma filter_min_cases: assumes"transp rel"and"x ∈ set xs" assumes"x ∈ set (filter_min xs) ==> thesis" assumes"∧y. y ∈ set (filter_min xs) ==> x ∉ set (filter_min xs) ==> rel y x ==>thesis" shows thesis proof (cases "x ∈ set (filter_min xs)") case True thus ?thesis by (rule assms(3)) next case False with assms(1, 2) obtain y where"y ∈ set (filter_min xs)"and"rel y x" unfolding filter_min_def by (rule filter_min_aux_relE) from this(1) False this(2) show ?thesis by (rule assms(4)) qed
corollary filter_min_relE: assumes"transp rel"and"reflp rel"and"x ∈ set xs" obtains y where"y ∈ set (filter_min xs)"and"rel y x" using assms(1, 3) proof (rule filter_min_cases) assume"x ∈ set (filter_min xs)" moreoverfrom assms(2) have"rel x x"by (rule reflpD) ultimatelyshow ?thesis .. qed
lemma filter_min_minimal: assumes"transp rel"and"x ∈ set (filter_min xs)"and"y ∈ set (filter_min xs)"and"rel x y" shows"x = y" using assms unfolding filter_min_def by (rule filter_min_aux_minimal) simp
lemma filter_min_append_subset: "set (filter_min_append xs ys) ⊆ set xs ∪ set ys" by (auto simp: filter_min_append_def)
lemma filter_min_append_cases: assumes"transp rel"and"x ∈ set xs ∪ set ys" assumes"x ∈ set (filter_min_append xs ys) ==> thesis" assumes"∧y. y ∈ set (filter_min_append xs ys) ==> x ∉ set (filter_min_append xs ys) ==> rel y x ==> thesis" shows thesis proof (cases "x ∈ set (filter_min_append xs ys)") case True thus ?thesis by (rule assms(3)) next case False
define P where"P = (λzs. λa. ¬ (∃z∈set zs. rel z a))" from assms(2) obtain y where"y ∈ set (filter_min_append xs ys)"and"rel y x" proof assume"x ∈ set xs" with False obtain y where"y ∈ set (filter_min_append xs ys)"and"rel y x" by (auto simp: filter_min_append_def P_def) thus ?thesis .. next assume"x ∈ set ys" with False obtain y where"y ∈ set xs"and"rel y x" by (auto simp: filter_min_append_def P_def) show ?thesis proof (cases "y ∈ set (filter_min_append xs ys)") case True thus ?thesis using‹rel y x› .. next case False with‹y ∈ set xs›obtain y' where y': "y' ∈ set (filter_min_append xs ys)"and"rel y' y" by (auto simp: filter_min_append_def P_def) from assms(1) this(2) ‹rel y x›have"rel y' x"by (rule transpD) with y' show ?thesis .. qed qed from this(1) False this(2) show ?thesis by (rule assms(4)) qed
corollary filter_min_append_relE: assumes"transp rel"and"reflp rel"and"x ∈ set xs ∪ set ys" obtains y where"y ∈ set (filter_min_append xs ys)"and"rel y x" using assms(1, 3) proof (rule filter_min_append_cases) assume"x ∈ set (filter_min_append xs ys)" moreoverfrom assms(2) have"rel x x"by (rule reflpD) ultimatelyshow ?thesis .. qed
lemma filter_min_append_minimal: assumes"∧x' y'. x' ∈ set xs ==> y' ∈ set xs ==> rel x' y' ==> x' = y'" and"∧x' y'. x' ∈ set ys ==> y' ∈ set ys ==> rel x' y' ==> x' = y'" and"x ∈ set (filter_min_append xs ys)"and"y ∈ set (filter_min_append xs ys)"and"rel x y" shows"x = y" proof -
define P where"P = (λzs. λa. ¬ (∃z∈set zs. rel z a))"
define ys1 where"ys1 = filter (P xs) ys" from assms(3) have"x ∈ set xs ∪ set ys1" by (auto simp: filter_min_append_def P_def ys1_def) moreoverfrom assms(4) have"y ∈ set (filter (P ys1) xs) ∪ set ys1" by (simp add: filter_min_append_def P_def ys1_def) ultimatelyshow ?thesis proof (elim UnE) assume"x ∈ set xs" assume"y ∈ set (filter (P ys1) xs)" hence"y ∈ set xs"by simp with‹x ∈ set xs›show ?thesis using assms(5) by (rule assms(1)) next assume"y ∈ set ys1" hence"∧z. z ∈ set xs ==>¬ rel z y"by (simp add: ys1_def P_def) moreoverassume"x ∈ set xs" ultimatelyhave"¬ rel x y"by blast thus ?thesis using‹rel x y› .. next assume"y ∈ set (filter (P ys1) xs)" hence"∧z. z ∈ set ys1 ==>¬ rel z y"by (simp add: P_def) moreoverassume"x ∈ set ys1" ultimatelyhave"¬ rel x y"by blast thus ?thesis using‹rel x y› .. next assume"x ∈ set ys1"and"y ∈ set ys1" hence"x ∈ set ys"and"y ∈ set ys"by (simp_all add: ys1_def) thus ?thesis using assms(5) by (rule assms(2)) qed qed
lemma filter_min_append_distinct: assumes"reflp rel"and"distinct xs"and"distinct ys" shows"distinct (filter_min_append xs ys)" proof -
define P where"P = (λzs. λa. ¬ (∃z∈set zs. rel z a))"
define ys1 where"ys1 = filter (P xs) ys" from assms(2) have"distinct (filter (P ys1) xs)"by simp moreoverfrom assms(3) have"distinct ys1"by (simp add: ys1_def) moreoverhave"set (filter (P ys1) xs) ∩ set ys1 = {}" proof (simp add: set_eq_iff, intro allI impI notI) fix x assume"P ys1 x" hence"∧z. z ∈ set ys1 ==>¬ rel z x"by (simp add: P_def) moreoverassume"x ∈ set ys1" ultimatelyhave"¬ rel x x"by blast moreoverfrom assms(1) have"rel x x"by (rule reflpD) ultimatelyshow False .. qed ultimatelyshow ?thesis by (simp add: filter_min_append_def ys1_def P_def) qed
end
end(* theory *)
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.