# HG changeset patch # User nipkow # Date 1464190895 -7200 # Node ID dbb176f511c50d416cc921c21189ba3ee0f2ce86 # Parent 6a767355d1a95009739df725ab9c53df1bb2fd59# Parent f5dbab18c4043e8af4f950165b709eba93ffdf91 merged diff -r 6a767355d1a9 -r dbb176f511c5 NEWS --- a/NEWS Wed May 25 16:01:42 2016 +0200 +++ b/NEWS Wed May 25 17:41:35 2016 +0200 @@ -214,7 +214,11 @@ pave way for a possible future different type class instantiation for polynomials over factorial rings. INCOMPATIBILITY. -* Library/Sublist.thy: renamed prefixeq -> prefix and prefix -> strict_prefix +* Library/Sublist.thy: renamed + prefixeq -> prefix + prefix -> strict_prefix + suffixeq -> suffix + suffix -> strict_suffix * Dropped various legacy fact bindings, whose replacements are often of a more general type also: diff -r 6a767355d1a9 -r dbb176f511c5 src/HOL/Library/Sublist.thy --- a/src/HOL/Library/Sublist.thy Wed May 25 16:01:42 2016 +0200 +++ b/src/HOL/Library/Sublist.thy Wed May 25 17:41:35 2016 +0200 @@ -264,72 +264,79 @@ subsection \Suffix order on lists\ -definition suffixeq :: "'a list \ 'a list \ bool" - where "suffixeq xs ys = (\zs. ys = zs @ xs)" +definition suffix :: "'a list \ 'a list \ bool" + where "suffix xs ys = (\zs. ys = zs @ xs)" -definition suffix :: "'a list \ 'a list \ bool" - where "suffix xs ys \ (\us. ys = us @ xs \ us \ [])" +definition strict_suffix :: "'a list \ 'a list \ bool" + where "strict_suffix xs ys \ (\us. ys = us @ xs \ us \ [])" -lemma suffix_imp_suffixeq: - "suffix xs ys \ suffixeq xs ys" - by (auto simp: suffixeq_def suffix_def) +lemma strict_suffix_imp_suffix: + "strict_suffix xs ys \ suffix xs ys" + by (auto simp: suffix_def strict_suffix_def) -lemma suffixeqI [intro?]: "ys = zs @ xs \ suffixeq xs ys" - unfolding suffixeq_def by blast +lemma suffixI [intro?]: "ys = zs @ xs \ suffix xs ys" + unfolding suffix_def by blast -lemma suffixeqE [elim?]: - assumes "suffixeq xs ys" +lemma suffixE [elim?]: + assumes "suffix xs ys" obtains zs where "ys = zs @ xs" - using assms unfolding suffixeq_def by blast + using assms unfolding suffix_def by blast -lemma suffixeq_refl [iff]: "suffixeq xs xs" - by (auto simp add: suffixeq_def) +lemma suffix_refl [iff]: "suffix xs xs" + by (auto simp add: suffix_def) + lemma suffix_trans: "suffix xs ys \ suffix ys zs \ suffix xs zs" by (auto simp: suffix_def) -lemma suffixeq_trans: "\suffixeq xs ys; suffixeq ys zs\ \ suffixeq xs zs" - by (auto simp add: suffixeq_def) -lemma suffixeq_antisym: "\suffixeq xs ys; suffixeq ys xs\ \ xs = ys" - by (auto simp add: suffixeq_def) + +lemma strict_suffix_trans: + "\strict_suffix xs ys; strict_suffix ys zs\ \ strict_suffix xs zs" +by (auto simp add: strict_suffix_def) -lemma suffixeq_tl [simp]: "suffixeq (tl xs) xs" - by (induct xs) (auto simp: suffixeq_def) +lemma suffix_antisym: "\suffix xs ys; suffix ys xs\ \ xs = ys" + by (auto simp add: suffix_def) -lemma suffix_tl [simp]: "xs \ [] \ suffix (tl xs) xs" +lemma suffix_tl [simp]: "suffix (tl xs) xs" by (induct xs) (auto simp: suffix_def) -lemma Nil_suffixeq [iff]: "suffixeq [] xs" - by (simp add: suffixeq_def) -lemma suffixeq_Nil [simp]: "(suffixeq xs []) = (xs = [])" - by (auto simp add: suffixeq_def) +lemma strict_suffix_tl [simp]: "xs \ [] \ strict_suffix (tl xs) xs" + by (induct xs) (auto simp: strict_suffix_def) + +lemma Nil_suffix [iff]: "suffix [] xs" + by (simp add: suffix_def) -lemma suffixeq_ConsI: "suffixeq xs ys \ suffixeq xs (y # ys)" - by (auto simp add: suffixeq_def) -lemma suffixeq_ConsD: "suffixeq (x # xs) ys \ suffixeq xs ys" - by (auto simp add: suffixeq_def) +lemma suffix_Nil [simp]: "(suffix xs []) = (xs = [])" + by (auto simp add: suffix_def) + +lemma suffix_ConsI: "suffix xs ys \ suffix xs (y # ys)" + by (auto simp add: suffix_def) + +lemma suffix_ConsD: "suffix (x # xs) ys \ suffix xs ys" + by (auto simp add: suffix_def) -lemma suffixeq_appendI: "suffixeq xs ys \ suffixeq xs (zs @ ys)" - by (auto simp add: suffixeq_def) -lemma suffixeq_appendD: "suffixeq (zs @ xs) ys \ suffixeq xs ys" - by (auto simp add: suffixeq_def) +lemma suffix_appendI: "suffix xs ys \ suffix xs (zs @ ys)" + by (auto simp add: suffix_def) + +lemma suffix_appendD: "suffix (zs @ xs) ys \ suffix xs ys" + by (auto simp add: suffix_def) -lemma suffix_set_subset: - "suffix xs ys \ set xs \ set ys" by (auto simp: suffix_def) +lemma strict_suffix_set_subset: "strict_suffix xs ys \ set xs \ set ys" +by (auto simp: strict_suffix_def) -lemma suffixeq_set_subset: - "suffixeq xs ys \ set xs \ set ys" by (auto simp: suffixeq_def) +lemma suffix_set_subset: "suffix xs ys \ set xs \ set ys" +by (auto simp: suffix_def) -lemma suffixeq_ConsD2: "suffixeq (x # xs) (y # ys) \ suffixeq xs ys" +lemma suffix_ConsD2: "suffix (x # xs) (y # ys) \ suffix xs ys" proof - - assume "suffixeq (x # xs) (y # ys)" + assume "suffix (x # xs) (y # ys)" then obtain zs where "y # ys = zs @ x # xs" .. then show ?thesis - by (induct zs) (auto intro!: suffixeq_appendI suffixeq_ConsI) + by (induct zs) (auto intro!: suffix_appendI suffix_ConsI) qed -lemma suffixeq_to_prefix [code]: "suffixeq xs ys \ prefix (rev xs) (rev ys)" +lemma suffix_to_prefix [code]: "suffix xs ys \ prefix (rev xs) (rev ys)" proof - assume "suffixeq xs ys" + assume "suffix xs ys" then obtain zs where "ys = zs @ xs" .. then have "rev ys = rev xs @ rev zs" by simp then show "prefix (rev xs) (rev ys)" .. @@ -338,46 +345,29 @@ then obtain zs where "rev ys = rev xs @ zs" .. then have "rev (rev ys) = rev zs @ rev (rev xs)" by simp then have "ys = rev zs @ xs" by simp - then show "suffixeq xs ys" .. + then show "suffix xs ys" .. qed -lemma distinct_suffixeq: "distinct ys \ suffixeq xs ys \ distinct xs" - by (clarsimp elim!: suffixeqE) +lemma distinct_suffix: "distinct ys \ suffix xs ys \ distinct xs" + by (clarsimp elim!: suffixE) -lemma suffixeq_map: "suffixeq xs ys \ suffixeq (map f xs) (map f ys)" - by (auto elim!: suffixeqE intro: suffixeqI) +lemma suffix_map: "suffix xs ys \ suffix (map f xs) (map f ys)" + by (auto elim!: suffixE intro: suffixI) -lemma suffixeq_drop: "suffixeq (drop n as) as" - unfolding suffixeq_def +lemma suffix_drop: "suffix (drop n as) as" + unfolding suffix_def apply (rule exI [where x = "take n as"]) apply simp done -lemma suffixeq_take: "suffixeq xs ys \ ys = take (length ys - length xs) ys @ xs" - by (auto elim!: suffixeqE) +lemma suffix_take: "suffix xs ys \ ys = take (length ys - length xs) ys @ xs" + by (auto elim!: suffixE) -lemma suffixeq_suffix_reflclp_conv: "suffixeq = suffix\<^sup>=\<^sup>=" -proof (intro ext iffI) - fix xs ys :: "'a list" - assume "suffixeq xs ys" - show "suffix\<^sup>=\<^sup>= xs ys" - proof - assume "xs \ ys" - with \suffixeq xs ys\ show "suffix xs ys" - by (auto simp: suffixeq_def suffix_def) - qed -next - fix xs ys :: "'a list" - assume "suffix\<^sup>=\<^sup>= xs ys" - then show "suffixeq xs ys" - proof - assume "suffix xs ys" then show "suffixeq xs ys" - by (rule suffix_imp_suffixeq) - next - assume "xs = ys" then show "suffixeq xs ys" - by (auto simp: suffixeq_def) - qed -qed +lemma strict_suffix_reflclp_conv: "strict_suffix\<^sup>=\<^sup>= = suffix" +by (intro ext) (auto simp: suffix_def strict_suffix_def) + +lemma suffix_lists: "suffix xs ys \ ys \ lists A \ xs \ lists A" + unfolding suffix_def by auto lemma parallelD1: "x \ y \ \ prefix x y" by blast @@ -419,12 +409,6 @@ qed qed -lemma suffix_reflclp_conv: "suffix\<^sup>=\<^sup>= = suffixeq" - by (intro ext) (auto simp: suffixeq_def suffix_def) - -lemma suffix_lists: "suffix xs ys \ ys \ lists A \ xs \ lists A" - unfolding suffix_def by auto - subsection \Homeomorphic embedding on lists\ @@ -500,15 +484,16 @@ thus ?case using lh zs sk by (metis (no_types) append_Cons append_assoc) qed +lemma list_emb_strict_suffix: + assumes "list_emb P xs ys" and "strict_suffix ys zs" + shows "list_emb P xs zs" + using assms(2) and list_emb_append2 [OF assms(1)] by (auto simp: strict_suffix_def) + lemma list_emb_suffix: assumes "list_emb P xs ys" and "suffix ys zs" shows "list_emb P xs zs" - using assms(2) and list_emb_append2 [OF assms(1)] by (auto simp: suffix_def) - -lemma list_emb_suffixeq: - assumes "list_emb P xs ys" and "suffixeq ys zs" - shows "list_emb P xs zs" - using assms and list_emb_suffix unfolding suffixeq_suffix_reflclp_conv by auto +using assms and list_emb_strict_suffix +unfolding strict_suffix_reflclp_conv[symmetric] by auto lemma list_emb_length: "list_emb P xs ys \ length xs \ length ys" by (induct rule: list_emb.induct) auto