More Mpoly
authorAlexander Bentkamp <bentkamp@gmail.com>
Wed, 01 Jun 2016 10:30:14 +0200
changeset 417a17c01f0a708
parent 416 b20302afc830
child 418 8755d3fdefed
More Mpoly
More_MPoly.thy
     1.1 --- a/More_MPoly.thy	Mon May 30 16:55:59 2016 +0200
     1.2 +++ b/More_MPoly.thy	Wed Jun 01 10:30:14 2016 +0200
     1.3 @@ -395,9 +395,87 @@
     1.4  definition extract_var::"'a::comm_ring_1 mpoly \<Rightarrow> nat \<Rightarrow> 'a::comm_ring_1 mpoly mpoly" where
     1.5  "extract_var p v = (\<Sum>m. monom (remove_key v m) (monom (Poly_Mapping.single v (Poly_Mapping.lookup m v)) (coeff p m)))"
     1.6  
     1.7 +lemma extract_var_finite_set: 
     1.8 +assumes "{m'. coeff p m' \<noteq> 0} \<subseteq> S"
     1.9 +assumes "finite S"
    1.10 +shows "extract_var p v = (\<Sum>m\<in>S. monom (remove_key v m) (monom (Poly_Mapping.single v (Poly_Mapping.lookup m v)) (coeff p m)))"
    1.11 +proof-
    1.12 +  {
    1.13 +    fix m' assume "coeff p m' = 0" 
    1.14 +    then have "monom (remove_key v m') (monom (Poly_Mapping.single v (Poly_Mapping.lookup m' v)) (coeff p m')) = 0" 
    1.15 +      using monom.abs_eq monom_zero single_zero by metis
    1.16 +  }
    1.17 +  then have 0:"{a. monom (remove_key v a) (monom (Poly_Mapping.single v (Poly_Mapping.lookup a v)) (coeff p a)) \<noteq> 0} \<subseteq> S"
    1.18 +    using `{m'. coeff p m' \<noteq> 0} \<subseteq> S` by fastforce
    1.19 +  then show ?thesis 
    1.20 +    unfolding extract_var_def using Sum_any.expand_superset [OF `finite S` 0] by metis
    1.21 +qed
    1.22  
    1.23 -lemma "(\<And>m'. m\<noteq>m' \<Longrightarrow> f m' = 0) \<Longrightarrow> (\<Sum>m'. f m') = f m" sorry
    1.24 +lemma extract_var_non_zero_coeff: "extract_var p v = (\<Sum>m\<in>{m'. coeff p m' \<noteq> 0}. monom (remove_key v m) (monom (Poly_Mapping.single v (Poly_Mapping.lookup m v)) (coeff p m)))"
    1.25 +  using extract_var_finite_set  coeff_def finite_lookup order_refl by (metis (no_types, lifting) Collect_cong setsum.cong)
    1.26  
    1.27 +
    1.28 +lemma remove_key_single[simp]: "remove_key v (Poly_Mapping.single v n) = 0"
    1.29 +proof - 
    1.30 + have 0:"\<And>k. (Poly_Mapping.lookup (Poly_Mapping.single v n) k when k \<noteq> v) = 0" by (simp add: lookup_single_not_eq when_def)
    1.31 + show ?thesis unfolding remove_key_def 0 by (simp add: zero_poly_mapping_def)
    1.32 +qed
    1.33 +
    1.34 +
    1.35 +lemma extract_var_monom: 
    1.36 +shows "extract_var (monom m a) v = monom (remove_key v m) (monom (Poly_Mapping.single v (Poly_Mapping.lookup m v)) a)"
    1.37 +proof (cases "a = 0")
    1.38 +  assume "a \<noteq> 0"
    1.39 +  have 0:"{m'. coeff (monom m a) m' \<noteq> 0} = {m}" 
    1.40 +    unfolding coeff_monom using \<open>a \<noteq> 0\<close> by auto
    1.41 +  show ?thesis
    1.42 +    unfolding extract_var_non_zero_coeff unfolding 0 unfolding coeff_monom  
    1.43 +    using setsum.insert[OF finite.emptyI, unfolded setsum.empty add.right_neutral] when_def
    1.44 +    by auto
    1.45 +next 
    1.46 +  assume "a = 0"
    1.47 +  have 0:"{m'. coeff (monom m a) m' \<noteq> 0} = {}" 
    1.48 +    unfolding coeff_monom using \<open>a = 0\<close> by auto
    1.49 +  show ?thesis unfolding extract_var_non_zero_coeff 0 
    1.50 +    by (smt \<open>a = 0\<close> monom.abs_eq monom_zero setsum.empty single_zero)
    1.51 +qed
    1.52 +
    1.53 +
    1.54 +lemma extract_var_single: "extract_var (monom (Poly_Mapping.single v n) a) v = monom 0 (monom (Poly_Mapping.single v n) a)"
    1.55 +unfolding extract_var_monom by simp
    1.56 +
    1.57 +lemma extract_var_single': 
    1.58 +assumes "v \<noteq> v'"
    1.59 +shows "extract_var (monom (Poly_Mapping.single v n) a) v' = monom (Poly_Mapping.single v n) (monom 0 a)"
    1.60 +unfolding extract_var_monom using assms by (metis add.right_neutral lookup_single_not_eq remove_key_sum single_zero)
    1.61 +
    1.62 +lemma
    1.63 +fixes p::"'a::comm_ring_1 mpoly"
    1.64 +shows "reduce_nested_mpoly (extract_var p v) = p" 
    1.65 +proof (induction p rule:mpoly_induct)
    1.66 +  case (monom m a)
    1.67 +  then show ?case
    1.68 +  proof (induction m arbitrary:a rule:poly_mapping_induct)
    1.69 +    case (single v' n)
    1.70 +    show ?case 
    1.71 +    proof (cases "v' = v") 
    1.72 +      case True
    1.73 +      then show ?thesis 
    1.74 +        by (metis (no_types, lifting) insertion_single mult.right_neutral power_0 
    1.75 +        reduce_nested_mpoly_def single_zero extract_var_single)
    1.76 +    next
    1.77 +      case False
    1.78 +      then show ?thesis unfolding extract_var_single'[OF False] reduce_nested_mpoly_def insertion_single
    1.79 +        by (simp add: monom_pow mult_monom) 
    1.80 +    qed
    1.81 +  next
    1.82 +    case (sum m m' v n a)
    1.83 +    then show ?case using mult_monom[of m a m' 1] unfolding extract_var_monom
    1.84 +    
    1.85 +   
    1.86 +qed 
    1.87 +
    1.88 +thm insertion_single
    1.89  lemma "reduce_nested_mpoly (extract_var p v) = p" 
    1.90  proof (induction p rule:mpoly_induct)
    1.91    case (monom m a)
    1.92 @@ -408,9 +486,11 @@
    1.93        (monom (Poly_Mapping.single v (Poly_Mapping.lookup m' v)) (coeff (monom m a) m')) = 0" 
    1.94        using monom.abs_eq monom_zero single_zero by metis
    1.95    }
    1.96 -  then have "extract_var (monom m a) v = monom (remove_key v m) (monom (Poly_Mapping.single v (Poly_Mapping.lookup m v)) (coeff (monom m a) m))" unfolding extract_var_def  by (smt Sum_any.cong Sum_any.delta)
    1.97 -  then show ?case 
    1.98 -   sorry
    1.99 +  then have 0:"extract_var (monom m a) v = monom (remove_key v m) (monom (Poly_Mapping.single v (Poly_Mapping.lookup m v)) (coeff (monom m a) m))" 
   1.100 +    unfolding extract_var_def Sum_any.delta[of m "\<lambda>ma. monom (remove_key v ma) (monom (Poly_Mapping.single v (Poly_Mapping.lookup ma v)) (coeff (monom m a) ma))", symmetric] 
   1.101 +    by (metis (no_types, hide_lams) coeff_def lookup_single_not_eq monom.abs_eq monom.rep_eq monom_zero single_zero)
   1.102 +  show ?case unfolding 0 reduce_nested_mpoly_def 
   1.103 +   sledgehammer
   1.104  qed 
   1.105  
   1.106  end
   1.107 \ No newline at end of file