src/HOL/Computational_Algebra/Formal_Power_Series.thy
changeset 77303 3c4aca1266eb
parent 74362 0135a0c77b64
child 80061 4c1347e172b1
equal deleted inserted replaced
77283:98dab34ed72d 77303:3c4aca1266eb
    57       by (simp add: fps_nonzero_nth)
    57       by (simp add: fps_nonzero_nth)
    58     then have "f $ ?n \<noteq> 0"
    58     then have "f $ ?n \<noteq> 0"
    59       by (rule LeastI_ex)
    59       by (rule LeastI_ex)
    60     moreover have "\<forall>m<?n. f $ m = 0"
    60     moreover have "\<forall>m<?n. f $ m = 0"
    61       by (auto dest: not_less_Least)
    61       by (auto dest: not_less_Least)
    62     ultimately have "f $ ?n \<noteq> 0 \<and> (\<forall>m<?n. f $ m = 0)" ..
    62     ultimately show ?thesis by metis
    63     then show ?thesis ..
    63   qed
    64   qed
    64 qed (auto simp: expand_fps_eq)
    65   show ?lhs if ?rhs
       
    66     using that by (auto simp add: expand_fps_eq)
       
    67 qed
       
    68 
    65 
    69 lemma fps_nonzeroI: "f$n \<noteq> 0 \<Longrightarrow> f \<noteq> 0"
    66 lemma fps_nonzeroI: "f$n \<noteq> 0 \<Longrightarrow> f \<noteq> 0"
    70   by auto
    67   by auto
    71 
    68 
    72 instantiation fps :: ("{one, zero}") one
    69 instantiation fps :: ("{one, zero}") one
   163   "subdegree f = (if f = 0 then 0 else LEAST n. f$n \<noteq> 0)"
   160   "subdegree f = (if f = 0 then 0 else LEAST n. f$n \<noteq> 0)"
   164 
   161 
   165 lemma subdegreeI:
   162 lemma subdegreeI:
   166   assumes "f $ d \<noteq> 0" and "\<And>i. i < d \<Longrightarrow> f $ i = 0"
   163   assumes "f $ d \<noteq> 0" and "\<And>i. i < d \<Longrightarrow> f $ i = 0"
   167   shows   "subdegree f = d"
   164   shows   "subdegree f = d"
   168 proof-
   165   by (smt (verit) LeastI_ex assms fps_zero_nth linorder_cases not_less_Least subdegree_def)
   169   from assms(1) have "f \<noteq> 0" by auto
       
   170   moreover from assms(1) have "(LEAST i. f $ i \<noteq> 0) = d"
       
   171   proof (rule Least_equality)
       
   172     fix e assume "f $ e \<noteq> 0"
       
   173     with assms(2) have "\<not>(e < d)" by blast
       
   174     thus "e \<ge> d" by simp
       
   175   qed
       
   176   ultimately show ?thesis unfolding subdegree_def by simp
       
   177 qed
       
   178 
   166 
   179 lemma nth_subdegree_nonzero [simp,intro]: "f \<noteq> 0 \<Longrightarrow> f $ subdegree f \<noteq> 0"
   167 lemma nth_subdegree_nonzero [simp,intro]: "f \<noteq> 0 \<Longrightarrow> f $ subdegree f \<noteq> 0"
   180 proof-
   168   using fps_nonzero_nth_minimal subdegreeI by blast
   181   assume "f \<noteq> 0"
       
   182   hence "subdegree f = (LEAST n. f $ n \<noteq> 0)" by (simp add: subdegree_def)
       
   183   also from \<open>f \<noteq> 0\<close> have "\<exists>n. f$n \<noteq> 0" using fps_nonzero_nth by blast
       
   184   from LeastI_ex[OF this] have "f $ (LEAST n. f $ n \<noteq> 0) \<noteq> 0" .
       
   185   finally show ?thesis .
       
   186 qed
       
   187 
   169 
   188 lemma nth_less_subdegree_zero [dest]: "n < subdegree f \<Longrightarrow> f $ n = 0"
   170 lemma nth_less_subdegree_zero [dest]: "n < subdegree f \<Longrightarrow> f $ n = 0"
   189 proof (cases "f = 0")
   171   by (metis fps_nonzero_nth_minimal fps_zero_nth subdegreeI)
   190   assume "f \<noteq> 0" and less: "n < subdegree f"
       
   191   note less
       
   192   also from \<open>f \<noteq> 0\<close> have "subdegree f = (LEAST n. f $ n \<noteq> 0)" by (simp add: subdegree_def)
       
   193   finally show "f $ n = 0" using not_less_Least by blast
       
   194 qed simp_all
       
   195 
   172 
   196 lemma subdegree_geI:
   173 lemma subdegree_geI:
   197   assumes "f \<noteq> 0" "\<And>i. i < n \<Longrightarrow> f$i = 0"
   174   assumes "f \<noteq> 0" "\<And>i. i < n \<Longrightarrow> f$i = 0"
   198   shows   "subdegree f \<ge> n"
   175   shows   "subdegree f \<ge> n"
   199 proof (rule ccontr)
   176   by (meson assms leI nth_subdegree_nonzero)
   200   assume "\<not>(subdegree f \<ge> n)"
       
   201   with assms(2) have "f $ subdegree f = 0" by simp
       
   202   moreover from assms(1) have "f $ subdegree f \<noteq> 0" by simp
       
   203   ultimately show False by contradiction
       
   204 qed
       
   205 
   177 
   206 lemma subdegree_greaterI:
   178 lemma subdegree_greaterI:
   207   assumes "f \<noteq> 0" "\<And>i. i \<le> n \<Longrightarrow> f$i = 0"
   179   assumes "f \<noteq> 0" "\<And>i. i \<le> n \<Longrightarrow> f$i = 0"
   208   shows   "subdegree f > n"
   180   shows   "subdegree f > n"
   209 proof (rule ccontr)
   181   by (meson assms leI nth_subdegree_nonzero)
   210   assume "\<not>(subdegree f > n)"
       
   211   with assms(2) have "f $ subdegree f = 0" by simp
       
   212   moreover from assms(1) have "f $ subdegree f \<noteq> 0" by simp
       
   213   ultimately show False by contradiction
       
   214 qed
       
   215 
   182 
   216 lemma subdegree_leI:
   183 lemma subdegree_leI:
   217   "f $ n \<noteq> 0 \<Longrightarrow> subdegree f \<le> n"
   184   "f $ n \<noteq> 0 \<Longrightarrow> subdegree f \<le> n"
   218   by (rule leI) auto
   185   using linorder_not_less by blast
   219 
   186 
   220 lemma subdegree_0 [simp]: "subdegree 0 = 0"
   187 lemma subdegree_0 [simp]: "subdegree 0 = 0"
   221   by (simp add: subdegree_def)
   188   by (simp add: subdegree_def)
   222 
   189 
   223 lemma subdegree_1 [simp]: "subdegree 1 = 0"
   190 lemma subdegree_1 [simp]: "subdegree 1 = 0"
   224   by  (cases "(1::'a) = 0")
   191   by (metis fps_one_nth nth_subdegree_nonzero subdegree_0)
   225       (auto intro: subdegreeI fps_ext simp: subdegree_def)
       
   226 
   192 
   227 lemma subdegree_eq_0_iff: "subdegree f = 0 \<longleftrightarrow> f = 0 \<or> f $ 0 \<noteq> 0"
   193 lemma subdegree_eq_0_iff: "subdegree f = 0 \<longleftrightarrow> f = 0 \<or> f $ 0 \<noteq> 0"
   228 proof (cases "f = 0")
   194   using nth_subdegree_nonzero subdegree_leI by fastforce
   229   assume "f \<noteq> 0"
       
   230   thus ?thesis
       
   231     using nth_subdegree_nonzero[OF \<open>f \<noteq> 0\<close>] by (fastforce intro!: subdegreeI)
       
   232 qed simp_all
       
   233 
   195 
   234 lemma subdegree_eq_0 [simp]: "f $ 0 \<noteq> 0 \<Longrightarrow> subdegree f = 0"
   196 lemma subdegree_eq_0 [simp]: "f $ 0 \<noteq> 0 \<Longrightarrow> subdegree f = 0"
   235   by (simp add: subdegree_eq_0_iff)
   197   by (simp add: subdegree_eq_0_iff)
   236 
   198 
   237 lemma nth_subdegree_zero_iff [simp]: "f $ subdegree f = 0 \<longleftrightarrow> f = 0"
   199 lemma nth_subdegree_zero_iff [simp]: "f $ subdegree f = 0 \<longleftrightarrow> f = 0"
   245 proof (cases "f=0")
   207 proof (cases "f=0")
   246   case False thus ?thesis by (force intro: subdegreeI)
   208   case False thus ?thesis by (force intro: subdegreeI)
   247 qed simp
   209 qed simp
   248 
   210 
   249 lemma subdegree_minus_commute [simp]:
   211 lemma subdegree_minus_commute [simp]:
   250   "subdegree (f-(g::('a::group_add) fps)) = subdegree (g - f)"
   212   fixes f :: "'a::group_add fps"
   251 proof (-, cases "g-f=0")
   213   shows "subdegree (f-g) = subdegree (g - f)"
   252   case True
   214 proof (cases "g-f=0")
   253   have "\<And>n. (f - g) $ n = -((g - f) $ n)" by simp
   215   case True then show ?thesis
   254   with True have "f - g = 0" by (intro fps_ext) simp
   216     by (metis fps_sub_nth nth_subdegree_nonzero right_minus_eq)
   255   with True show ?thesis by simp
       
   256 next
   217 next
   257   case False show ?thesis
   218   case False show ?thesis
   258     using nth_subdegree_nonzero[OF False] by (fastforce intro: subdegreeI)
   219     using nth_subdegree_nonzero[OF False] by (fastforce intro: subdegreeI)
   259 qed
   220 qed
   260 
   221 
   271 proof (rule subdegree_add_ge')
   232 proof (rule subdegree_add_ge')
   272   have "f + g = 0 \<Longrightarrow> False"
   233   have "f + g = 0 \<Longrightarrow> False"
   273   proof-
   234   proof-
   274     assume fg: "f + g = 0"
   235     assume fg: "f + g = 0"
   275     have "\<And>n. f $ n = - g $ n"
   236     have "\<And>n. f $ n = - g $ n"
   276     proof-
   237       by (metis add_eq_0_iff equation_minus_iff fg fps_add_nth fps_neg_nth fps_zero_nth)
   277       fix n
       
   278       from fg have "(f + g) $ n = 0" by simp
       
   279       hence "f $ n + g $ n - g $ n = - g $ n" by simp
       
   280       thus "f $ n = - g $ n" by simp      
       
   281     qed
       
   282     with assms show False by (auto intro: fps_ext)
   238     with assms show False by (auto intro: fps_ext)
   283   qed
   239   qed
   284   thus "f + g \<noteq> 0" by fast
   240   thus "f + g \<noteq> 0" by fast
   285 qed
   241 qed
   286 
   242 
   287 lemma subdegree_add_eq1:
   243 lemma subdegree_add_eq1:
   288   assumes "f \<noteq> 0"
   244   assumes "f \<noteq> 0"
   289   and     "subdegree f < subdegree (g :: 'a::monoid_add fps)"
   245   and     "subdegree f < subdegree (g :: 'a::monoid_add fps)"
   290   shows   "subdegree (f + g) = subdegree f"
   246   shows   "subdegree (f + g) = subdegree f"
   291   using   assms
   247   using assms by(auto intro: subdegreeI simp: nth_less_subdegree_zero)
   292   by      (auto intro: subdegreeI simp: nth_less_subdegree_zero)
       
   293 
   248 
   294 lemma subdegree_add_eq2:
   249 lemma subdegree_add_eq2:
   295   assumes "g \<noteq> 0"
   250   assumes "g \<noteq> 0"
   296   and     "subdegree g < subdegree (f :: 'a :: monoid_add fps)"
   251   and     "subdegree g < subdegree (f :: 'a :: monoid_add fps)"
   297   shows   "subdegree (f + g) = subdegree g"
   252   shows   "subdegree (f + g) = subdegree g"
   298   using   assms
   253   using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
   299   by      (auto intro: subdegreeI simp: nth_less_subdegree_zero)
       
   300 
   254 
   301 lemma subdegree_diff_eq1:
   255 lemma subdegree_diff_eq1:
   302   assumes "f \<noteq> 0"
   256   assumes "f \<noteq> 0"
   303   and     "subdegree f < subdegree (g :: 'a :: group_add fps)"
   257   and     "subdegree f < subdegree (g :: 'a :: group_add fps)"
   304   shows   "subdegree (f - g) = subdegree f"
   258   shows   "subdegree (f - g) = subdegree f"
   305   using   assms
   259   using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
   306   by      (auto intro: subdegreeI simp: nth_less_subdegree_zero)
       
   307 
   260 
   308 lemma subdegree_diff_eq1_cancel:
   261 lemma subdegree_diff_eq1_cancel:
   309   assumes "f \<noteq> 0"
   262   assumes "f \<noteq> 0"
   310   and     "subdegree f < subdegree (g :: 'a :: cancel_comm_monoid_add fps)"
   263   and     "subdegree f < subdegree (g :: 'a :: cancel_comm_monoid_add fps)"
   311   shows   "subdegree (f - g) = subdegree f"
   264   shows   "subdegree (f - g) = subdegree f"
   312   using   assms
   265   using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
   313   by      (auto intro: subdegreeI simp: nth_less_subdegree_zero)
       
   314 
   266 
   315 lemma subdegree_diff_eq2:
   267 lemma subdegree_diff_eq2:
   316   assumes "g \<noteq> 0"
   268   assumes "g \<noteq> 0"
   317   and     "subdegree g < subdegree (f :: 'a :: group_add fps)"
   269   and     "subdegree g < subdegree (f :: 'a :: group_add fps)"
   318   shows   "subdegree (f - g) = subdegree g"
   270   shows   "subdegree (f - g) = subdegree g"
   319   using   assms
   271   using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero)
   320   by      (auto intro: subdegreeI simp: nth_less_subdegree_zero)
       
   321 
   272 
   322 lemma subdegree_diff_ge [simp]:
   273 lemma subdegree_diff_ge [simp]:
   323   assumes "f \<noteq> (g :: 'a :: group_add fps)"
   274   assumes "f \<noteq> (g :: 'a :: group_add fps)"
   324   shows   "subdegree (f - g) \<ge> min (subdegree f) (subdegree g)"
   275   shows   "subdegree (f - g) \<ge> min (subdegree f) (subdegree g)"
   325 proof-
   276 proof-
   326   from assms have "f = - (- g) \<Longrightarrow> False" using expand_fps_eq by fastforce
   277   have "f \<noteq> - (- g)"
   327   hence "f \<noteq> - (- g)" by fast
   278     using assms expand_fps_eq by fastforce
   328   moreover have "f + - g = f - g" by (simp add: fps_ext)
   279   moreover have "f + - g = f - g" by (simp add: fps_ext)
   329   ultimately show ?thesis
   280   ultimately show ?thesis
   330     using subdegree_add_ge[of f "-g"] by simp
   281     using subdegree_add_ge[of f "-g"] by simp
   331 qed
   282 qed
   332 
   283 
   333 lemma subdegree_diff_ge':
   284 lemma subdegree_diff_ge':
   334   fixes   f g :: "'a :: comm_monoid_diff fps"
   285   fixes   f g :: "'a :: comm_monoid_diff fps"
   335   assumes "f - g \<noteq> 0"
   286   assumes "f - g \<noteq> 0"
   336   shows   "subdegree (f - g) \<ge> subdegree f"
   287   shows   "subdegree (f - g) \<ge> subdegree f"
   337   using   assms
   288   using assms by (auto intro: subdegree_geI simp: nth_less_subdegree_zero)
   338   by      (auto intro: subdegree_geI simp: nth_less_subdegree_zero)
       
   339 
   289 
   340 lemma nth_subdegree_mult_left [simp]:
   290 lemma nth_subdegree_mult_left [simp]:
   341   fixes f g :: "('a :: {mult_zero,comm_monoid_add}) fps"
   291   fixes f g :: "('a :: {mult_zero,comm_monoid_add}) fps"
   342   shows "(f * g) $ (subdegree f) = f $ subdegree f * g $ 0"
   292   shows "(f * g) $ (subdegree f) = f $ subdegree f * g $ 0"
   343   by    (cases "subdegree f") (simp_all add: fps_mult_nth nth_less_subdegree_zero)
   293   by    (cases "subdegree f") (simp_all add: fps_mult_nth nth_less_subdegree_zero)