Library orden_pol

Require Export Hmtc.

Require Export Relations.

Inductive Tpol_Lex3: pol -> pol -> Prop :=
  Tpol_Lex3_v: (m:monom)(p:pol)(full_mon n m)->
                    (full_term_pol p)->
                   (Tpol_Lex3 vpol (cpol m p))
 |Tpol_Lex3_car: (m1,m2:monom)(p1,p2:pol)(full_mon n m1)->
   (full_mon n m2)->(full_term_pol p1)->(full_term_pol p2)->
     (Ttm (mon_term m1) (mon_term m2))->
                    (Tpol_Lex3 (cpol m1 p1) (cpol m2 p2))
 |Tpol_Lex3_cdr: (k1,k2:Q)(t:term)(p1,p2:pol)(full n t)->
    (full_term_pol p1)->(full_term_pol p2)->
     (Tpol_Lex3 p1 p2)->
       (Tpol_Lex3 (cpol (k1,t) p1) (cpol (k2,t) p2)).
 
Hints Resolve Tpol_Lex3_v Tpol_Lex3_car Tpol_Lex3_cdr.

Lemma ext_l_Tpol_Lex3: (p,q:pol)(Tpol_Lex3 p q)->(full_pol p)->
(full_pol q)->(r:pol)(equpol p r)->(full_pol r)->(Tpol_Lex3 r q).

Intros p q.
Induction 1.
Induction m.
Induction r; Auto.
Induction m0; Intros.
Cut (cpol (a0,b0) p1)=vpol; Intros.
Rewrite H7; Auto.

Apply full_eq_vpol; Auto.

Induction m1; Induction m2.
Induction r; Auto.
Induction m; Intros.
Simpl in H4.
Cut b=b1; Intros.
Apply Tpol_Lex3_car; Auto.
Simpl.
Inversion H9; Auto.

Inversion H9; Auto.

Simpl.
Rewrite <- H10; Trivial.

Transitivity (hterm (cpol (a,b) p1)).
Symmetry; Auto.

Transitivity (hterm (cpol (a1,b1) p0)); Auto.

Induction r; Auto.
Induction m; Intros.
Cut t=b; Intros.
Rewrite H10.
Apply Tpol_Lex3_cdr; Trivial.
Inversion H9; Auto.

Inversion H9; Auto.

Apply H4.
Inversion H9; Auto.
Inversion H5; Auto.

Inversion H6; Auto.

Rewrite H10 in H8.
Cut (eqQ k1 a); Intros.
Apply eq_cpol with (a,b); Auto.
Apply equpol_tran with (cpol (k1,b) p1); Auto.

Apply eqQ_trans with (hcoef (cpol (k1,t) p1)); Auto.
Apply eqQ_trans with (hcoef (cpol (a,b) p0)); Auto.
Apply eq_hcoef; Auto.
Rewrite H10; Auto.

Inversion H9; Auto.

Transitivity (hterm (cpol (k1,t) p1)).
Symmetry; Auto.

Transitivity (hterm (cpol (a,b) p0)); Auto.
Save.

Lemma ext_r_Tpol_Lex3: (p,q:pol)(Tpol_Lex3 p q)->(full_pol p)->
(full_pol q)->(r:pol)(equpol q r)->(full_pol r)->(Tpol_Lex3 p r).

Intros p q.
Induction 1.
Induction m.
Induction r.
Intros.
Inversion H3.
Cut (eqQ a OQ); Intros.
Elim H9; Auto.

Apply eqQ_trans with (hcoef (cpol (a,b) p0)); Auto.
Cut (cpol (a,b) p0)=vpol; Intros.
Rewrite H13.
Apply hcoef_vpol.

Apply full_eq_vpol; Auto.

Induction m0; Intros.
Apply Tpol_Lex3_v.
Simpl.
Inversion H6; Auto.

Inversion H6; Auto.

Induction m1; Induction m2.
Induction r.
Intros.
Simpl in H4.
Cut (cpol (a0,b0) p2)=vpol; Intros.
Rewrite <- H9.
Apply Tpol_Lex3_car; Auto.

Apply full_eq_vpol; Auto.

Induction m; Intros.
Simpl in H4.
Cut b0=b1; Intros.
Rewrite <- H10.
Apply Tpol_Lex3_car; Auto.
Inversion H9; Auto.

Transitivity (hterm (cpol (a0,b0) p2)).
Symmetry; Auto.

Transitivity (hterm (cpol (a1,b1) p0)); Auto.

Induction r.
Intros.
Inversion H6.
Cut (eqQ k2 OQ); Intros.
Elim H12; Auto.

