diff -r b87b14e885af -r 43f5dfb7fa35 src/HOL/Presburger.thy --- a/src/HOL/Presburger.thy Fri Jul 15 09:18:21 2022 +0200 +++ b/src/HOL/Presburger.thy Fri Jul 22 14:39:56 2022 +0200 @@ -28,7 +28,36 @@ "\z.\(x::'b::{linorder,plus,Rings.dvd})z.\(x::'b::{linorder,plus,Rings.dvd}) d dvd x + s) = (\ d dvd x + s)" "\z.\xxxx < min z1 z2. (P x \ Q x) = (P' x \ Q' x)" + by simp + then show "\z. \x Q x) = (P' x \ Q' x)" + by blast +next + fix z1 z2 + assume "\xxx < min z1 z2. (P x \ Q x) = (P' x \ Q' x)" + by simp + then show "\z. \x Q x) = (P' x \ Q' x)" + by blast +next + have "\x t" + by fastforce + then show "\z. \x t) = True" + by auto +next + have "\x t < x" + by fastforce + then show "\z. \xx t \ x" + by fastforce + then show "\z. \x x) = False" + by auto +qed auto lemma pinf: "\\(z ::'a::linorder).\x>z. P x = P' x; \z.\x>z. Q x = Q' x\ @@ -44,7 +73,36 @@ "\z.\(x::'b::{linorder,plus,Rings.dvd})>z. (d dvd x + s) = (d dvd x + s)" "\z.\(x::'b::{linorder,plus,Rings.dvd})>z. (\ d dvd x + s) = (\ d dvd x + s)" "\z.\x>z. F = F" - by ((erule exE, erule exE,rule_tac x="max z za" in exI,simp)+,(rule_tac x="t" in exI,fastforce)+) simp_all +proof safe + fix z1 z2 + assume "\x>z1. P x = P' x" and "\x>z2. Q x = Q' x" + then have "\x > max z1 z2. (P x \ Q x) = (P' x \ Q' x)" + by simp + then show "\z. \x>z. (P x \ Q x) = (P' x \ Q' x)" + by blast +next + fix z1 z2 + assume "\x>z1. P x = P' x" and "\x>z2. Q x = Q' x" + then have "\x > max z1 z2. (P x \ Q x) = (P' x \ Q' x)" + by simp + then show "\z. \x>z. (P x \ Q x) = (P' x \ Q' x)" + by blast +next + have "\x>t. \ x < t" + by fastforce + then show "\z. \x>z. x < t = False" + by blast +next + have "\x>t. \ x \ t" + by fastforce + then show "\z. \x>z. x \ t = False" + by blast +next + have "\x>t. t \ x" + by fastforce + then show "\z. \x>z. t \ x = True" + by blast +qed auto lemma inf_period: "\\x k. P x = P (x - k*D); \x k. Q x = Q (x - k*D)\ @@ -166,8 +224,19 @@ thus "\x.(\j\{1 .. D}. \b\A. x \ b - j)\ (x \ t) \ (x + D \ t)" by blast next assume d: "d dvd D" - {fix x assume H: "d dvd x + t" with d have "d dvd (x + D) + t" - by (clarsimp simp add: dvd_def,rule_tac x= "ka + k" in exI,simp add: algebra_simps)} + have "\x. d dvd x + t \ d dvd x + D + t" + proof - + fix x + assume H: "d dvd x + t" + then obtain ka where "x + t = d * ka" + unfolding dvd_def by blast + moreover from d obtain k where *:"D = d * k" + unfolding dvd_def by blast + ultimately have "x + d * k + t = d * (ka + k)" + by (simp add: algebra_simps) + then show "d dvd (x + D) + t" + using * unfolding dvd_def by blast + qed thus "\(x::int).(\j\{1 .. D}. \b\A. x \ b - j)\ (d dvd x+t) \ (d dvd (x + D) + t)" by simp next assume d: "d dvd D" @@ -346,20 +415,7 @@ done theorem unity_coeff_ex: "(\(x::'a::{semiring_0,Rings.dvd}). P (l * x)) \ (\x. l dvd (x + 0) \ P x)" - apply (rule eq_reflection [symmetric]) - apply (rule iffI) - defer - apply (erule exE) - apply (rule_tac x = "l * x" in exI) - apply (simp add: dvd_def) - apply (rule_tac x = x in exI, simp) - apply (erule exE) - apply (erule conjE) - apply simp - apply (erule dvdE) - apply (rule_tac x = k in exI) - apply simp - done + unfolding dvd_def by (rule eq_reflection, rule iffI) auto lemma zdvd_mono: fixes k m t :: int