# HG changeset patch # User paulson # Date 1529446260 -3600 # Node ID 7ddcce75c3ee5a63a48eaaa0329517d9c354bd9c # Parent ae42b0f6885d9988c1513958fcac78416629d1d1 Partial de-apply of Divisibility diff -r ae42b0f6885d -r 7ddcce75c3ee src/HOL/Algebra/Divisibility.thy --- a/src/HOL/Algebra/Divisibility.thy Tue Jun 19 12:14:31 2018 +0100 +++ b/src/HOL/Algebra/Divisibility.thy Tue Jun 19 23:11:00 2018 +0100 @@ -189,39 +189,31 @@ by (intro dividesI[of "\"]) (simp_all add: carr) lemma (in monoid) divides_trans [trans]: - assumes dvds: "a divides b" "b divides c" + assumes dvds: "a divides b" "b divides c" and acarr: "a \ carrier G" shows "a divides c" using dvds[THEN dividesD] by (blast intro: dividesI m_assoc acarr) lemma (in monoid) divides_mult_lI [intro]: - assumes ab: "a divides b" - and carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" + assumes "a divides b" "a \ carrier G" "c \ carrier G" shows "(c \ a) divides (c \ b)" - using ab - apply (elim dividesE) - apply (simp add: m_assoc[symmetric] carr) - apply (fast intro: dividesI) - done + by (metis assms factor_def m_assoc) lemma (in monoid_cancel) divides_mult_l [simp]: assumes carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" shows "(c \ a) divides (c \ b) = a divides b" - apply safe - apply (elim dividesE, intro dividesI, assumption) - apply (rule l_cancel[of c]) - apply (simp add: m_assoc carr)+ - apply (fast intro: carr) - done +proof + show "c \ a divides c \ b \ a divides b" + using carr monoid.m_assoc monoid_axioms monoid_cancel.l_cancel monoid_cancel_axioms by fastforce + show "a divides b \ c \ a divides c \ b" + using carr(1) carr(3) by blast +qed lemma (in comm_monoid) divides_mult_rI [intro]: assumes ab: "a divides b" and carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" shows "(a \ c) divides (b \ c)" - using carr ab - apply (simp add: m_comm[of a c] m_comm[of b c]) - apply (rule divides_mult_lI, assumption+) - done + using carr ab by (metis divides_mult_lI m_comm) lemma (in comm_monoid_cancel) divides_mult_r [simp]: assumes carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" @@ -230,18 +222,14 @@ lemma (in monoid) divides_prod_r: assumes ab: "a divides b" - and carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" + and carr: "a \ carrier G" "c \ carrier G" shows "a divides (b \ c)" using ab carr by (fast intro: m_assoc) lemma (in comm_monoid) divides_prod_l: - assumes carr[intro]: "a \ carrier G" "b \ carrier G" "c \ carrier G" - and ab: "a divides b" + assumes "a \ carrier G" "b \ carrier G" "c \ carrier G" "a divides b" shows "a divides (c \ b)" - using ab carr - apply (simp add: m_comm[of c b]) - apply (fast intro: divides_prod_r) - done + using assms by (simp add: divides_prod_r m_comm) lemma (in monoid) unit_divides: assumes uunit: "u \ Units G" @@ -272,22 +260,20 @@ lemma associatedI: fixes G (structure) - assumes "a divides b" "b divides a" + assumes "a divides b" "b divides a" shows "a \ b" using assms by (simp add: associated_def) lemma (in monoid) associatedI2: assumes uunit[simp]: "u \ Units G" and a: "a = b \ u" - and bcarr[simp]: "b \ carrier G" + and bcarr: "b \ carrier G" shows "a \ b" using uunit bcarr unfolding a apply (intro associatedI) - apply (rule dividesI[of "inv u"], simp) - apply (simp add: m_assoc Units_closed) - apply fast - done + apply (metis Units_closed divides_mult_lI one_closed r_one unit_divides) + by blast lemma (in monoid) associatedI2': assumes "a = b \ u" @@ -304,7 +290,7 @@ lemma (in monoid_cancel) associatedD2: assumes assoc: "a \ b" - and carr: "a \ carrier G" "b \ carrier G" + and carr: "a \ carrier G" "b \ carrier G" shows "\u\Units G. a = b \ u" using assoc unfolding associated_def @@ -370,13 +356,12 @@ lemma (in monoid) associated_sym [sym]: assumes "a \ b" - and "a \ carrier G" "b \ carrier G" shows "b \ a" using assms by (iprover intro: associatedI elim: associatedE) lemma (in monoid) associated_trans [trans]: assumes "a \ b" "b \ c" - and "a \ carrier G" "b \ carrier G" "c \ carrier G" + and "a \ carrier G" "c \ carrier G" shows "a \ c" using assms by (iprover intro: associatedI divides_trans elim: associatedE) @@ -390,93 +375,48 @@ subsubsection \Division and associativity\ -lemma divides_antisym: - fixes G (structure) - assumes "a divides b" "b divides a" - and "a \ carrier G" "b \ carrier G" - shows "a \ b" - using assms by (fast intro: associatedI) +lemmas divides_antisym = associatedI lemma (in monoid) divides_cong_l [trans]: - assumes "x \ x'" - and "x' divides y" - and [simp]: "x \ carrier G" "x' \ carrier G" "y \ carrier G" + assumes "x \ x'" "x' divides y" "x \ carrier G" shows "x divides y" -proof - - from assms(1) have "x divides x'" by (simp add: associatedD) - also note assms(2) - finally show "x divides y" by simp -qed + by (meson assms associatedD divides_trans) lemma (in monoid) divides_cong_r [trans]: - assumes "x divides y" - and "y \ y'" - and [simp]: "x \ carrier G" "y \ carrier G" "y' \ carrier G" + assumes "x divides y" "y \ y'" "x \ carrier G" shows "x divides y'" -proof - - note assms(1) - also from assms(2) have "y divides y'" by (simp add: associatedD) - finally show "x divides y'" by simp -qed + by (meson assms associatedD divides_trans) lemma (in monoid) division_weak_partial_order [simp, intro!]: "weak_partial_order (division_rel G)" apply unfold_locales - apply simp_all - apply (simp add: associated_sym) - apply (blast intro: associated_trans) - apply (simp add: divides_antisym) - apply (blast intro: divides_trans) - apply (blast intro: divides_cong_l divides_cong_r associated_sym) - done + apply (simp_all add: associated_sym divides_antisym) + apply (metis associated_trans) + apply (metis divides_trans) + by (meson associated_def divides_trans) subsubsection \Multiplication and associativity\ lemma (in monoid_cancel) mult_cong_r: - assumes "b \ b'" - and carr: "a \ carrier G" "b \ carrier G" "b' \ carrier G" + assumes "b \ b'" "a \ carrier G" "b \ carrier G" "b' \ carrier G" shows "a \ b \ a \ b'" - using assms - apply (elim associatedE2, intro associatedI2) - apply (auto intro: m_assoc[symmetric]) - done + by (meson assms associated_def divides_mult_lI) lemma (in comm_monoid_cancel) mult_cong_l: - assumes "a \ a'" - and carr: "a \ carrier G" "a' \ carrier G" "b \ carrier G" + assumes "a \ a'" "a \ carrier G" "a' \ carrier G" "b \ carrier G" shows "a \ b \ a' \ b" - using assms - apply (elim associatedE2, intro associatedI2) - apply assumption - apply (simp add: m_assoc Units_closed) - apply (simp add: m_comm Units_closed) - apply simp_all - done + using assms m_comm mult_cong_r by auto lemma (in monoid_cancel) assoc_l_cancel: - assumes carr: "a \ carrier G" "b \ carrier G" "b' \ carrier G" - and "a \ b \ a \ b'" + assumes "a \ carrier G" "b \ carrier G" "b' \ carrier G" "a \ b \ a \ b'" shows "b \ b'" - using assms - apply (elim associatedE2, intro associatedI2) - apply assumption - apply (rule l_cancel[of a]) - apply (simp add: m_assoc Units_closed) - apply fast+ - done + by (meson assms associated_def divides_mult_l) lemma (in comm_monoid_cancel) assoc_r_cancel: - assumes "a \ b \ a' \ b" - and carr: "a \ carrier G" "a' \ carrier G" "b \ carrier G" + assumes "a \ b \ a' \ b" "a \ carrier G" "a' \ carrier G" "b \ carrier G" shows "a \ a'" - using assms - apply (elim associatedE2, intro associatedI2) - apply assumption - apply (rule r_cancel[of a b]) - apply (metis Units_closed assms(3) assms(4) m_ac) - apply fast+ - done + using assms assoc_l_cancel m_comm by presburger subsubsection \Units\ @@ -507,29 +447,23 @@ using units by (fast intro: associatedI unit_divides) lemma (in monoid) Units_are_ones: "Units G {.=}\<^bsub>(division_rel G)\<^esub> {\}" - apply (simp add: set_eq_def elem_def, rule, simp_all) -proof clarsimp - fix a - assume aunit: "a \ Units G" - show "a \ \" - apply (rule associatedI) - apply (fast intro: dividesI[of "inv a"] aunit Units_r_inv[symmetric]) - apply (fast intro: dividesI[of "a"] l_one[symmetric] Units_closed[OF aunit]) - done -next - have "\ \ Units G" by simp - moreover have "\ \ \" by simp - ultimately show "\a \ Units G. \ \ a" by fast +proof - + have "a .\\<^bsub>division_rel G\<^esub> {\}" if "a \ Units G" for a + proof - + have "a \ \" + by (rule associatedI) (simp_all add: Units_closed that unit_divides) + then show ?thesis + by (simp add: elem_def) + qed + moreover have "\ .\\<^bsub>division_rel G\<^esub> Units G" + by (simp add: equivalence.mem_imp_elem) + ultimately show ?thesis + by (auto simp: set_eq_def) qed lemma (in comm_monoid) Units_Lower: "Units G = Lower (division_rel G) (carrier G)" - apply (simp add: Units_def Lower_def) - apply (rule, rule) - apply clarsimp - apply (rule unit_divides) - apply (unfold Units_def, fast) - apply assumption - apply clarsimp + apply (auto simp add: Units_def Lower_def) + apply (metis Units_one_closed unit_divides unit_factor) apply (metis Unit_eq_dividesone Units_r_inv_ex m_ac(2) one_closed) done @@ -557,7 +491,7 @@ lemma (in comm_monoid_cancel) properfactorI3: assumes p: "p = a \ b" and nunit: "b \ Units G" - and carr: "a \ carrier G" "b \ carrier G" "p \ carrier G" + and carr: "a \ carrier G" "b \ carrier G" shows "properfactor G a p" unfolding p using carr @@ -609,7 +543,7 @@ lemma (in monoid) properfactor_trans1 [trans]: assumes dvds: "a divides b" "properfactor G b c" - and carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" + and carr: "a \ carrier G" "c \ carrier G" shows "properfactor G a c" using dvds carr apply (elim properfactorE, intro properfactorI) @@ -618,7 +552,7 @@ lemma (in monoid) properfactor_trans2 [trans]: assumes dvds: "properfactor G a b" "b divides c" - and carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" + and carr: "a \ carrier G" "b \ carrier G" shows "properfactor G a c" using dvds carr apply (elim properfactorE, intro properfactorI) @@ -628,12 +562,7 @@ lemma properfactor_lless: fixes G (structure) shows "properfactor G = lless (division_rel G)" - apply (rule ext) - apply (rule ext) - apply rule - apply (fastforce elim: properfactorE2 intro: weak_llessI) - apply (fastforce elim: weak_llessE intro: properfactorI2) - done + by (force simp: lless_def properfactor_def associated_def) lemma (in monoid) properfactor_cong_l [trans]: assumes x'x: "x' \ x" @@ -666,7 +595,7 @@ lemma (in monoid_cancel) properfactor_mult_lI [intro]: assumes ab: "properfactor G a b" - and carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" + and carr: "a \ carrier G" "c \ carrier G" shows "properfactor G (c \ a) (c \ b)" using ab carr by (fastforce elim: properfactorE intro: properfactorI) @@ -677,7 +606,7 @@ lemma (in comm_monoid_cancel) properfactor_mult_rI [intro]: assumes ab: "properfactor G a b" - and carr: "a \ carrier G" "b \ carrier G" "c \ carrier G" + and carr: "a \ carrier G" "c \ carrier G" shows "properfactor G (a \ c) (b \ c)" using ab carr by (fastforce elim: properfactorE intro: properfactorI) @@ -727,14 +656,13 @@ lemma (in monoid_cancel) irreducible_cong [trans]: assumes irred: "irreducible G a" - and aa': "a \ a'" - and carr[simp]: "a \ carrier G" "a' \ carrier G" + and aa': "a \ a'" "a \ carrier G" "a' \ carrier G" shows "irreducible G a'" using assms apply (elim irreducibleE, intro irreducibleI) apply simp_all apply (metis assms(2) assms(3) assoc_unit_l) - apply (metis assms(2) assms(3) assms(4) associated_sym properfactor_cong_r) + apply (metis aa' associated_sym properfactor_cong_r) done lemma (in monoid) irreducible_prod_rI: @@ -743,20 +671,16 @@ and carr[simp]: "a \ carrier G" "b \ carrier G" shows "irreducible G (a \ b)" using airr carr bunit - apply (elim irreducibleE, intro irreducibleI, clarify) - apply (subgoal_tac "a \ Units G", simp) - apply (intro prod_unit_r[of a b] carr bunit, assumption) - apply (metis assms(2,3) associatedI2 m_closed properfactor_cong_r) - done + apply (elim irreducibleE, intro irreducibleI) + using prod_unit_r apply blast + using associatedI2' properfactor_cong_r by auto lemma (in comm_monoid) irreducible_prod_lI: assumes birr: "irreducible G b" and aunit: "a \ Units G" and carr [simp]: "a \ carrier G" "b \ carrier G" shows "irreducible G (a \ b)" - apply (subst m_comm, simp+) - apply (intro irreducible_prod_rI assms) - done + by (metis aunit birr carr irreducible_prod_rI m_comm) lemma (in comm_monoid_cancel) irreducible_prodE [elim]: assumes irr: "irreducible G (a \ b)" @@ -834,13 +758,12 @@ lemma (in monoid_cancel) prime_cong [trans]: assumes pprime: "prime G p" - and pp': "p \ p'" - and carr[simp]: "p \ carrier G" "p' \ carrier G" + and pp': "p \ p'" "p \ carrier G" "p' \ carrier G" shows "prime G p'" using pprime apply (elim primeE, intro primeI) apply (metis assms(2) assms(3) assoc_unit_l) - apply (metis assms(2) assms(3) assms(4) associated_sym divides_cong_l m_closed) + apply (metis pp' associated_sym divides_cong_l) done @@ -883,15 +806,11 @@ and "set bs \ carrier G" shows "bs [\] as" using assms -proof (induct as arbitrary: bs, simp) +proof (induction as arbitrary: bs) case Cons then show ?case - apply (induct bs) - apply simp - apply clarsimp - apply (iprover intro: associated_sym) - done -qed + by (induction bs) (use associated_sym in auto) +qed auto lemma (in monoid) listassoc_trans [trans]: assumes "as [\] bs" and "bs [\] cs" @@ -899,11 +818,7 @@ shows "as [\] cs" using assms apply (simp add: list_all2_conv_all_nth set_conv_nth, safe) - apply (rule associated_trans) - apply (subgoal_tac "as ! i \ bs ! i", assumption) - apply (simp, simp) - apply blast+ - done + by (metis (mono_tags, lifting) associated_trans nth_mem subsetCE) lemma (in monoid_cancel) irrlist_listassoc_cong: assumes "\a\set as. irreducible G a" @@ -932,23 +847,41 @@ assumes a:"as [\] bs" and p: "bs <~~> cs" shows "\bs'. as <~~> bs' \ bs' [\] cs" using p a - apply (induct bs cs arbitrary: as, simp) - apply (clarsimp simp add: list_all2_Cons2, blast) - apply (clarsimp simp add: list_all2_Cons2) - apply blast - apply blast - done +proof (induction bs cs arbitrary: as) + case (swap y x l) + then show ?case + by (metis (no_types, hide_lams) list_all2_Cons2 perm.swap) +next +case (Cons xs ys z) + then show ?case + by (metis list_all2_Cons2 perm.Cons) +next + case (trans xs ys zs) + then show ?case + by (meson perm.trans) +qed auto lemma (in monoid) perm_assoc_switch_r: assumes p: "as <~~> bs" and a:"bs [\] cs" shows "\bs'. as [\] bs' \ bs' <~~> cs" using p a - apply (induct as bs arbitrary: cs, simp) - apply (clarsimp simp add: list_all2_Cons1, blast) - apply (clarsimp simp add: list_all2_Cons1) - apply blast - apply blast - done +proof (induction as bs arbitrary: cs) + case Nil + then show ?case + by auto +next + case (swap y x l) + then show ?case + by (metis (no_types, hide_lams) list_all2_Cons1 perm.swap) +next + case (Cons xs ys z) + then show ?case + by (metis list_all2_Cons1 perm.Cons) +next + case (trans xs ys zs) + then show ?case + by (blast intro: elim: ) +qed declare perm_sym [sym] @@ -1015,15 +948,13 @@ assume "abs [\] bs" and pb: "bs <~~> bcs" from perm_assoc_switch [OF this] obtain bs' where p: "abs <~~> bs'" and a: "bs' [\] bcs" by blast - assume "as <~~> abs" with p have pp: "as <~~> bs'" by fast - from pp ascarr have c1: "set bs' \ carrier G" by (rule perm_closed) from pb bscarr have c2: "set bcs \ carrier G" by (rule perm_closed) - note a - also assume "bcs [\] cs" - finally (listassoc_trans) have "bs' [\] cs" by (simp add: c1 c2 cscarr) + assume "bcs [\] cs" + then have "bs' [\] cs" + using a c1 c2 cscarr listassoc_trans by blast with pp show ?thesis by (rule essentially_equalI) qed @@ -1038,46 +969,46 @@ shows "foldr (\) fs \ \ carrier G" using ascarr by (induct fs) simp_all -lemma (in comm_monoid) multlist_dividesI (*[intro]*): - assumes "f \ set fs" and "f \ carrier G" and "set fs \ carrier G" +lemma (in comm_monoid) multlist_dividesI: + assumes "f \ set fs" and "set fs \ carrier G" shows "f divides (foldr (\) fs \)" using assms - apply (induct fs) - apply simp - apply (case_tac "f = a") - apply simp - apply (fast intro: dividesI) - apply clarsimp - apply (metis assms(2) divides_prod_l multlist_closed) - done +proof (induction fs) + case (Cons a fs) + then have f: "f \ carrier G" + by blast + show ?case + proof (cases "f = a") + case True + then show ?thesis + using Cons.prems by auto + next + case False + with Cons show ?thesis + by clarsimp (metis f divides_prod_l multlist_closed) + qed +qed auto lemma (in comm_monoid_cancel) multlist_listassoc_cong: assumes "fs [\] fs'" and "set fs \ carrier G" and "set fs' \ carrier G" shows "foldr (\) fs \ \ foldr (\) fs' \" using assms -proof (induct fs arbitrary: fs', simp) +proof (induct fs arbitrary: fs') case (Cons a as fs') then show ?case - apply (induct fs', simp) - proof clarsimp - fix b bs - assume "a \ b" - and acarr: "a \ carrier G" and bcarr: "b \ carrier G" - and ascarr: "set as \ carrier G" + proof (induction fs') + case (Cons b bs) then have p: "a \ foldr (\) as \ \ b \ foldr (\) as \" - by (fast intro: mult_cong_l) - also - assume "as [\] bs" - and bscarr: "set bs \ carrier G" - and "\fs'. \as [\] fs'; set fs' \ carrier G\ \ foldr (\) as \ \ foldr (\) fs' \" - then have "foldr (\) as \ \ foldr (\) bs \" by simp - with ascarr bscarr bcarr have "b \ foldr (\) as \ \ b \ foldr (\) bs \" - by (fast intro: mult_cong_r) - finally show "a \ foldr (\) as \ \ b \ foldr (\) bs \" - by (simp add: ascarr bscarr acarr bcarr) - qed -qed + by (simp add: mult_cong_l) + then have "foldr (\) as \ \ foldr (\) bs \" + using Cons by auto + with Cons have "b \ foldr (\) as \ \ b \ foldr (\) bs \" + by (simp add: mult_cong_r) + then show ?case + using Cons.prems(3) Cons.prems(4) monoid.associated_trans monoid_axioms p by force + qed auto +qed auto lemma (in comm_monoid) multlist_perm_cong: assumes prm: "as <~~> bs" @@ -1197,14 +1128,14 @@ and asc: "fs [\] fs'" and carr: "a \ carrier G" "set fs \ carrier G" "set fs' \ carrier G" shows "wfactors G fs' a" +proof - + { from asc[symmetric] have "foldr (\) fs' \ \ foldr (\) fs \" + by (simp add: multlist_listassoc_cong carr) + also assume "foldr (\) fs \ \ a" + finally have "foldr (\) fs' \ \ a" by (simp add: carr) } + then show ?thesis using fact - apply (elim wfactorsE, intro wfactorsI) - apply (metis assms(2) assms(4) assms(5) irrlist_listassoc_cong) -proof - - from asc[symmetric] have "foldr (\) fs' \ \ foldr (\) fs \" - by (simp add: multlist_listassoc_cong carr) - also assume "foldr (\) fs \ \ a" - finally show "foldr (\) fs' \ \ a" by (simp add: carr) + by (meson asc carr(2) carr(3) irrlist_listassoc_cong wfactors_def) qed lemma (in comm_monoid) wfactors_perm_cong_l: @@ -1212,11 +1143,7 @@ and "fs <~~> fs'" and "set fs \ carrier G" shows "wfactors G fs' a" - using assms - apply (elim wfactorsE, intro wfactorsI) - apply (rule irrlist_perm_cong, assumption+) - apply (simp add: multlist_perm_cong[symmetric]) - done + using assms irrlist_perm_cong multlist_perm_cong wfactors_def by fastforce lemma (in comm_monoid_cancel) wfactors_ee_cong_l [trans]: assumes ee: "essentially_equal G as bs" @@ -1255,28 +1182,40 @@ and carr: "set as \ carrier G" shows "essentially_equal G (as[0 := (as!0 \ u)]) as" (is "essentially_equal G ?as' as") - using assms - apply (intro essentially_equalI[of _ ?as'], simp) - apply (cases as, simp) - apply (clarsimp, fast intro: associatedI2[of u]) - done +proof - + have "as[0 := as ! 0 \ u] [\] as" + proof (cases as) + case (Cons a as') + then show ?thesis + using associatedI2 carr uunit by auto + qed auto + then show ?thesis + using essentially_equal_def by blast +qed lemma (in comm_monoid_cancel) factors_cong_unit: - assumes uunit: "u \ Units G" - and anunit: "a \ Units G" + assumes u: "u \ Units G" + and a: "a \ Units G" and afs: "factors G as a" and ascarr: "set as \ carrier G" shows "factors G (as[0 := (as!0 \ u)]) (a \ u)" (is "factors G ?as' ?a'") - using assms - apply (elim factorsE, clarify) - apply (cases as) - apply (simp add: nunit_factors) - apply clarsimp - apply (elim factorsE, intro factorsI) - apply (clarsimp, fast intro: irreducible_prod_rI) - apply (simp add: m_ac Units_closed) - done +proof (cases as) + case Nil + then show ?thesis + using afs a nunit_factors by auto +next + case (Cons b bs) + have *: "\f\set as. irreducible G f" "foldr (\) as \ = a" + using afs by (auto simp: factors_def) + show ?thesis + proof (intro factorsI) + show "foldr (\) (as[0 := as ! 0 \ u]) \ = a \ u" + using Cons u ascarr * by (auto simp add: m_ac Units_closed) + show "\f\set (as[0 := as ! 0 \ u]). irreducible G f" + using Cons u ascarr * by (force intro: irreducible_prod_rI) + qed +qed lemma (in comm_monoid) perm_wfactorsD: assumes prm: "as <~~> bs" @@ -1289,7 +1228,8 @@ proof (elim wfactorsE) from prm have [simp]: "set bs \ carrier G" by (simp add: perm_closed) assume "foldr (\) as \ \ a" - then have "a \ foldr (\) as \" by (rule associated_sym, simp+) + then have "a \ foldr (\) as \" + by (simp add: associated_sym) also from prm have "foldr (\) as \ = foldr (\) bs \" by (rule multlist_perm_cong, simp) also assume "foldr (\) bs \ \ b" @@ -1306,7 +1246,7 @@ using afs bfs proof (elim wfactorsE) assume "foldr (\) as \ \ a" - then have "a \ foldr (\) as \" by (rule associated_sym, simp+) + then have "a \ foldr (\) as \" by (simp add: associated_sym) also from assoc have "foldr (\) as \ \ foldr (\) bs \" by (rule multlist_listassoc_cong, simp+) also assume "foldr (\) bs \ \ b"