theory CoWLyndonSchutzenberger imports CoWBasic begin chapter \Lyndon-Sch\"utzenberger Equation\ text\We set up a locale representing the Lyndon-Sch\"utzenberger Equation.\ locale LS = fixes x a y b z c assumes a: "2 \ a" and b: "2 \ b" and c: "2 \ c" and eq: "x\<^sup>@a \ y\<^sup>@b = z\<^sup>@c" begin lemma per_lemma_case: assumes "\<^bold>|z\<^bold>| + \<^bold>|x\<^bold>| \ \<^bold>|x\<^sup>@a\<^bold>|" and "x \ \" shows "x\y=y\x" proof- { have "x\<^sup>@a \p z\<^sup>@c" using eq by (metis prefI) hence "x\z = z\x" by (metis append_self_conv append_self_conv2 \\<^bold>|z\<^bold>| + \<^bold>|x\<^bold>| \ \<^bold>|x\<^sup>@a\<^bold>|\ per_pref self_pref two_pers) hence "x\<^sup>@a\z\<^sup>@c = z\<^sup>@c\x\<^sup>@a" by (metis comm_add_exp) hence "x\<^sup>@a \ y\<^sup>@b = y\<^sup>@b \ x\<^sup>@a" by (metis \x\<^sup>@a \p z\<^sup>@c\ eq lqI lq_reassoc) hence ?thesis using a b by (metis add_leE comm_powers_roots le_numeral_extra(2) one_add_one) } thus ?thesis by fastforce qed lemma core_case: assumes "c = 3" and "b*\<^bold>|y\<^bold>| \ a*\<^bold>|x\<^bold>|" and "x \ \" and "y \ \" and lenx: "a*\<^bold>|x\<^bold>| < \<^bold>|z\<^bold>| + \<^bold>|x\<^bold>|" and leny: "b*\<^bold>|y\<^bold>| < \<^bold>|z\<^bold>| + \<^bold>|y\<^bold>|" shows "x\y = y\x" proof- \\We first show that a = 2\ have "a*\<^bold>|x\<^bold>|+b*\<^bold>|y\<^bold>| = 3*\<^bold>|z\<^bold>|" using \c = 3\ eq length_append[of "x\<^sup>@a" "y\<^sup>@b"] by (simp add: power_len) hence "3*\<^bold>|z\<^bold>| \ a*\<^bold>|x\<^bold>| + a*\<^bold>|x\<^bold>|" using \b*\<^bold>|y\<^bold>| \ a*\<^bold>|x\<^bold>|\ by simp hence "3*\<^bold>|z\<^bold>| < 2*\<^bold>|z\<^bold>| + 2*\<^bold>|x\<^bold>|" using lenx by linarith hence "\<^bold>|z\<^bold>| + \<^bold>|x\<^bold>| < 3 * \<^bold>|x\<^bold>|" by simp hence "a * \<^bold>|x\<^bold>| < 3 * \<^bold>|x\<^bold>|" using lenx by linarith hence "a = 2" using a by simp hence "\<^bold>|y\<^bold>| \ \<^bold>|x\<^bold>|" using \b*\<^bold>|y\<^bold>| \ a*\<^bold>|x\<^bold>|\ b power_len[of x 2] power_len[of y b] mult_le_less_imp_less[of a b "\<^bold>|x\<^bold>|" "\<^bold>|y\<^bold>|"] not_le by auto have "x\x\y\<^sup>@b = z\z\z" using a eq \c=3\ \a=2\ by (simp add: numeral_2_eq_2 numeral_3_eq_3) \ \Find words u, v, w\ have "\<^bold>|z\<^bold>| < \<^bold>|x\x\<^bold>|" using \\<^bold>|z\<^bold>| + \<^bold>|x\<^bold>| < 3 * \<^bold>|x\<^bold>|\ add.commute by auto then obtain w where "x\x = z\w" using \x\x\y\<^sup>@b = z\z\z\ ruler_le nat_less_le append.assoc by (metis prefix_def) have "\<^bold>|x\<^bold>| < \<^bold>|z\<^bold>|" using \a = 2\ lenx by auto then obtain u :: "'a list" where "z=x\u" using \x\x\y\<^sup>@b = z\z\z\ nat_less_le append.assoc ruler_le by (metis prefix_def) have "u \ \" using \\<^bold>|x\<^bold>| < \<^bold>|z\<^bold>|\ \z = x\u\ by auto have "x = u\w" using \x\x = z\w\ \z = x\u\ by auto have "\<^bold>|x\x\<^bold>| < \<^bold>|z\z\<^bold>|" by (simp add: \\<^bold>|x\<^bold>| < \<^bold>|z\<^bold>|\ add_less_mono) have "z\w \p z\z" using \x\x = z\w\ \x\x\y\<^sup>@b = z\z\z\ by (metis \\<^bold>|x \ x\<^bold>| < \<^bold>|z \ z\<^bold>|\ less_imp_le_nat prefI ruler_le) then obtain v :: "'a list" where "x = w \ v" by (metis \x = u \ w\ \z = x \ u\ lq_pref pref_cancel pref_prod_shorter1) have "u\w\v \ \" by (simp add: \u \ \\) \ \Express x, y and z in terms of u, v and w\ hence "z = w\v\u" by (simp add: \z = x\u\ \x = w \ v\) hence "w\v \ u\w \ y\<^sup>@b = w\v\u\w\v\u\w\v\u" using \x \ x = z \ w\ \x \ x \ y\<^sup>@b = z \ z \ z\ by auto hence "y\<^sup>@b = v\u\w\v\u" using \x = u\w\ \x = w\v\ \x\x\y\<^sup>@b = z\z\z\ append.assoc by auto \ \Double period of uwv\ hence "periodN (u\w\v) \<^bold>|y\<^bold>|" using \x \ \\ \y \ \\ per_factor[of y "u\w\v" v u b, OF \y \ \\ \u\w\v\\\] by (metis append_assoc) have "u\w\v = x \v" by (simp add: \x = u \ w\) have "u\w\v = u\ x" by (simp add: \x = w \ v\) have "u\w\v \p u\<^sup>\" by (metis \u \ w \ v = u \ x\ \u \ \\ \x = u \ w\ period_root_def pref_ext triv_pref) have "periodN (u\w\v) \<^bold>|u\<^bold>|" using \u \ w \ v \p u \<^sup>\\ by auto \ \Common period d\ obtain d::nat where "d=gcd \<^bold>|y\<^bold>| \<^bold>|u\<^bold>|" by simp have "\<^bold>|y\<^bold>| + \<^bold>|u\<^bold>| \ \<^bold>|u\w\v\<^bold>|" using \\<^bold>|y\<^bold>| \ \<^bold>|x\<^bold>|\ length_append \u\w\v = u\ x\ by simp hence "periodN (u\w\v) d" using \periodN (u \ w \ v) \<^bold>|u\<^bold>|\ \periodN (u \ w \ v) \<^bold>|y\<^bold>|\ \d = gcd \<^bold>|y\<^bold>| \<^bold>|u\<^bold>|\ two_periodsN by blast \ \Divisibility\ have "v\u\z=y\<^sup>@b" by (simp add: \y\<^sup>@b = v \ u \ w \ v \ u\ \z = w \ v \ u\) have "\<^bold>|u\<^bold>| = \<^bold>|v\<^bold>|" using \x = u \ w\ \x = w \ v\ length_append[of u w] length_append[of w v] add.commute[of "\<^bold>|u\<^bold>|" "\<^bold>|w\<^bold>|"] add_left_cancel by simp hence "d dvd \<^bold>|v\<^bold>|" using gcd_nat.cobounded1[of "\<^bold>|v\<^bold>|" "\<^bold>|y\<^bold>|"] gcd.commute[of "\<^bold>|y\<^bold>|" "\<^bold>|u\<^bold>|"] by (simp add: \d = gcd \<^bold>|y\<^bold>| \<^bold>|u\<^bold>|\) have "d dvd \<^bold>|u\<^bold>|" by (simp add: \d = gcd \<^bold>|y\<^bold>| \<^bold>|u\<^bold>|\) have "\<^bold>|z\<^bold>| = b*\<^bold>|y\<^bold>| - \<^bold>|u\<^bold>| - \<^bold>|v\<^bold>|" using \v\u\z=y\<^sup>@b\ by (metis add.commute add_diff_cancel_left' diff_diff_add length_append power_len) hence "d dvd \<^bold>|z\<^bold>|" using \v\u\z=y\<^sup>@b\ length_append power_len \d dvd \<^bold>|u\<^bold>|\ \d dvd \<^bold>|v\<^bold>|\ using \d = gcd \<^bold>|y\<^bold>| \<^bold>|u\<^bold>|\ \d dvd \<^bold>|v\<^bold>|\ by auto hence "d dvd \<^bold>|w\<^bold>|" using \z = w \ v \ u\ \d dvd \<^bold>|u\<^bold>|\ \d dvd \<^bold>|v\<^bold>|\ by (metis gcd_add1 gcd_nat.bounded_iff length_append) hence "d dvd \<^bold>|x\<^bold>|" by (simp add: \d dvd \<^bold>|v\<^bold>|\ \x = w \ v\) \ \x and y commute\ have "x \p u\w\v" by (simp add: \x = u \ w\) have "periodN x d" using per_pref'[OF \x\\\ \periodN (u\w\v) d \ \x \p u \w\v\]. hence "x \ (take d x)*" using \d dvd \<^bold>|x\<^bold>|\ using root_divisor by blast hence "periodN u d " using \x = u \ w\ per_pref' using \periodN x d\ \u \ \\ by blast have " take d x = take d u" using \u\\\ \x = u \ w\ pref_share_take by (simp add: \d = gcd \<^bold>|y\<^bold>| \<^bold>|u\<^bold>|\) hence "u \ (take d x)*" by (metis \periodN u d\ \d dvd \<^bold>|u\<^bold>|\ root_divisor) hence "z \ (take d x)*" using \z=x\u\ \x \ (take d x)*\ using add_roots by blast hence "y\<^sup>@b \ (take d x)*" using eq \u \ w \ v = u \ x\ \u \ w \ v = x \ v\ \u \ take d x*\ \v \ u \ z = y\<^sup>@b\ \x \ take d x*\ \z \ take d x*\ add_roots cancel comm_root1 by (metis) thus ?thesis using \x \ (take d x)*\ comm_drop_exp by (metis \u \ \\ \y\<^sup>@b = v \ u \ w \ v \ u\ append_is_Nil_conv comm_root1 power_zero) qed end \ \locale LS\ theorem Lyndon_Schutzenberger: "\ x\<^sup>@a\y\<^sup>@b = z\<^sup>@c; 2 \ a; 2 \ b; 2 \ c \ \ x\y = y\x" proof (induction "\<^bold>|z\<^bold>| + b* \<^bold>|y\<^bold>|" arbitrary: x y z a b c rule: nat_less_induct) case 1 then show ?case proof- interpret LS x a y b z c using \ x\<^sup>@a\y\<^sup>@b = z\<^sup>@c\ \ 2 \a \ \ 2 \ b\ \ 2 \ c\ by (simp add: LS.intro) interpret LSrev: LS "rev y" b "rev x" a "rev z" c using \x\<^sup>@a \ y\<^sup>@b = z\<^sup>@c\ by (metis LS.intro a b c rev_append rev_power) \ \trivial case\ have triv: "x = \ \ y = \ \ ?thesis" by auto \ \WLOG assumption\ { assume "\<^bold>|x\<^sup>@a\<^bold>| < \<^bold>|y\<^sup>@b\<^bold>|" have "\<^bold>|rev z\<^bold>| + a* \<^bold>|rev x\<^bold>| < \<^bold>|z\<^bold>| + b* \<^bold>|y\<^bold>|" using \\<^bold>|x\<^sup>@a\<^bold>| < \<^bold>|y\<^sup>@b\<^bold>|\ by (simp add: power_len) hence "(rev y)\(rev x) = (rev x)\(rev y)" using "1.hyps" LSrev.eq a b c by blast hence ?thesis by (metis rev_append rev_rev_ident) } note WLOG_assumption = this {assume "\<^bold>|y\<^sup>@b\<^bold>| \ \<^bold>|x\<^sup>@a\<^bold>|" \ \case solved by the Periodicity lemma\ { assume short: "(\<^bold>|z\<^bold>| + \<^bold>|x\<^bold>| \ \<^bold>|x\<^sup>@a\<^bold>|) \ (\<^bold>|z\<^bold>| + \<^bold>|y\<^bold>| \ \<^bold>|y\<^sup>@b\<^bold>|)" have triv': "x = \ \ rev y = \ \ ?thesis" by auto hence ?thesis using per_lemma_case LSrev.per_lemma_case short by (metis length_rev rev_append rev_is_rev_conv rev_power) } note periodicity_lemma_case = this \ \the case without Periodicity lemma\ { assume lenx: "\<^bold>|x\<^sup>@a\<^bold>| < \<^bold>|z\<^bold>| + \<^bold>|x\<^bold>|" and leny: "\<^bold>|y\<^sup>@b\<^bold>| < \<^bold>|z\<^bold>| + \<^bold>|y\<^bold>|" \ \implies c < 4\ have ex: "\ k. d = Suc (Suc k)" if "2 \ d" for d using nat_le_iff_add that by auto have "\<^bold>|x\<^sup>@a\<^bold>| + \<^bold>|y\<^sup>@b\<^bold>| < 4 * \<^bold>|z\<^bold>|" using ex[OF \2 \ a\] ex[OF \2 \ b\] lenx leny by auto hence "c < 4" using power_len eq length_append mult_less_cancel2[of c "\<^bold>|z\<^bold>|" 4] by metis \ \case c = 3\ {assume "c = 3" and "x \ \" and "y \ \" hence ?thesis using \\<^bold>|y\<^sup>@b\<^bold>| \ \<^bold>|x\<^sup>@a\<^bold>|\ core_case lenx leny by (simp add: power_len) } note c_equals_3 = this \ \the remaining case c = 2\ {assume "c = 2" and "x \ \" and "y \ \" hence eq2: "x\<^sup>@a \ y\<^sup>@b = z \ z" by (simp add: \x \ \\ eq power2_list) obtain a' where "a = Suc a'" using \2 \ a\ using ex by auto hence "x\<^sup>@a'\x\y\<^sup>@b=z\z" using \c = 2\ \x\<^sup>@a\y\<^sup>@b = z\<^sup>@c\ by (metis add_one_exp eq2) have "(Suc d)*m < (n::nat)" if "(Suc (Suc d))*m < n + m" for d m n using that by auto hence "\<^bold>|x\<^sup>@a'\<^bold>| < \<^bold>|z\<^bold>|" using \a = Suc a'\ lenx power_len by auto hence "x\<^sup>@a' \p z" using \x\<^sup>@a'\x\y\<^sup>@b=z\z\ by (metis append.assoc less_imp_le_nat prefI pref_comp_len ruler_comp) have "x\<^sup>@a' \ z" using \\<^bold>|x\<^sup>@a'\<^bold>| < \<^bold>|z\<^bold>|\ by blast then obtain u where "z=x\<^sup>@a'\u" and "u \ \" using \x\<^sup>@a' \p z\ prefE by blast have "\<^bold>|y\<^sup>@b\<^bold>| + \<^bold>|y\<^sup>@b\<^bold>| \ \<^bold>|z\<^bold>| + \<^bold>|z\<^bold>|" using \\<^bold>|y\<^sup>@b\<^bold>| \ \<^bold>|x\<^sup>@a\<^bold>|\ eq2 length_append[of "x\<^sup>@a" "y\<^sup>@b"] length_append[of z z] by simp hence "\<^bold>|y\<^sup>@b\<^bold>| \ \<^bold>|z\<^bold>|" by simp have "y\<^sup>@b \s z" using \x\<^sup>@a'\x\y\<^sup>@b=z\z\ by (metis \\<^bold>|y\<^sup>@b\<^bold>| \ \<^bold>|z\<^bold>|\ suf_prod_shorter4 suffix_def) then obtain w where "z=w\y\<^sup>@b" using \ x\<^sup>@a\y\<^sup>@b = z\<^sup>@c\ \c=2\ using suffix_def by blast hence "x\<^sup>@a'\x\y\<^sup>@b = x\<^sup>@a'\u\w\y\<^sup>@b" using \x\<^sup>@a'\x\y\<^sup>@b=z\z\ \z=x\<^sup>@a'\u\ by simp hence "u\w=x" by auto hence "w\z = (w\u)\<^sup>@a" using \z=x\<^sup>@a'\u\ power_slide[of w u a'] append_assoc by (simp add: \a = Suc a'\) \ \Induction step: new equation with shorter z\ hence "(w\u)\<^sup>@a = w\<^sup>@2\y\<^sup>@b" by (simp add: \z = w \ y\<^sup>@b\ power2_list) have "\<^bold>|x\<^bold>| \ \<^bold>|x\<^sup>@(a-1)\<^bold>|" using a using le_diff_iff' nat_le_iff_add by auto hence "\<^bold>|x\<^bold>| < \<^bold>|z\<^bold>|" using \\<^bold>|x\<^sup>@a'\<^bold>| < \<^bold>|z\<^bold>|\ le_less_trans by (simp add: \a = Suc a'\) hence "\<^bold>|w\u\<^bold>| + b* \<^bold>|y\<^bold>| < \<^bold>|z\<^bold>| + b*\<^bold>|y\<^bold>|" using \u\w=x\ by auto hence "w\y = y\w" using \(w\u)\<^sup>@a = w\<^sup>@2\y\<^sup>@b\ \a \ 2\ \b \ 2\ "1.hyps" by (metis \c = 2\ c) hence "(w\u)\<^sup>@a \ w = w \ (w\u)\<^sup>@a" by (metis \w \ z = (w \ u)\<^sup>@a\ \z = w \ y\<^sup>@b\ append_assoc comm_add_exp) hence "w \ u = u \ w" using comm_drop_exp[OF _ \(w\u)\<^sup>@a \ w = w \ (w\u)\<^sup>@a\] \2 \ a\ by simp hence "x\<^sup>@a\y=y\x\<^sup>@a" proof- have "x\<^sup>@a \ y = w \ z \ y" by (simp add: \u \ w = x\ \w \ u = u \ w\ \w \ z = (w \ u)\<^sup>@a\) also have "... = w \ w \ y\<^sup>@b \ y" by (simp add: \z = w \ y\<^sup>@b\) also have "... = y \ w \ w \ y\<^sup>@b" by (simp add: \w \ y = y \ w\ comm_add_exp) also have "... = y\x\<^sup>@a" using \u \ w = x\ \w \ u = u \ w\ \w \ z = (w \ u)\<^sup>@a\ \z = w \ y\<^sup>@b\ by auto finally show ?thesis by simp qed hence "x \ y = y \ x" using comm_drop_exp[OF _ \x\<^sup>@a\y=y\x\<^sup>@a\] \2 \ a\ by simp }note c_equals_2 = this hence ?thesis using triv c_equals_3 \c < 4\ \c \ 2\ by (metis Suc_numeral leD less_antisym semiring_norm(2) semiring_norm(5) semiring_norm(8)) } note core_case = this hence ?thesis using periodicity_lemma_case using not_le_imp_less by blast } thus ?thesis using WLOG_assumption leI by blast qed qed end