| author | wenzelm | 
| Sun, 29 Jan 2006 19:23:40 +0100 | |
| changeset 18833 | bead1a4e966b | 
| parent 18730 | 843da46f89ac | 
| child 19086 | 1b3780be6cc2 | 
| permissions | -rw-r--r-- | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 1 | (* Title: HOL/Library/List_Prefix.thy | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 3 | Author: Tobias Nipkow and Markus Wenzel, TU Muenchen | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 4 | *) | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 5 | |
| 14706 | 6 | header {* List prefixes and postfixes *}
 | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 7 | |
| 15131 | 8 | theory List_Prefix | 
| 15140 | 9 | imports Main | 
| 15131 | 10 | begin | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 11 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 12 | subsection {* Prefix order on lists *}
 | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 13 | |
| 12338 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 wenzelm parents: 
11987diff
changeset | 14 | instance list :: (type) ord .. | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 15 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 16 | defs (overloaded) | 
| 10389 | 17 | prefix_def: "xs \<le> ys == \<exists>zs. ys = xs @ zs" | 
| 18 | strict_prefix_def: "xs < ys == xs \<le> ys \<and> xs \<noteq> (ys::'a list)" | |
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 19 | |
| 12338 
de0f4a63baa5
renamed class "term" to "type" (actually "HOL.type");
 wenzelm parents: 
11987diff
changeset | 20 | instance list :: (type) order | 
| 10389 | 21 | by intro_classes (auto simp add: prefix_def strict_prefix_def) | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 22 | |
| 10389 | 23 | lemma prefixI [intro?]: "ys = xs @ zs ==> xs \<le> ys" | 
| 18730 | 24 | unfolding prefix_def by blast | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 25 | |
| 10389 | 26 | lemma prefixE [elim?]: "xs \<le> ys ==> (!!zs. ys = xs @ zs ==> C) ==> C" | 
| 18730 | 27 | unfolding prefix_def by blast | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 28 | |
| 10870 | 29 | lemma strict_prefixI' [intro?]: "ys = xs @ z # zs ==> xs < ys" | 
| 18730 | 30 | unfolding strict_prefix_def prefix_def by blast | 
| 10870 | 31 | |
| 32 | lemma strict_prefixE' [elim?]: | |
| 17201 | 33 | assumes lt: "xs < ys" | 
| 34 | and r: "!!z zs. ys = xs @ z # zs ==> C" | |
| 35 | shows C | |
| 10870 | 36 | proof - | 
| 17201 | 37 | from lt obtain us where "ys = xs @ us" and "xs \<noteq> ys" | 
| 18730 | 38 | unfolding strict_prefix_def prefix_def by blast | 
| 10870 | 39 | with r show ?thesis by (auto simp add: neq_Nil_conv) | 
| 40 | qed | |
| 41 | ||
| 10389 | 42 | lemma strict_prefixI [intro?]: "xs \<le> ys ==> xs \<noteq> ys ==> xs < (ys::'a list)" | 
| 18730 | 43 | unfolding strict_prefix_def by blast | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 44 | |
| 10389 | 45 | lemma strict_prefixE [elim?]: | 
| 46 | "xs < ys ==> (xs \<le> ys ==> xs \<noteq> (ys::'a list) ==> C) ==> C" | |
| 18730 | 47 | unfolding strict_prefix_def by blast | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 48 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 49 | |
| 10389 | 50 | subsection {* Basic properties of prefixes *}
 | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 51 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 52 | theorem Nil_prefix [iff]: "[] \<le> xs" | 
