Library Somme_poly_tes

Require Export Polynomes_tes.

Fixpoint suma_app [p:pol]: pol -> pol :=
   [q:pol]Cases p of
      vpol => q
    | (cpol m1 p1) => (cpol m1 (suma_app p1 q))
   end.

Lemma vpol_suma_leibn: (p:pol) (suma_app vpol p)=p.
Auto.
Save.
Hints Resolve vpol_suma_leibn.

Lemma suma_vpol_leibn: (p:pol) (suma_app p vpol)=p.
(Induction p; Auto).
Intros.
Simpl.
(Rewrite -> H; Auto).
Save.
Hints Resolve suma_vpol_leibn.

Inductive equpol: pol->pol->Prop :=
   equpol_refl: (p:pol)(equpol p p)
 | equpol_sym: (p,q:pol)(equpol p q)->(equpol q p)
 | equpol_tran: (p,q,r:pol)(equpol p q)->(equpol q r)->(equpol p r)
 | equpol_cm: (m:monom)(p,q:pol)
          (equpol (cpol m (suma_app p q)) (suma_app p (cpol m q)))
 | equpol_ss: (p,p',q,q':pol)(equpol p p')->(equpol q q')->
                (equpol (suma_app p q) (suma_app p' q'))
 | equpol_smt: (k,k':Q)(t:term)(p:pol)
           (equpol (cpol (k,t) (cpol (k',t) p)) (cpol ((plusQ k k'),t) p))
 | equpol_elim: (m:monom)(p:pol)(z_monom m)->(equpol (cpol m p) p).

Hints Resolve equpol_refl equpol_sym equpol_tran equpol_cm equpol_ss equpol_smt equpol_elim.

Lemma equpol_cpol: (m:monom)(p,q:pol)(equpol p q)->
             (equpol (cpol m p) (cpol m q)).
Intros m p q H.
Change (equpol (suma_app (cpol m vpol) p)
         (suma_app (cpol m vpol) q)).
Auto.
Save.
Hints Resolve equpol_cpol.

Lemma sym_mon : (m:monom)(p:pol) (equpol (cpol (monom_op m) (cpol m p)) p).
Intros; Elim m; Intros.
Unfold monom_op.
Simpl.
Apply equpol_tran with (cpol ((plusQ (multQ_neg a) a),b) p); Auto.
Save.
Hints Resolve sym_mon.

Lemma eq_cpol: (m:monom)(p,q:pol)(equpol (cpol m p) (cpol m q))->
                               (equpol p q).
Intros.
Generalize (equpol_cpol (monom_op m) (cpol m p) (cpol m q)); Intros.
Generalize (H0 H); Intro.
Generalize (sym_mon m p) ; Intro.
Generalize (sym_mon m q) ; Intro.
Generalize (equpol_sym (cpol (monom_op m) (cpol m p)) p H2); Intro.
Generalize (H0 H) ; Clear H0; Intros.
Generalize (equpol_tran p (cpol (monom_op m) (cpol m p)) q H4).
Intros.
Apply H5.
Apply equpol_tran with (cpol (monom_op m) (cpol m q)); Trivial.
Save.
Hints Resolve eq_cpol.

Lemma equmon_cons : (m,m':monom)(equmon m m')->
                        (equpol (cpol m vpol)(cpol m' vpol)).
(Induction m; Intros c t; Induction m'; Intros c' t'; Induction 1).
(Induction 1; Intros e1 e2).
(Apply equpol_tran with vpol; Auto).

(Induction 1; Intros e1 e2).
Rewrite <- e1.
Apply equpol_tran
 with (cpol ((plusQ c (multQ_neg c')),t) (cpol (c',t) vpol)).
Apply equpol_tran
 with (cpol (c,t) (cpol ((multQ_neg c'),t) (cpol (c',t) vpol))).
Apply equpol_tran
 with (suma_app (cpol ((multQ_neg c'),t) (cpol (c',t) vpol))
        (cpol (c,t) vpol)).
Apply equpol_tran
 with (cpol ((plusQ (multQ_neg c') c'),t) (cpol (c,t) vpol)).
(Apply equpol_sym; Apply equpol_elim).
Simpl.
Auto.

Simpl.
(Apply equpol_sym; Apply equpol_smt).

Replace (cpol ((multQ_neg c'),t) (cpol (c',t) vpol))
 with (suma_app (cpol ((multQ_neg c'),t) (cpol (c',t) vpol)) vpol).
(Apply equpol_sym; Apply equpol_cm).

Trivial.

Apply equpol_smt.

Apply equpol_elim.
Unfold z_monom.
Apply eqQ_trans with (plusQ (multQ_neg c') c).
Auto.

Apply suma_op.
Auto.
Save.
Hints Resolve equmon_cons.

Lemma eq_mon_cpol: (m,m':monom)(equmon m m')->
   (p:pol)(equpol (cpol m p) (cpol m' p)).
Intros.
Change (equpol (suma_app (cpol m vpol) p) (suma_app (cpol m' vpol) p)).
EAuto.
Save.
Hints Resolve eq_mon_cpol.

Lemma mon_Q_cpol: (a,b:Q)(eqQ a b)->
   (p:pol)(y:term)(equpol (cpol (a,y) p) (cpol (b,y) p)).
Auto.
Save.
Hints Resolve mon_Q_cpol.

Lemma equpol_cpol2: (m,m':monom)(equmon m m')->(p,p':pol)(equpol p p')->
   (equpol (cpol m p) (cpol m' p')).
Intros.
Change (equpol (suma_app (cpol m vpol) p) (suma_app (cpol m' vpol) p')).
Auto.
Save.
Hints Resolve equpol_cpol2.

Lemma eq_nvpol:(p,q:pol)(equpol p q)->~(equpol p vpol)->~(equpol q vpol).
Intros.
(Unfold not; Intros).
Apply H0.
Apply equpol_tran with q; Trivial.
Save.
Hints Resolve eq_nvpol.

Lemma full_term_suma_app: (p:pol)(full_term_pol p)->
   (q:pol)(full_term_pol q)->(full_term_pol (suma_app p q)).
Induction p; Auto.
Induction m.
Induction q.
Intros.
Replace (suma_app (cpol (a,b) p0) vpol) with (cpol (a,b) p0); Auto.
 
Induction m0; Intros.
Simpl.
Apply full_term_pol_cons.
Inversion H0; Auto.
 
Apply H with q:=(cpol (a0,b0) p1); Auto.
Inversion H0; Auto.
Save.
Hints Resolve full_term_suma_app.

Theorem asoc_mon_pol : (m:monom)(p,q:pol)
   (equpol (suma_app (suma_app (cpol m vpol) p) q)
            (suma_app (cpol m vpol) (suma_app p q))).
Auto.
Save.
Hints Resolve asoc_mon_pol.

Theorem vpol_suma : (q:pol) (equpol (suma_app vpol q) q).
Auto.
Save.
Hints Resolve vpol_suma.

Theorem suma_vpol : (q:pol) (equpol (suma_app q vpol) q).
Intros.
Replace (suma_app q vpol) with q; Auto.
Save.
Hints Resolve suma_vpol.

Theorem conmt_suma : (p,q:pol)(equpol (suma_app p q) (suma_app q p)).
Induction p; Auto.
Intros m p' HR q'; Simpl.
Apply equpol_tran with (cpol m (suma_app q' p')); Auto.
Save.
Hints Resolve conmt_suma.

Theorem asoc_suma: (p,q,r:pol)(equpol (suma_app (suma_app p q) r)
                               (suma_app p (suma_app q r))).
Induction p; Auto.
Intros m p' HR q' r'; Simpl; Auto.
Save.
Hints Resolve asoc_suma.

Lemma suma_cpol: (m,n:monom)(p,q:pol)(equpol (suma_app (cpol m p) (cpol n q))
                   (cpol m (cpol n (suma_app p q)))).
Simpl; Auto.
Save.
Hints Resolve suma_cpol.

Lemma permut_suma_app:(p,q,r:pol)(equpol (suma_app p (suma_app q r))
               (suma_app q (suma_app p r))).
Intros.
Apply equpol_tran with (suma_app (suma_app p q) r); Auto.
Apply equpol_tran with (suma_app (suma_app q p) r); Auto.
Save.
Hints Resolve permut_suma_app.

Theorem monot_suma: (p,q,r:pol)(equpol p q)->
                       (equpol (suma_app p r) (suma_app q r)).
Auto.
Save.
Hints Resolve monot_suma.

Lemma monot_suma_l: (p,q,r:pol)(equpol p q)->
   (equpol (suma_app r p) (suma_app r q)).
Auto.
Save.
Hints Resolve monot_suma_l.

Lemma sumcpol_l: (m:monom)(p,q:pol)((cpol m (suma_app p q))=
   (suma_app (cpol m p) q)).
Auto.
Save.
Hints Resolve sumcpol_l.

Fixpoint pol_opp [p:pol]: pol:=
   Cases p of
      vpol => vpol
    | (cpol (c,t) p) => (cpol ((multQ_neg c),t) (pol_opp p))
   end.

Lemma suma_opp: (p:pol)(equpol (suma_app p (pol_opp p)) vpol).
Induction p; Auto.

Intro m; Elim m; Intros.
Simpl.
Apply equpol_tran with
 (cpol (a,b) (cpol ((multQ_neg a),b) (suma_app p0 (pol_opp p0)))).
Auto.

Apply equpol_tran with (cpol (a,b) (cpol ((multQ_neg a),b) vpol)).
Auto.

Apply equpol_tran with (cpol ((plusQ a (multQ_neg a)),b) vpol);
 Auto.
Save.
Hints Resolve suma_opp.

Lemma sym_mon1: (m:monom)(equpol (cpol m (pol_opp (cpol m vpol))) vpol).
Intros; Elim m; Intros.
Simpl.
Apply equpol_tran with (cpol ((plusQ a (multQ_neg a)),b) vpol);
 Auto.
Save.
Hints Resolve sym_mon1.

Lemma sum_vpol_opp: (p,q:pol)(equpol (suma_app p q) vpol)->
   (equpol p (pol_opp q)).
Intros.
Apply equpol_tran with (suma_app p (suma_app q (pol_opp q))).
(Apply equpol_tran with (suma_app p vpol); Auto).

Apply equpol_tran with (suma_app (suma_app p q) (pol_opp q)).
Auto.

Apply equpol_tran with (suma_app vpol (pol_opp q)).
Auto.

Auto.
Save.
Hints Resolve sum_vpol_opp.

Lemma sum_vpol_opp_inv: (p,q:pol)(equpol p (pol_opp q))->
   (equpol (suma_app p q) vpol).
Intros.
Apply equpol_tran with (suma_app (pol_opp q) q).
Auto.

(Apply equpol_tran with (suma_app q (pol_opp q)); Auto).
Save.
Hints Resolve sum_vpol_opp_inv.

Lemma opp_comp: (f,g:pol)(equpol f g)->(equpol (pol_opp f) (pol_opp g)).
Intros.
Apply sum_vpol_opp with p:=(pol_opp f) q:=g.
Apply equpol_tran with (suma_app (pol_opp f) f).
Apply equpol_ss.
Auto.

Auto.

Auto.
Save.
Hints Resolve opp_comp.

Lemma opp_vpol: (p:pol)(equpol p vpol)->(equpol (pol_opp p) vpol).

Intros.
Apply equpol_tran with (pol_opp vpol); Auto.
Save.
Hints Resolve opp_vpol.

Lemma eq_pol_opp_no_zero: (f:pol)
 (equpol (pol_opp f) vpol)->(equpol f vpol).
Intros.
Apply equpol_tran with (pol_opp vpol).
Apply equpol_tran with (pol_opp (pol_opp f)); Auto.

Auto.
Save.
Hints Resolve eq_pol_opp_no_zero.

Lemma mult_sum_opp3: (f,g:pol)(equpol (pol_opp (suma_app f g))
   (suma_app (pol_opp f) (pol_opp g))).
Intros.
Apply equpol_sym.
Apply sum_vpol_opp.
(Apply equpol_tran with (suma_app (pol_opp f)
                          (suma_app (pol_opp g) (suma_app f g)));
 Auto).
(Apply equpol_tran with (suma_app (pol_opp f)
                          (suma_app (pol_opp g) (suma_app g f)));
 Auto).
(Apply equpol_tran with (suma_app (pol_opp f)
                          (suma_app (suma_app (pol_opp g) g) f));
 Auto).
(Apply equpol_tran with (suma_app (pol_opp f) (suma_app vpol f)); Auto).
Save.
Hints Resolve mult_sum_opp3.

Lemma no_eq_no_vpol_opp: (f:pol)
 ~(equpol f vpol)->~(equpol (pol_opp f) vpol).
Red.
Intros.
(Cut (equpol f vpol); Intros).
(Elim H0; Auto).
 
Auto.
Save.
Hints Resolve no_eq_no_vpol_opp.

Lemma full_term_opp: (p:pol)(full_term_pol p)->(full_term_pol (pol_opp p)).
(Induction p; Auto).
Induction m.
Intros.
Simpl.
(Inversion H0; Auto).
Save.
Hints Resolve full_term_opp.


Index
This page has been generated by coqdoc