Apply eqQ_trans with (hcoef (cpol (k2,t) p2)); Auto.
Cut (cpol (k2,t) p2)=vpol; Intros.
Rewrite H16.
Apply hcoef_vpol.

Apply full_eq_vpol; Auto.

Induction m; Intros.
Cut t=b; Intros.
Rewrite H10.
Apply Tpol_Lex3_cdr; Auto.
Inversion H9; Auto.

Inversion H9; Auto.

Apply H4.
Inversion H5; Auto.

Inversion H6; Auto.

Rewrite H10 in H8.
Cut (eqQ k2 a); Intros.
Apply eq_cpol with (a,b); Auto.
Apply equpol_tran with (cpol (k2,b) p2); Auto.

Apply eqQ_trans with (hcoef (cpol (k2,t) p2)); Auto.
Apply eqQ_trans with (hcoef (cpol (a,b) p0)); Auto.
Apply eq_hcoef; Auto.
Rewrite H10; Auto.

Inversion H9; Auto.

Transitivity (hterm (cpol (k2,t) p2)).
Symmetry; Auto.

Transitivity (hterm (cpol (a,b) p0)); Auto.
Save.

Theorem Tpol_Lex3_no_refl: (p:pol) ~(Tpol_Lex3 p p).

Induction p.
Red; Intros H; Inversion H.

Intros m p0 H.
Red; Intros H1.
Simple Inversion H1.
Discriminate H3.

Injection H6.
Injection H7.
Intros H8 H9 H10 H11.
Rewrite H11.
Rewrite H9.
Induction m; Simpl; Intros.
Apply (Ttm_nonrefl b); Trivial.

Injection H5; Injection H6.
Intros H9 H10 H11 H12.
Rewrite H9.
Rewrite H11; Intros; Elim H; Trivial.
Save.
Hints Resolve Tpol_Lex3_no_refl.

Theorem Tpol_Lex3_tran: (p,q,r:pol)(Tpol_Lex3 p q) -> (Tpol_Lex3 q r) -> (Tpol_Lex3 p r).

Intros p q r H; Generalize r; Clear r; Elim H.
Induction m.
Intros a b p0 fb fp0 r; Case r.
Intros H1; Inversion H1.

Induction m0; Intros.
Apply Tpol_Lex3_v.
Inversion H0; Auto.

Inversion H0; Auto.

Induction m1; Induction m2; Intros.
Simple Inversion H5.
Discriminate H8.

Rewrite <- H12.
Generalize H11; Clear H11.
Elim m3; Elim m0; Intros.
Apply Tpol_Lex3_car; Auto.
Simpl.
Simpl in H10.
Simpl in H4.
Apply Ttm_trans with b0 n; Auto.
Injection H11; Intros.
Rewrite <- H14; Auto.

Rewrite <- H11; Intros.
Apply Tpol_Lex3_car; Auto.
Simpl.
Simpl in H4.
Injection H10; Intros.
Rewrite H13; Trivial.

Intros.
Simple Inversion H5.
Intros.
Discriminate H8.

Rewrite <- H12.
Generalize H11; Clear H11.
Induction m1; Induction m2; Intros.
Apply Tpol_Lex3_car; Auto.
Simpl.
Simpl in H10.
Injection H11; Intros.
Rewrite <- H14; Trivial.

Rewrite <- H11; Intros.
Injection H10; Intros.
Rewrite H13.
Apply Tpol_Lex3_cdr; Auto.
Apply H4.
Rewrite <- H12; Trivial.
Save.

Theorem ext_full_Tpol: (m:monom)(p:pol)(full_pol (cpol m p))->(Tpol_Lex3 p (cpol m vpol)).

Induction m.
Intros a b p; Induction p.
Intros.
Apply Tpol_Lex3_v; Auto.
Inversion H; Auto.

Elim m0; Intros.
Apply Tpol_Lex3_car; Trivial.
Inversion H.
Inversion H5; Auto.

Inversion H; Auto.

Inversion H.
Inversion H5; Auto.

Simpl.
Inversion H.
Inversion H6; Auto.
Save.

Theorem Tpol_tran_mon: (m,m1,m2:monom)(p,q:pol)(Tpol_Lex3 (cpol m p) (cpol m1 q))
          ->(full_mon n m2)->(Ttm (mon_term m1) (mon_term m2))->
     (Ttm (mon_term m) (mon_term m2)).

Induction m; Induction m1; Induction m2.
Intros a1 b1 p q H.
Inversion H.
Intros.
Simpl.
Simpl in H8.
Simpl in H10.
Apply Ttm_trans with b0 n; Auto.

