221 lemma semiconfluentp_cancel1: "semiconfluentp cancel1\<inverse>\<inverse>" |
221 lemma semiconfluentp_cancel1: "semiconfluentp cancel1\<inverse>\<inverse>" |
222 by(auto simp add: semiconfluentp_def rtranclp_conversep dest: cancel1_semiconfluent) |
222 by(auto simp add: semiconfluentp_def rtranclp_conversep dest: cancel1_semiconfluent) |
223 |
223 |
224 lemma retract_cancel1_aux: |
224 lemma retract_cancel1_aux: |
225 assumes "cancel1 ys (map f xs)" |
225 assumes "cancel1 ys (map f xs)" |
226 shows "\<exists>zs. cancel1 zs xs \<and> ys = map f zs" |
226 shows "\<exists>zs. cancel1 zs xs \<and> ys = map f zs \<and> set zs \<subseteq> set xs" |
227 using assms |
227 using assms |
228 by cases(fastforce simp add: map_eq_append_conv append_eq_map_conv intro: cancel1.intros) |
228 by cases(fastforce simp add: map_eq_append_conv append_eq_map_conv intro: cancel1.intros) |
229 |
229 |
230 lemma retract_cancel1: |
230 lemma retract_cancel1: |
231 assumes "cancel1 ys (map f xs)" |
231 assumes "cancel1 ys (map f xs)" |
232 shows "\<exists>zs. eq xs zs \<and> ys = map f zs" |
232 shows "\<exists>zs. eq xs zs \<and> ys = map f zs \<and> set zs \<subseteq> set xs" |
233 using retract_cancel1_aux[OF assms] by(blast intro: symclpI) |
233 using retract_cancel1_aux[OF assms] by(blast intro: symclpI) |
234 |
234 |
235 lemma cancel1_set_eq: |
235 lemma cancel1_set_eq: |
236 assumes "cancel1 ys xs" |
236 assumes "cancel1 ys xs" |
237 shows "set ys = set xs" |
237 shows "set ys = set xs" |