equal
deleted
inserted
replaced
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) |