Intro fb1.
Simpl; Trivial.
Save.
Hints Resolve Tpol_tran_mon.

Theorem Tpol_cpol_full: (m:monom)(p:pol)(full_mon n m)->
        (full_pol p)->~(z_monom m)->(Tpol_Lex3 p (cpol m vpol))->
              (full_pol (cpol m p)).

Induction m; Intros.
Apply full_pol_cons; Auto.
Inversion H2; Auto.
Generalize m1 H10 H5; Clear H8 H10 H5 m1.
Induction m1; Auto.

Inversion H10; Auto.
Save.

Lemma s_l_ord_pol: (x,y,z:pol)(full_pol (suma_app x y))->(full_pol (suma_app x z))->
   (Tpol_Lex3 (suma_app x y) (suma_app x z))->(Tpol_Lex3 y z).

Induction x.
Simpl; Trivial.

Induction m.
Simpl; Intros.
Inversion H2.
Simpl in H11.
Cut ~(Ttm b b); Intros; Auto.
Elim H12; Auto.

Apply H; Auto.
Inversion H0; Auto.

Inversion H1; Auto.
Save.

Lemma s_t_ord_p: (b,c:Q)(t,t':term)(x:pol)
(full_pol (suma_app x (cpol (b,t) vpol)))->(full_pol (suma_app x (cpol (c,t') vpol)))->
   (Tpol_Lex3 (suma_app x (cpol (b,t) vpol)) (suma_app x (cpol (c,t') vpol)))->
      (Ttm t t').

Intros.
Cut (Tpol_Lex3 (cpol (b,t) vpol) (cpol (c,t') vpol)); Intros.
Inversion H2.
Simpl in H11; Auto.

Cut ~(Tpol_Lex3 vpol vpol); Intros; Auto.
Elim H13; Auto.

Apply s_l_ord_pol with x; Auto.
Save.

Lemma auxiliar2: (b:Q)(t:term)(x,x0:pol)(full_pol (suma_app x x0))->
   (full n t)->((t':term)(term_in_pol x t')->(Ttm t t'))->
      ((t':term)(term_in_pol x0 t')->(Ttm t' t))->
   (Tpol_Lex3 (suma_app x x0) (suma_app x (cpol (b,t) vpol))).

Induction x.
Simpl.
Induction x0; Auto.

Induction m; Intros.
Apply Tpol_Lex3_car; Trivial.
Simpl.
Inversion H0; Auto.

Inversion H0; Auto.

Simpl.
Apply H3.
Red.
Red; Intros.
Cut (eqQ (coef (cpol (a,b0) p) b0) a); Intros.
Cut (eqQ OQ a); Intros.
Inversion H0; Auto.

Apply eqQ_trans with (coef (cpol (a,b0) p) b0); Auto.

Apply coef_first; Auto.

Induction m.
Induction x0.
Simpl; Intros.
Cut p=(suma_app p vpol); Intros; Auto.
Rewrite <- H4 in H0.
Inversion H0.
Apply Tpol_Lex3_cdr; Auto.
Apply H; Auto.
Rewrite <- H4; Auto.

Intros.
Apply H2.
Apply full_pol_cons_term; Auto.

Induction m0; Intros.
Cut (full_pol (cpol (a,b0) p)).
Simpl; Intros.
Simpl in H1.
Apply Tpol_Lex3_cdr; Auto.
Inversion H1; Auto.

Inversion H1; Auto.

Apply full_term_suma_app; Auto.
Inversion H5; Auto.

Apply H; Intros; Auto.
Inversion H1; Auto.

Apply H3; Auto.
Apply full_pol_cons_term; Auto.

Elim suma_app_full with (cpol (a,b0) p) (cpol (a0,b1) p0); Auto.
Save.

Definition pol_full := {p:pol | (full_pol p)}.

Definition Tpol_full: pol_full-> pol_full-> Prop :=
   [a,b :pol_full ]
    ( <Prop> Case a of
      [p : pol]
      [H1 : (full_pol p)]
       ( <Prop> Case b of [q: pol] [H2: (full_pol q)] (Tpol_Lex3 p q) end )
      end ).

Fixpoint pol_Lex_rec [p:pol]: (list term) := Cases p of
   vpol => (nil ?)
  |(cpol (k,t) p1) => (cons t (pol_Lex_rec p1))
  end.

Lemma pol_rec_Tpol_lex3: (p,q: pol) (Tpol_Lex3 p q)->(Ltl ? Ttm (pol_Lex_rec p) (pol_Lex_rec q)).

Intros.
Elim H.
Induction m; Simpl; Intros.
Apply (Lt_nil term).

Induction m1; Induction m2; Simpl; Intros.
Apply (Lt_hd term); Trivial.

Simpl; Intros.
Apply (Lt_tl term); Trivial.
Save.
Hints Resolve pol_rec_Tpol_lex3.

Definition Listterm_desc:= [p:pol] (Desc term Ttm (pol_Lex_rec p)).

Lemma Desc_rev: (l:(list term))(t,b:term)(Ttm b t)->(Desc term Ttm (cons b l))->
                  (Desc term Ttm (cons t (cons b l))).

Cut (l':(list term))(b,t:term)
   (Ttm b t)->
   (Desc term Ttm l')->
   (l:?) l'=(cons b l)->
   (Desc term Ttm (cons t l')); EAuto.

Induction 2; Intros.
Discriminate H1.

Apply d_conc with x:=x y:=t l:=(nil term).
Injection H1; Intros.
Rewrite -> H3; Trivial.

Simpl; Constructor.

Apply d_conc with x:=x y:=y l:=(cons t l); Trivial.

Apply H3 with (tail (app l (cons y (nil ?)))).
NewDestruct l; Simpl; Simpl in H4.
Inversion H4; Trivial.

Inversion H4; Trivial.
Save.

Lemma Desc_rev_pol: (p:pol)(t,b:term)(Ttm b t)->(Desc term Ttm (cons b (pol_Lex_rec p)))->
                         (Desc term Ttm (cons t (cons b (pol_Lex_rec p)))).

Intros.
Apply Desc_rev; Auto.
Save.

Lemma ayuda_full_imp_lis_desc: (p:pol)(t:term)(full_pol p)->
(full n t)->(low_pol t p)->(Desc term Ttm (cons t (pol_Lex_rec p))).

Induction p.
Intros; Simpl.
Apply d_one.

Induction m; Intros; Simpl.
Apply Desc_rev_pol.
Inversion H2; Auto.

Apply H; Inversion H0; Auto.
Save.

Theorem full_imp_lis_desc: (p:pol)(full_pol p)->(Listterm_desc p).

Induction p.
Intros.
Red.
Simpl.
Apply d_nil.

Induction m; Intros.
Inversion H0.
Red.
Simpl.
Apply ayuda_full_imp_lis_desc; Auto.
Save.

Definition pol_recpol: pol_full->(Pow term Ttm) :=
   [a: pol_full]
    ( <(Pow term Ttm)> Case a of
      [p: pol]
      [H: (full_pol p)] (exist (list term) (Desc term Ttm) (pol_Lex_rec p) (full_imp_lis_desc p H))
      end).

Lemma pol_rec_Tpol:(p,q: pol_full)(Tpol_full p q)->
   (lex_exp term Ttm (pol_recpol p)(pol_recpol q)).

Intros p q; Case p; Case q.
Unfold lex_exp; Simpl; Intros.
Apply pol_rec_Tpol_lex3; Trivial.
Save.

Theorem Tpol_full_wf: (well_founded pol_full Tpol_full).

LApply (wf_inverse_image pol_full (Pow term Ttm) (lex_exp term Ttm)
         pol_recpol).
Intros H'3.
Apply wf_incl
 with R2:=[x,y:pol_full]
           (lex_exp term Ttm (pol_recpol x) (pol_recpol y)).
Red; Intros.
Apply pol_rec_Tpol; Trivial.

Auto.

Apply (wf_lex_exp term Ttm); Apply Ttm_wf.
Save.

Definition inc: pol_full -> pol :=
   [p:pol_full] (Case p of
    [q:pol][H:(full_pol q)] q
 end).

Fixpoint inc_list [p:(list pol_full)]: (list pol) := Cases p of
   nil => (nil ?)
  |(cons p1 p2) => (cons (inc p1) (inc_list p2))
  end.

Lemma ex_fpol:(f:pol_full){g:pol|(full_pol g)/\(equpol (inc f) g)}.
Induction f.
Simpl; Intros.
Split with x; Auto.
Save.

Lemma ex_fpol_eq:(f:pol)(full_pol f)->{g:pol_full|(equpol f (inc g))}.
Intros.
Split with (exist pol [x:pol](full_pol x) f H); Simpl; Auto.
Save.

Lemma pol_f_impl_f_pol:(f:pol_full)(full_pol (inc f)).
Induction f; Intros; Simpl; Trivial.
Save.
Hints Resolve pol_f_impl_f_pol.

Lemma pol_f_impl_f_term:(f:pol_full)(full_term_pol (inc f)).
Intros.
Cut (full_pol (inc f)); Intros; Auto.
Save.


Index
This page has been generated by coqdoc