src/HOL/Library/Polynomial.thy
changeset 60040 1fa1023b13b9
parent 59983 cd2efd7d06bd
child 60352 d46de31a50c4
equal deleted inserted replaced
60039:d55937a8f97e 60040:1fa1023b13b9
    47 qed
    47 qed
    48 
    48 
    49 lemma tl_cCons [simp]:
    49 lemma tl_cCons [simp]:
    50   "tl (x ## xs) = xs"
    50   "tl (x ## xs) = xs"
    51   by (simp add: cCons_def)
    51   by (simp add: cCons_def)
    52 
       
    53 lemma MOST_SucD: "(\<forall>\<^sub>\<infinity> n. P (Suc n)) \<Longrightarrow> (\<forall>\<^sub>\<infinity> n. P n)"
       
    54   by (auto simp: MOST_nat) (metis Suc_lessE)
       
    55 
    52 
    56 subsection {* Definition of type @{text poly} *}
    53 subsection {* Definition of type @{text poly} *}
    57 
    54 
    58 typedef 'a poly = "{f :: nat \<Rightarrow> 'a::zero. \<forall>\<^sub>\<infinity> n. f n = 0}"
    55 typedef 'a poly = "{f :: nat \<Rightarrow> 'a::zero. \<forall>\<^sub>\<infinity> n. f n = 0}"
    59   morphisms coeff Abs_poly by (auto intro!: ALL_MOST)
    56   morphisms coeff Abs_poly by (auto intro!: ALL_MOST)
   499 instantiation poly :: (comm_monoid_add) comm_monoid_add
   496 instantiation poly :: (comm_monoid_add) comm_monoid_add
   500 begin
   497 begin
   501 
   498 
   502 lift_definition plus_poly :: "'a poly \<Rightarrow> 'a poly \<Rightarrow> 'a poly"
   499 lift_definition plus_poly :: "'a poly \<Rightarrow> 'a poly \<Rightarrow> 'a poly"
   503   is "\<lambda>p q n. coeff p n + coeff q n"
   500   is "\<lambda>p q n. coeff p n + coeff q n"
   504 proof (rule MOST_rev_mp[OF MOST_coeff_eq_0 MOST_rev_mp[OF MOST_coeff_eq_0]])
   501 proof -
   505   fix q p :: "'a poly" show "\<forall>\<^sub>\<infinity>n. coeff p n = 0 \<longrightarrow> coeff q n = 0 \<longrightarrow> coeff p n + coeff q n = 0"
   502   fix q p :: "'a poly" show "\<forall>\<^sub>\<infinity>n. coeff p n + coeff q n = 0"
   506     by simp
   503     using MOST_coeff_eq_0[of p] MOST_coeff_eq_0[of q] by eventually_elim simp
   507 qed
   504 qed
   508 
   505 
   509 lemma coeff_add [simp]:
   506 lemma coeff_add [simp]:
   510   "coeff (p + q) n = coeff p n + coeff q n"
   507   "coeff (p + q) n = coeff p n + coeff q n"
   511   by (simp add: plus_poly.rep_eq)
   508   by (simp add: plus_poly.rep_eq)
   525 instantiation poly :: (cancel_comm_monoid_add) cancel_comm_monoid_add
   522 instantiation poly :: (cancel_comm_monoid_add) cancel_comm_monoid_add
   526 begin
   523 begin
   527 
   524 
   528 lift_definition minus_poly :: "'a poly \<Rightarrow> 'a poly \<Rightarrow> 'a poly"
   525 lift_definition minus_poly :: "'a poly \<Rightarrow> 'a poly \<Rightarrow> 'a poly"
   529   is "\<lambda>p q n. coeff p n - coeff q n"
   526   is "\<lambda>p q n. coeff p n - coeff q n"
   530 proof (rule MOST_rev_mp[OF MOST_coeff_eq_0 MOST_rev_mp[OF MOST_coeff_eq_0]])
   527 proof -
   531   fix q p :: "'a poly" show "\<forall>\<^sub>\<infinity>n. coeff p n = 0 \<longrightarrow> coeff q n = 0 \<longrightarrow> coeff p n - coeff q n = 0"
   528   fix q p :: "'a poly" show "\<forall>\<^sub>\<infinity>n. coeff p n - coeff q n = 0"
   532     by simp
   529     using MOST_coeff_eq_0[of p] MOST_coeff_eq_0[of q] by eventually_elim simp
   533 qed
   530 qed
   534 
   531 
   535 lemma coeff_diff [simp]:
   532 lemma coeff_diff [simp]:
   536   "coeff (p - q) n = coeff p n - coeff q n"
   533   "coeff (p - q) n = coeff p n - coeff q n"
   537   by (simp add: minus_poly.rep_eq)
   534   by (simp add: minus_poly.rep_eq)
   549 instantiation poly :: (ab_group_add) ab_group_add
   546 instantiation poly :: (ab_group_add) ab_group_add
   550 begin
   547 begin
   551 
   548 
   552 lift_definition uminus_poly :: "'a poly \<Rightarrow> 'a poly"
   549 lift_definition uminus_poly :: "'a poly \<Rightarrow> 'a poly"
   553   is "\<lambda>p n. - coeff p n"
   550   is "\<lambda>p n. - coeff p n"
   554 proof (rule MOST_rev_mp[OF MOST_coeff_eq_0])
   551 proof -
   555   fix p :: "'a poly" show "\<forall>\<^sub>\<infinity>n. coeff p n = 0 \<longrightarrow> - coeff p n = 0"
   552   fix p :: "'a poly" show "\<forall>\<^sub>\<infinity>n. - coeff p n = 0"
   556     by simp
   553     using MOST_coeff_eq_0 by simp
   557 qed
   554 qed
   558 
   555 
   559 lemma coeff_minus [simp]: "coeff (- p) n = - coeff p n"
   556 lemma coeff_minus [simp]: "coeff (- p) n = - coeff p n"
   560   by (simp add: uminus_poly.rep_eq)
   557   by (simp add: uminus_poly.rep_eq)
   561 
   558 
   705 
   702 
   706 subsection {* Multiplication by a constant, polynomial multiplication and the unit polynomial *}
   703 subsection {* Multiplication by a constant, polynomial multiplication and the unit polynomial *}
   707 
   704 
   708 lift_definition smult :: "'a::comm_semiring_0 \<Rightarrow> 'a poly \<Rightarrow> 'a poly"
   705 lift_definition smult :: "'a::comm_semiring_0 \<Rightarrow> 'a poly \<Rightarrow> 'a poly"
   709   is "\<lambda>a p n. a * coeff p n"
   706   is "\<lambda>a p n. a * coeff p n"
   710 proof (intro MOST_nat[THEN iffD2] exI allI impI) 
   707 proof -
   711   fix a :: 'a and p :: "'a poly" and i
   708   fix a :: 'a and p :: "'a poly" show "\<forall>\<^sub>\<infinity> i. a * coeff p i = 0"
   712   assume "degree p < i"
   709     using MOST_coeff_eq_0[of p] by eventually_elim simp
   713   then show "a * coeff p i = 0"
       
   714     by (simp add: coeff_eq_0)
       
   715 qed
   710 qed
   716 
   711 
   717 lemma coeff_smult [simp]:
   712 lemma coeff_smult [simp]:
   718   "coeff (smult a p) n = a * coeff p n"
   713   "coeff (smult a p) n = a * coeff p n"
   719   by (simp add: smult.rep_eq)
   714   by (simp add: smult.rep_eq)