| 10389 | 53 | by (simp add: prefix_def) | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 54 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 55 | theorem prefix_Nil [simp]: "(xs \<le> []) = (xs = [])" | 
| 10389 | 56 | by (induct xs) (simp_all add: prefix_def) | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 57 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 58 | lemma prefix_snoc [simp]: "(xs \<le> ys @ [y]) = (xs = ys @ [y] \<or> xs \<le> ys)" | 
| 10389 | 59 | proof | 
| 60 | assume "xs \<le> ys @ [y]" | |
| 61 | then obtain zs where zs: "ys @ [y] = xs @ zs" .. | |
| 62 | show "xs = ys @ [y] \<or> xs \<le> ys" | |
| 63 | proof (cases zs rule: rev_cases) | |
| 64 | assume "zs = []" | |
| 65 | with zs have "xs = ys @ [y]" by simp | |
| 66 | thus ?thesis .. | |
| 67 | next | |
| 68 | fix z zs' assume "zs = zs' @ [z]" | |
| 69 | with zs have "ys = xs @ zs'" by simp | |
| 70 | hence "xs \<le> ys" .. | |
| 71 | thus ?thesis .. | |
| 72 | qed | |
| 73 | next | |
| 74 | assume "xs = ys @ [y] \<or> xs \<le> ys" | |
| 75 | thus "xs \<le> ys @ [y]" | |
| 76 | proof | |
| 77 | assume "xs = ys @ [y]" | |
| 78 | thus ?thesis by simp | |
| 79 | next | |
| 80 | assume "xs \<le> ys" | |
| 81 | then obtain zs where "ys = xs @ zs" .. | |
| 82 | hence "ys @ [y] = xs @ (zs @ [y])" by simp | |
| 83 | thus ?thesis .. | |
| 84 | qed | |
| 85 | qed | |
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 86 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 87 | lemma Cons_prefix_Cons [simp]: "(x # xs \<le> y # ys) = (x = y \<and> xs \<le> ys)" | 
| 10389 | 88 | by (auto simp add: prefix_def) | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 89 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 90 | lemma same_prefix_prefix [simp]: "(xs @ ys \<le> xs @ zs) = (ys \<le> zs)" | 
| 10389 | 91 | by (induct xs) simp_all | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 92 | |
| 10389 | 93 | lemma same_prefix_nil [iff]: "(xs @ ys \<le> xs) = (ys = [])" | 
| 94 | proof - | |
| 95 | have "(xs @ ys \<le> xs @ []) = (ys \<le> [])" by (rule same_prefix_prefix) | |
| 96 | thus ?thesis by simp | |
| 97 | qed | |
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 98 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 99 | lemma prefix_prefix [simp]: "xs \<le> ys ==> xs \<le> ys @ zs" | 
| 10389 | 100 | proof - | 
| 101 | assume "xs \<le> ys" | |
| 102 | then obtain us where "ys = xs @ us" .. | |
| 103 | hence "ys @ zs = xs @ (us @ zs)" by simp | |
| 104 | thus ?thesis .. | |
| 105 | qed | |
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 106 | |
| 14300 | 107 | lemma append_prefixD: "xs @ ys \<le> zs \<Longrightarrow> xs \<le> zs" | 
| 17201 | 108 | by (auto simp add: prefix_def) | 
| 14300 | 109 | |
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 110 | theorem prefix_Cons: "(xs \<le> y # ys) = (xs = [] \<or> (\<exists>zs. xs = y # zs \<and> zs \<le> ys))" | 
| 10389 | 111 | by (cases xs) (auto simp add: prefix_def) | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 112 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 113 | theorem prefix_append: | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 114 | "(xs \<le> ys @ zs) = (xs \<le> ys \<or> (\<exists>us. xs = ys @ us \<and> us \<le> zs))" | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 115 | apply (induct zs rule: rev_induct) | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 116 | apply force | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 117 | apply (simp del: append_assoc add: append_assoc [symmetric]) | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 118 | apply simp | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 119 | apply blast | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 120 | done | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 121 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 122 | lemma append_one_prefix: | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 123 | "xs \<le> ys ==> length xs < length ys ==> xs @ [ys ! length xs] \<le> ys" | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 124 | apply (unfold prefix_def) | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 125 | apply (auto simp add: nth_append) | 
| 10389 | 126 | apply (case_tac zs) | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 127 | apply auto | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 128 | done | 
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 129 | |
| 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 130 | theorem prefix_length_le: "xs \<le> ys ==> length xs \<le> length ys" | 
| 10389 | 131 | by (auto simp add: prefix_def) | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 132 | |
| 14300 | 133 | lemma prefix_same_cases: | 
| 17201 | 134 | "(xs\<^isub>1::'a list) \<le> ys \<Longrightarrow> xs\<^isub>2 \<le> ys \<Longrightarrow> xs\<^isub>1 \<le> xs\<^isub>2 \<or> xs\<^isub>2 \<le> xs\<^isub>1" | 
| 135 | apply (simp add: prefix_def) | |
| 136 | apply (erule exE)+ | |
| 137 | apply (simp add: append_eq_append_conv_if split: if_splits) | |
| 138 | apply (rule disjI2) | |
| 139 | apply (rule_tac x = "drop (size xs\<^isub>2) xs\<^isub>1" in exI) | |
| 140 | apply clarify | |
| 141 | apply (drule sym) | |
| 142 | apply (insert append_take_drop_id [of "length xs\<^isub>2" xs\<^isub>1]) | |
| 143 | apply simp | |
| 144 | apply (rule disjI1) | |
| 145 | apply (rule_tac x = "drop (size xs\<^isub>1) xs\<^isub>2" in exI) | |
| 146 | apply clarify | |
| 147 | apply (insert append_take_drop_id [of "length xs\<^isub>1" xs\<^isub>2]) | |
| 148 | apply simp | |
| 149 | done | |
| 14300 | 150 | |
| 151 | lemma set_mono_prefix: | |
| 17201 | 152 | "xs \<le> ys \<Longrightarrow> set xs \<subseteq> set ys" | 
| 153 | by (auto simp add: prefix_def) | |
| 14300 | 154 | |
| 155 | ||
| 10389 | 156 | subsection {* Parallel lists *}
 | 
