src/HOL/List.thy
changeset 63173 3413b1cf30cd
parent 63145 703edebd1d92
child 63317 ca187a9f66da
equal deleted inserted replaced
63172:d4f459eb7ed0 63173:3413b1cf30cd
  1000 
  1000 
  1001 lemma append_eq_Cons_conv: "(ys@zs = x#xs) =
  1001 lemma append_eq_Cons_conv: "(ys@zs = x#xs) =
  1002  (ys = [] & zs = x#xs | (EX ys'. ys = x#ys' & ys'@zs = xs))"
  1002  (ys = [] & zs = x#xs | (EX ys'. ys = x#ys' & ys'@zs = xs))"
  1003 by(cases ys) auto
  1003 by(cases ys) auto
  1004 
  1004 
       
  1005 lemma longest_common_prefix:
       
  1006   "\<exists>ps xs' ys'. xs = ps @ xs' \<and> ys = ps @ ys'
       
  1007        \<and> (xs' = [] \<or> ys' = [] \<or> hd xs' \<noteq> hd ys')"
       
  1008 by (induct xs ys rule: list_induct2')
       
  1009    (blast, blast, blast,
       
  1010     metis (no_types, hide_lams) append_Cons append_Nil list.sel(1))
  1005 
  1011 
  1006 text \<open>Trivial rules for solving \<open>@\<close>-equations automatically.\<close>
  1012 text \<open>Trivial rules for solving \<open>@\<close>-equations automatically.\<close>
  1007 
  1013 
  1008 lemma eq_Nil_appendI: "xs = ys ==> xs = [] @ ys"
  1014 lemma eq_Nil_appendI: "xs = ys ==> xs = [] @ ys"
  1009 by simp
  1015 by simp
  1958 by (induct xs) simp_all
  1964 by (induct xs) simp_all
  1959 
  1965 
  1960 lemma snoc_eq_iff_butlast:
  1966 lemma snoc_eq_iff_butlast:
  1961   "xs @ [x] = ys \<longleftrightarrow> (ys \<noteq> [] & butlast ys = xs & last ys = x)"
  1967   "xs @ [x] = ys \<longleftrightarrow> (ys \<noteq> [] & butlast ys = xs & last ys = x)"
  1962 by fastforce
  1968 by fastforce
       
  1969 
       
  1970 corollary longest_common_suffix:
       
  1971   "\<exists>ss xs' ys'. xs = xs' @ ss \<and> ys = ys' @ ss
       
  1972        \<and> (xs' = [] \<or> ys' = [] \<or> last xs' \<noteq> last ys')"
       
  1973 using longest_common_prefix[of "rev xs" "rev ys"]
       
  1974 unfolding rev_swap rev_append by (metis last_rev rev_is_Nil_conv)
  1963 
  1975 
  1964 
  1976 
  1965 subsubsection \<open>@{const take} and @{const drop}\<close>
  1977 subsubsection \<open>@{const take} and @{const drop}\<close>
  1966 
  1978 
  1967 lemma take_0 [simp]: "take 0 xs = []"
  1979 lemma take_0 [simp]: "take 0 xs = []"