equal
deleted
inserted
replaced
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 = []" |