| 157 | ||
| 158 | constdefs | |
| 159 | parallel :: "'a list => 'a list => bool" (infixl "\<parallel>" 50) | |
| 160 | "xs \<parallel> ys == \<not> xs \<le> ys \<and> \<not> ys \<le> xs" | |
| 161 | ||
| 162 | lemma parallelI [intro]: "\<not> xs \<le> ys ==> \<not> ys \<le> xs ==> xs \<parallel> ys" | |
| 18730 | 163 | unfolding parallel_def by blast | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 164 | |
| 10389 | 165 | lemma parallelE [elim]: | 
| 166 | "xs \<parallel> ys ==> (\<not> xs \<le> ys ==> \<not> ys \<le> xs ==> C) ==> C" | |
| 18730 | 167 | unfolding parallel_def by blast | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 168 | |
| 10389 | 169 | theorem prefix_cases: | 
| 170 | "(xs \<le> ys ==> C) ==> | |
| 10512 | 171 | (ys < xs ==> C) ==> | 
| 10389 | 172 | (xs \<parallel> ys ==> C) ==> C" | 
| 18730 | 173 | unfolding parallel_def strict_prefix_def by blast | 
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 174 | |
| 10389 | 175 | theorem parallel_decomp: | 
| 176 | "xs \<parallel> ys ==> \<exists>as b bs c cs. b \<noteq> c \<and> xs = as @ b # bs \<and> ys = as @ c # cs" | |
| 10408 | 177 | proof (induct xs rule: rev_induct) | 
| 11987 | 178 | case Nil | 
| 179 | hence False by auto | |
| 180 | thus ?case .. | |
| 10408 | 181 | next | 
| 11987 | 182 | case (snoc x xs) | 
| 183 | show ?case | |
| 10408 | 184 | proof (rule prefix_cases) | 
| 185 | assume le: "xs \<le> ys" | |
| 186 | then obtain ys' where ys: "ys = xs @ ys'" .. | |
| 187 | show ?thesis | |
| 188 | proof (cases ys') | |
| 189 | assume "ys' = []" with ys have "xs = ys" by simp | |
| 11987 | 190 | with snoc have "[x] \<parallel> []" by auto | 
| 10408 | 191 | hence False by blast | 
| 10389 | 192 | thus ?thesis .. | 
| 193 | next | |
| 10408 | 194 | fix c cs assume ys': "ys' = c # cs" | 
| 11987 | 195 | with snoc ys have "xs @ [x] \<parallel> xs @ c # cs" by (simp only:) | 
| 10408 | 196 | hence "x \<noteq> c" by auto | 
| 197 | moreover have "xs @ [x] = xs @ x # []" by simp | |
| 198 | moreover from ys ys' have "ys = xs @ c # cs" by (simp only:) | |
| 199 | ultimately show ?thesis by blast | |
| 10389 | 200 | qed | 
| 10408 | 201 | next | 
| 10512 | 202 | assume "ys < xs" hence "ys \<le> xs @ [x]" by (simp add: strict_prefix_def) | 
| 11987 | 203 | with snoc have False by blast | 
| 10408 | 204 | thus ?thesis .. | 
| 205 | next | |
| 206 | assume "xs \<parallel> ys" | |
| 11987 | 207 | with snoc obtain as b bs c cs where neq: "(b::'a) \<noteq> c" | 
| 10408 | 208 | and xs: "xs = as @ b # bs" and ys: "ys = as @ c # cs" | 
| 209 | by blast | |
| 210 | from xs have "xs @ [x] = as @ b # (bs @ [x])" by simp | |
| 211 | with neq ys show ?thesis by blast | |
| 10389 | 212 | qed | 
| 213 | qed | |
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 214 | |
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 215 | |
| 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 216 | subsection {* Postfix order on lists *}
 | 
| 17201 | 217 | |
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 218 | constdefs | 
| 17201 | 219 |   postfix :: "'a list => 'a list => bool"  ("(_/ >>= _)" [51, 50] 50)
 | 
| 220 | "xs >>= ys == \<exists>zs. xs = zs @ ys" | |
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 221 | |
| 17201 | 222 | lemma postfix_refl [simp, intro!]: "xs >>= xs" | 
| 14706 | 223 | by (auto simp add: postfix_def) | 
| 17201 | 224 | lemma postfix_trans: "\<lbrakk>xs >>= ys; ys >>= zs\<rbrakk> \<Longrightarrow> xs >>= zs" | 
| 14706 | 225 | by (auto simp add: postfix_def) | 
| 17201 | 226 | lemma postfix_antisym: "\<lbrakk>xs >>= ys; ys >>= xs\<rbrakk> \<Longrightarrow> xs = ys" | 
| 14706 | 227 | by (auto simp add: postfix_def) | 
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 228 | |
| 17201 | 229 | lemma Nil_postfix [iff]: "xs >>= []" | 
| 14706 | 230 | by (simp add: postfix_def) | 
| 17201 | 231 | lemma postfix_Nil [simp]: "([] >>= xs) = (xs = [])" | 
| 14706 | 232 | by (auto simp add:postfix_def) | 
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 233 | |
| 17201 | 234 | lemma postfix_ConsI: "xs >>= ys \<Longrightarrow> x#xs >>= ys" | 
| 14706 | 235 | by (auto simp add: postfix_def) | 
| 17201 | 236 | lemma postfix_ConsD: "xs >>= y#ys \<Longrightarrow> xs >>= ys" | 
| 14706 | 237 | by (auto simp add: postfix_def) | 
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 238 | |
| 17201 | 239 | lemma postfix_appendI: "xs >>= ys \<Longrightarrow> zs @ xs >>= ys" | 
| 14706 | 240 | by (auto simp add: postfix_def) | 
| 17201 | 241 | lemma postfix_appendD: "xs >>= zs @ ys \<Longrightarrow> xs >>= ys" | 
| 14706 | 242 | by(auto simp add: postfix_def) | 
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 243 | |
| 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 244 | lemma postfix_is_subset_lemma: "xs = zs @ ys \<Longrightarrow> set ys \<subseteq> set xs" | 
| 18258 | 245 | by (induct zs) auto | 
| 17201 | 246 | lemma postfix_is_subset: "xs >>= ys \<Longrightarrow> set ys \<subseteq> set xs" | 
| 14706 | 247 | by (unfold postfix_def, erule exE, erule postfix_is_subset_lemma) | 
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 248 | |
| 18258 | 249 | lemma postfix_ConsD2_lemma: "x#xs = zs @ y#ys \<Longrightarrow> xs >>= ys" | 
| 250 | by (induct zs) (auto intro!: postfix_appendI postfix_ConsI) | |
| 17201 | 251 | lemma postfix_ConsD2: "x#xs >>= y#ys \<Longrightarrow> xs >>= ys" | 
| 14706 | 252 | by (auto simp add: postfix_def dest!: postfix_ConsD2_lemma) | 
| 14538 
1d9d75a8efae
removed o2l and fold_rel; moved postfix to Library/List_Prefix.thy
 oheimb parents: 
14300diff
changeset | 253 | |
| 17201 | 254 | lemma postfix2prefix: "(xs >>= ys) = (rev ys <= rev xs)" | 
| 14706 | 255 | apply (unfold prefix_def postfix_def, safe) | 
| 17201 | 256 | apply (rule_tac x = "rev zs" in exI, simp) | 
| 14706 | 257 | apply (rule_tac x = "rev zs" in exI) | 
| 258 | apply (rule rev_is_rev_conv [THEN iffD1], simp) | |
| 259 | done | |
| 17201 | 260 | |
| 10330 
4362e906b745
"List prefixes" library theory (replaces old Lex/Prefix);
 wenzelm parents: diff
changeset | 261 | end |