Library coeficiente_tes
Require
Export
Lcm_tes.
Require
Export
Div_poly_tes.
Fixpoint
coef [p:pol]: term -> Q:=
[t:term] Cases p of
vpol => OQ
| (cpol (c,u) p1) => Cases (eq_tm_dec t u) of
(left x) => (plusQ c (coef p1 t))
| (right y) => (coef p1 t)
end
end.
Lemma
coef_suma_pol: (p,q:pol)(t:term)(eqQ
(coef (suma_app p q) t) (plusQ (coef p t) (coef q t))).
Induction p.
Intros.
Simpl.
Apply eqQ_sym.
Apply eqQ_trans with (plusQ (coef q t) OQ); Auto.
Induction m; Intros.
Simpl.
Elim (eq_tm_dec t b); Intros; Auto.
Apply eqQ_trans with (plusQ a (plusQ (coef p0 t) (coef q t)));Auto.
Save
.
Hints Resolve coef_suma_pol.
Lemma
term_equpol2: (p:pol)(t1,t2:term)(t1=t2)->
(eqQ (coef p t1) (coef p t2)).
Intros; Rewrite -> H; Auto.
Save
.
Hints Resolve term_equpol2.
Lemma
term_equpol: (p,p':pol)(t:term)(equpol p p')->
(eqQ (coef p t) (coef p' t)).
Intros p p' t H; Elim H.
Auto.
Auto.
Intros.
Apply eqQ_trans with (coef q t); Auto.
Induction m; Intros.
Simpl.
Elim (eq_tm_dec t b); Intros.
Apply eqQ_trans with
(plusQ (coef p0 t) (coef (cpol (a,b) q) t));Auto.
Rewrite -> a0.
Simpl.
Elim (eq_tm_dec b b); Intros.
Apply eqQ_trans with
(plusQ (plusQ (coef p0 b) a) (coef q b));Auto.
Apply eqQ_trans with
(plusQ (plusQ a (coef p0 b)) (coef q b));Auto.
Apply eqQ_trans with
(plusQ a (plusQ (coef p0 b) (coef q b)));Auto.
Elim b0; Auto.
Apply eqQ_trans with (plusQ (coef p0 t) (coef q t));Auto.
Apply eqQ_trans with
(plusQ (coef p0 t) (coef (cpol (a,b) q) t)).
Apply plusQ_comp_l.
Simpl.
Elim (eq_tm_dec t b); Intros.
Elim b0; Auto.
Auto.
Auto.
Intros.
Apply eqQ_trans with (plusQ (coef p0 t) (coef q t));Auto.
Apply eqQ_trans with (plusQ (coef p'0 t) (coef q' t));Auto.
Intros.
Simpl.
Elim (eq_tm_dec t t0); Intros; Auto.
Induction m.
Unfold z_monom; Intros.
Simpl.
Elim (eq_tm_dec t b); Intros; Trivial.
Apply eqQ_trans with (plusQ OQ (coef p0 t)); Auto.
Apply eqQ_trans with (plusQ (coef p0 t) OQ); Auto.
Save
.
Hints Resolve term_equpol.
Lemma
coef_pol_opp: (p:pol)(t:term)(eqQ (coef p t)
(multQ_neg (coef (pol_opp p) t))).
Induction p.
Auto.
Induction m; Intros.
Simpl.
Elim (eq_tm_dec t b); Intros; Trivial.
Apply eqQ_trans with (plusQ (multQ_neg (multQ_neg a))
(multQ_neg (coef (pol_opp p0) t))); Auto.
Save
.
Hints Resolve coef_pol_opp.
Lemma
coef_pol_opp2: (p:pol)(t:term)(eqQ
(multQ_neg (coef p t)) (coef (pol_opp p) t)).
Intros.
(Apply eqQ_trans with (multQ_neg (multQ_neg (coef (pol_opp p) t)));
Auto).
Save
.
Hints Resolve coef_pol_opp2.
Lemma
coef_n_term: (a:Q)(t,t0:term)(p:pol)(~t=t0)->
(eqQ (coef (cpol (a,t0) p) t) (coef p t)).
Intros.
Simpl.
Elim (eq_tm_dec t t0); Auto; Intros.
Elim H; Trivial.
Save
.
Hints Resolve coef_n_term.
Lemma
coef_term_mult:(p:pol)(t,t0:term)(c:Q)(full n t0)->
(full_term_pol p)->
(eqQ (coef (mult_m p (c,t)) (term_mult t0 t))
(multQ (coef p t0) c)).
Induction p.
Auto.
Induction m; Intros.
Inversion H1.
Elim (decQ c); Intros.
Apply eqQ_trans with OQ; Auto.
Cut (equpol (mult_m (cpol (a,b) p0) (c,t))
(cpol (mult_mon (c,t) (a,b)) (mult_m p0 (c,t)))); Auto; Intros.
Apply eqQ_trans with (coef
(cpol (mult_mon (c,t) (a,b)) (mult_m p0 (c,t)))
(term_mult t0 t)); Auto.
Cut (z_monom (c,t)); Auto; Intros.
Cut (equpol (cpol (mult_mon (c,t) (a,b)) (mult_m p0 (c,t)))
(mult_m p0 (c,t))); Intros.
Apply eqQ_trans with (coef (mult_m p0 (c,t)) (term_mult t0 t)); Auto.
Cut (equpol (mult_m p0 (c,t)) vpol); Intros.
Apply eqQ_trans with (coef vpol (term_mult t0 t)); Auto.
Auto.
Auto.
Cut (equpol (mult_m (cpol (a,b) p0) (c,t))
(cpol (mult_mon (c,t) (a,b)) (mult_m p0 (c,t)))); Auto; Intros.
Apply eqQ_trans with (coef
(cpol (mult_mon (c,t) (a,b)) (mult_m p0 (c,t)))
(term_mult t0 t)); Auto.
Cut (equmon (mult_mon (c,t) (a,b)) ((multQ c a),(term_mult t b)));
Auto; Intros.
Apply eqQ_trans with (coef
(cpol ((multQ c a),(term_mult t b))
(mult_m p0 (c,t))) (term_mult t0 t));
Auto.
Elim (eq_tm_dec b t0); Intros.
Rewrite -> a1.
Simpl.
Elim (eq_tm_dec (term_mult t0 t) (term_mult t t0)); Intros.
Elim (eq_tm_dec t0 t0); Intros.
Apply eqQ_trans with (plusQ (multQ a c) (multQ (coef p0 t0) c)).
Apply plusQ_comp; Trivial.
Apply H; Trivial.
Apply eqQ_sym.
Apply eqQ_trans with (multQ c (plusQ a (coef p0 t0))); Auto.
Apply eqQ_trans with (plusQ (multQ c a) (multQ c (coef p0 t0))); Auto.
Elim b1; Trivial.
Elim b1; Trivial.
Simpl.
Elim (eq_tm_dec (term_mult t0 t) (term_mult t b)); Intros.
Cut ~(term_mult t b)=(term_mult t t0); Intros.
Elim H9.
Symmetry.
Transitivity (term_mult t0 t); Auto.
Apply term_mult_n_eq with n:=n; Auto.
Elim (eq_tm_dec t0 b); Intros.
Elim b1; Auto.
Apply H; Auto.
Save
.
Hints Resolve coef_term_mult.
Definition
term_in_pol: pol->term->Prop:=
[p:pol][t:term](~(eqQ (coef p t) OQ)).
Definition
no_term_in_pol: pol->term->Prop:=
[p:pol][t:term](eqQ (coef p t) OQ).
Lemma
coef_z_in_pol: (y:Q)(eqQ y OQ)->
(t:term)(p:pol)({(term_in_pol p t)}+{(no_term_in_pol p t)})->
(y0:term)({(term_in_pol (cpol (y,y0) p) t)}+{(no_term_in_pol (cpol (y,y0) p) t)}).
Intros.
Elim H0; Intros.
Left.
Red.
Red in a.
Simpl.
Elim (eq_tm_dec t y0); Auto.
Elim (eq_tm_dec t y0); Intros.
Right.
Red.
Simpl.
Elim (eq_tm_dec t y0); Intros; Auto.
Right.
Red.
Simpl.
Elim (eq_tm_dec t y0); Auto.
Save
.
Hints Resolve coef_z_in_pol.
Lemma
dec_term_in_pol: (f:pol)(t:term)
{(term_in_pol f t)}+{(no_term_in_pol f t)}.
Induction f.
Right.
Red; Auto.
Induction m; Intros.
Elim (decQ a); Intros; Auto.
Elim (eq_tm_dec t b); Intros.
Elim (decQ_t (coef p t) (multQ_neg a)); Intros.
Right.
Red.
Simpl.
Elim (eq_tm_dec t b); Intros.
Apply eqQ_trans with (plusQ a (multQ_neg a)); Auto.
Elim b1; Auto.
Left.
Red.
Simpl.
Elim (eq_tm_dec t b); Intros.
Red; Intros.
Absurd (eqQ (coef p t) (multQ_neg a)); Trivial.
Apply suma_op_inv.
Apply eqQ_trans with (plusQ a (coef p t)); Auto.
Elim b2; Trivial.
Elim H with t:=t; Intros.
Left.
Red.
Red in a0.
Simpl.
Elim (eq_tm_dec t b); Intros; Auto.
Right.
Red.
Red in b2.
Simpl.
Elim (eq_tm_dec t b); Intros.
Elim b1; Auto.
Trivial.
Save
.
Hints Resolve dec_term_in_pol.
Lemma
comp_no_term_in_pol: (p,q:pol)(t:term)(equpol p q)->
(no_term_in_pol p t)->(no_term_in_pol q t).
Intros.
Red.
Red in H0.
(Apply eqQ_trans with (coef p t); Auto).
Save
.
Hints Resolve comp_no_term_in_pol.
Lemma
comp_term_in_pol: (p,q:pol)(t:term)(equpol p q)->
(term_in_pol p t)->(term_in_pol q t).
Intros.
Unfold term_in_pol.
Red in H0.
(Apply comp_nOQ with c:=(coef p t); Auto).
Save
.
Hints Resolve comp_term_in_pol.
Lemma
term_in_pol_opp: (p:pol)(t:term)
(term_in_pol (pol_opp p) t)->(term_in_pol p t).
Unfold term_in_pol; Intros.
Apply comp_nOQ with (multQ_neg (coef (pol_opp p) t)); Auto.
Save
.
Hints Resolve term_in_pol_opp.
Lemma
no_term_in_pol_opp: (p:pol)(t:term)
(no_term_in_pol (pol_opp p) t)->(no_term_in_pol p t).
Induction p; Auto.
Induction m; Intros.
Unfold no_term_in_pol.
Red in H0.
(Apply eqQ_trans with (multQ_neg (coef (pol_opp (cpol (a,b) p0)) t));
Auto).
Save
.
Hints Resolve no_term_in_pol_opp.
Lemma
term_in_pol_nvpol: (f:pol)(t:term)(term_in_pol f t)->
~(equpol f vpol).
Intros.
(Red; Intros).
(Cut (term_in_pol vpol t); Intros).
(Elim H1; Auto).
Apply comp_term_in_pol with f; Auto.
Save
.
Hints Resolve term_in_pol_nvpol.
Lemma
no_equpol_Ttm: (p:pol)(full_term_pol p)->
(k:Q)(~(eqQ k OQ))->(t:term)(full n t)->
(no_term_in_pol p t)->(~(equpol
(suma_app (cpol (k,t) vpol) p) vpol)).
Intros.
Apply term_in_pol_nvpol with t.
Red in H2.
Red.
Apply comp_nOQ with (plusQ (coef (cpol (k,t) vpol) t) (coef p t)); Auto.
Apply comp_nOQ with (plusQ k OQ).
Apply plusQ_comp; Auto.
Unfold coef.
Elim (eq_tm_dec t t); Intros; Auto.
Elim b; Auto.
Apply comp_nOQ with k; Auto.
Save
.
Hints Resolve no_equpol_Ttm.
Lemma
n_zmonom_n_vpol: (m:monom)(full_mon n m)->(~(z_monom m))->
~(equpol (cpol m vpol) vpol).
Induction m; Intros.
Unfold z_monom in H0.
Apply eq_nvpol with (suma_app (cpol (a,b) vpol) vpol); Auto.
Apply no_equpol_Ttm; Auto.
Red; Auto.
Save
.
Hints Resolve n_zmonom_n_vpol.
Lemma
eq_term_in_pol_monom: (k:Q)(t,t':term)(full n t)->
(full n t')->(term_in_pol (cpol (k,t') vpol) t)->
t=t'.
Intros.
Elim (eq_tm_dec t t'); Trivial.
Intros.
Red in H1.
Unfold coef in H1.
Elim H1.
(Elim (eq_tm_dec t t'); Trivial).
Intros.
Elim b; Auto.
Save
.
Hints Resolve eq_term_in_pol_monom.
Lemma
no_term_in_cpol: (y:Q)(y0,t:term)(p:pol)
(no_term_in_pol (cpol (y,y0) p) t)->
~(t=y0)->(no_term_in_pol p t).
Intros.
Red.
Red in H.
(Apply eqQ_trans with (coef (cpol (y,y0) p) t); Auto).
Save
.
Lemma
split_term_in_pol_cons: (y:Q)(y0,t:term)(p:pol)
(term_in_pol (cpol (y,y0) p) t)->
(t=y0)\/(term_in_pol p t).
Intros.
Elim (eq_tm_dec t y0); Intros.
Left ; Trivial.
Right.
Red.
Unfold not; Intros.
Elim H.
Simpl.
Elim (eq_tm_dec t y0); Trivial; Intros.
Elim b; Auto.
Save
.
Hints Resolve split_term_in_pol_cons.
Lemma
term_in_sum: (f,g:pol)(t:term)(term_in_pol (suma_app f g) t)->
(term_in_pol f t)\/(term_in_pol g t).
Intros.
Red in H.
Unfold term_in_pol.
Cut (eqQ (coef (suma_app f g) t) (plusQ (coef f t) (coef g t))); Intros; Auto.
Elim (decQ (coef f t)); Intros; Auto.
Right.
Apply comp_nOQ with (coef (suma_app f g) t); Auto.
Apply eqQ_trans with (plusQ (coef f t) (coef g t)); Auto.
Apply eqQ_trans with (plusQ OQ (coef g t)); Auto.
Apply eqQ_trans with (plusQ (coef g t) OQ); Auto.
Save
.
Lemma
Ttm_no_term_in_pol: (t:term)(f:pol)(full n t)->
((t':term)(term_in_pol f t')->(Ttm t t'))->
(no_term_in_pol f t).
Intros.
(Elim (dec_term_in_pol f t); Trivial; Intros).
(Cut (Ttm t t)->~t=t; Intros).
(Elim H1; Auto).
(Apply Ttm_strict with n; Trivial).
Save
.
Hints Resolve Ttm_no_term_in_pol.
Lemma
term_in_pol_monom: (k:Q)(t:term)(~(eqQ k OQ))->
(term_in_pol (cpol (k,t) vpol) t).
Intros.
Unfold term_in_pol.
Simpl.
Elim (eq_tm_dec t t).
Intros.
(Apply comp_nOQ with c:=k; Auto).
Intros.
(Elim b; Auto).
Save
.
Hints Resolve term_in_pol_monom.
Lemma
Ttm_no_term_in_pol2: (t:term)(f:pol)(full n t)->
((t':term)(term_in_pol f t')->(Ttm t' t))->(no_term_in_pol f t).
Intros.
Elim (dec_term_in_pol f t); Trivial; Intros.
Cut (Ttm t t); Intros; Auto.
Cut ~t=t; Intros.
Elim H2; Auto.
Apply Ttm_strict with n; Trivial.
Save
.
Hints Resolve Ttm_no_term_in_pol2.
Lemma
full_coef: (f:pol)(t0:term)(full_term_pol f)->
(term_in_pol f t0)->(full n t0).
Unfold term_in_pol.
Induction 1; Intros.
Elim H0; Auto.
Elim (eq_tm_dec t0 t); Intros.
Rewrite a0; Trivial.
Apply H2.
Cut (eqQ (coef (cpol (a,t) p) t0) (coef p t0)); Intros.
Apply comp_nOQ with c:=(coef (cpol (a,t) p) t0); Auto.
Apply coef_n_term; Trivial.
Save
.
Hints Resolve full_coef.
Lemma
dec_sum_term_in_pol: (f,g:pol)(t:term)(term_in_pol f t)->
(no_term_in_pol g t)->(term_in_pol (suma_app f g) t).
Intros.
Red.
(Apply comp_nOQ with (plusQ (coef g t) (coef f t)); Auto).
Red in H.
Red in H0.
Apply eqQ_sym.
(Apply eqQ_trans with (plusQ (coef f t) (coef g t)); Auto).
Save
.
Lemma
coef_Ttm_split_pol: (f,f1,f2:pol)(t:term)(full n t)->
(full_term_pol f)->(full_term_pol f1)->(full_term_pol f2)->
(equpol f (suma_app f1 (suma_app (cpol ((coef f t),t) vpol) f2)))->
(t0:term)(full n t0)->(Ttm t0 t)->((t':term)(term_in_pol f1 t')->(Ttm t t'))->
(eqQ (coef f2 t0) (coef f t0)).
Intros.
Cut (equpol f (suma_app (suma_app f1 (cpol ((coef f t),t) vpol)) f2)); Intros.
Apply eqQ_trans
with (coef (suma_app (suma_app f1 (cpol ((coef f t),t) vpol)) f2) t0).
Apply eqQ_trans with
(plusQ (coef (suma_app f1 (cpol ((coef f t),t) vpol)) t0) (coef f2 t0)); Auto.
Apply eqQ_trans with (plusQ OQ (coef f2 t0)).
Apply eqQ_trans with (plusQ (coef f2 t0) OQ); Auto.
Apply plusQ_comp; Trivial.
Apply eqQ_sym.
Apply eqQ_trans with (plusQ (coef f1 t0) (coef (cpol ((coef f t),t) vpol) t0)).
Auto.
Apply plusQ_zero.
Change (no_term_in_pol f1 t0).
Apply Ttm_no_term_in_pol; Trivial; Intros.
Apply Ttm_trans with t n; Auto.
Apply full_coef with f1; Trivial.
Cut ~t=t0; Intros.
Apply eqQ_trans with (coef vpol t0); Auto.
Red; Intros.
Cut t0=t; Auto.
Change ~t0=t.
Apply Ttm_strict with n; Trivial.
Auto.
Apply equpol_tran with (suma_app f1 (suma_app (cpol ((coef f t),t) vpol) f2)); Auto.
Save
.
Hints Resolve coef_Ttm_split_pol.
Lemma
split_term_in_pol: (f1,f2:pol)(full_term_pol f1)->(full_term_pol f2)->
(k:Q)(t,t0:term)(full n t)->(full n t0)->
(term_in_pol (suma_app f1 (suma_app (cpol (k,t) vpol) f2)) t0)->
(Ttm t0 t)->((t':term)(term_in_pol f1 t')->(Ttm t t'))->(term_in_pol f2 t0).
Intros.
Cut (term_in_pol (suma_app (suma_app f1 (cpol (k,t) vpol)) f2) t0); Intros.
Cut (no_term_in_pol (suma_app f1 (cpol (k,t) vpol)) t0); Intros.
Red in H6 H7.
Red.
Apply comp_nOQ with (coef (suma_app (suma_app f1 (cpol (k,t) vpol)) f2) t0); Trivial.
Apply eqQ_trans with
(plusQ (coef (suma_app f1 (cpol (k,t) vpol)) t0) (coef f2 t0)); Auto.
Apply eqQ_trans with (plusQ OQ (coef f2 t0)); Auto.
Apply eqQ_trans with (plusQ (coef f2 t0) OQ); Auto.
Red.
Apply eqQ_trans with (plusQ (coef f1 t0) (coef (cpol (k,t) vpol) t0)); Trivial.
Apply plusQ_zero.
Change (no_term_in_pol f1 t0).
Apply Ttm_no_term_in_pol; Intros; Trivial.
Apply Ttm_trans with t n; Auto.
Apply full_coef with f1; Trivial.
Cut ~t=t0; Intros.
Apply eqQ_trans with (coef vpol t0); Auto.
Red; Intros.
Cut t0=t; Auto.
Change ~t0=t.
Apply Ttm_strict with n; Trivial.
Apply comp_term_in_pol with (suma_app f1 (suma_app (cpol (k,t) vpol) f2)); Auto.
Save
.
Hints Resolve split_term_in_pol.
Lemma
gen_split_pol: (f:pol)(full_term_pol f)->(t:term)(full n t)->
(EX f1 | (full_term_pol f1) /\ ((t':term)(term_in_pol f1 t')->(Ttm t t'))
& (EX f2 | (full_term_pol f2) /\ ((t':term)(term_in_pol f2 t')->(Ttm t' t))
& (equpol f (suma_app f1 (suma_app (cpol ((coef f t),t) vpol) f2))))).
Induction f.
Intros.
Split with vpol.
Split; Trivial.
Intros t' e; Elim e; Auto.
Split with vpol.
Split; Trivial.
Intros t' e; Elim e; Auto.
Simpl; Apply equpol_sym.
Apply equpol_elim; Auto.
Induction m; Intros.
Inversion H0.
Elim H with t; Trivial; Intros.
Elim H7; Intros.
Elim H8; Intros.
Elim H11; Intros.
Clear H11 H8 H7 H.
Elim (Ttm_total b t n); Trivial; Intros.
Elim a1; Intros; Clear a1.
Split with x.
Split; Trivial.
Split with (cpol (a,b) x0).
Split; Auto; Intros.
Cut t'=b\/(term_in_pol x0 t'); Intros.
Elim H7; Intros; Clear H7.
Rewrite H8; Trivial.
Apply H14; Trivial.
Apply split_term_in_pol_cons with a; Trivial.
Apply equpol_tran with (cpol (a,b)
(suma_app x (suma_app (cpol ((coef p t),t) vpol) x0))); Auto.
Apply equpol_tran with (suma_app x
(cpol (a,b) (suma_app (cpol ((coef p t),t) vpol) x0))).
Auto.
Apply equpol_ss; Trivial.
Apply equpol_tran with (cpol ((coef (cpol (a,b) p) t),t)
(cpol (a,b) (suma_app vpol x0))); Auto.
Apply equpol_tran with (suma_app (cpol ((coef p t),t) vpol) (cpol (a,b) x0)); Auto.
Apply equpol_tran with (cpol ((coef p t),t) (cpol (a,b) (suma_app vpol x0))).
Auto.
Apply eq_mon_cpol.
Simpl.
Right.
Split; Trivial.
Elim (eq_tm_dec t b); Auto; Intros.
Cut ~b=t; Intros.
Elim H; Auto.
Apply Ttm_strict with n; Trivial.
Split with (cpol (a,b) x).
Split; Auto; Intros.
Cut t'=b\/(term_in_pol x t'); Intros.
Elim H7; Intros; Clear H7.
Rewrite H8; Trivial.
Apply H10; Trivial.
Apply split_term_in_pol_cons with a; Trivial.
Split with x0.
Split; Trivial.
Apply equpol_tran with (cpol (a,b)
(suma_app x (suma_app (cpol ((coef p t),t) vpol) x0))); Auto.
Simpl.
Apply equpol_cpol2; Trivial.
Apply equpol_ss; Trivial.
Apply eq_mon_cpol.
Simpl.
Right.
Split; Trivial.
Elim (eq_tm_dec t b); Auto; Intros.
Cut ~t=b; Intros.
Elim H; Auto.
Apply Ttm_strict with n; Trivial.
Split with x.
Split; Auto.
Split with x0.
Split; Auto.
Apply equpol_tran with (cpol (a,b)
(suma_app x (suma_app (cpol ((coef p t),t) vpol) x0))); Auto.
Rewrite b0.
Apply equpol_tran with
(suma_app x (cpol (a,t) (suma_app (cpol ((coef p t),t) vpol) x0))).
Auto.
Apply equpol_ss; Trivial.
Apply equpol_tran with (suma_app (cpol ((coef p t),t) vpol) (cpol (a,t) x0)).
Auto.
Simpl.
Elim (eq_tm_dec t t); Intros.
Apply equpol_tran with (cpol ((plusQ (coef p t) a),t) x0); Auto.
Elim b1; Auto.
Save
.
Hints Resolve gen_split_pol.
Lemma
split_pol: (f:pol)(full_term_pol f)->(t:term)(term_in_pol f t)->
(EX f1 | (full_term_pol f1)/\((t':term)(term_in_pol f1 t')->(Ttm t t'))
& (EX f2 | (full_term_pol f2)/\((t':term)(term_in_pol f2 t')->(Ttm t' t))
& (equpol f (suma_app f1 (suma_app (cpol ((coef f t),t) vpol) f2))))).
Intros.
Cut (full n t); Intros.
Apply gen_split_pol; Trivial.
Apply full_coef with f; Trivial.
Save
.
Hints Resolve split_pol.
Index
This page has been generated by coqdoc