<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Connecting Gro¨ bner bases programs with Coq to do proofs in algebra, geometry and arithmetics</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Lo¨ıc Pottier INRIA Sophia Antipolis</string-name>
        </contrib>
      </contrib-group>
      <fpage>67</fpage>
      <lpage>76</lpage>
      <abstract>
        <p>We describe how we connected three programs that compute Gro¨bner bases [1] to Coq [11], to do automated proofs on algebraic, geometrical and arithmetical expressions. The result is a set of Coq tactics and a certificate mechanism 1. The programs are: F4 [5], GB [4], and gbcoq [10]. F4 and GB are the fastest (up to our knowledge) available programs that compute Gro¨bner bases. Gbcoq is slow in general but is proved to be correct (in Coq), and we adapted it to our specific problem to be efficient. The automated proofs concern equalities and non-equalities on polynomials with coefficients and indeterminates in R or Z, and are done by reducing to Gro¨bner computation, via Hilbert's Nullstellensatz. We adapted also the results of [7], to allow to prove some theorems about modular arithmetics. The connection between Coq and the programs that compute Gro¨bner bases is done using the ”external” tactic of Coq that allows to call arbitrary programs accepting xml inputs and outputs. We also produce certificates in order to make the proof scripts independant from the external programs.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1 Introduction</title>
      <p>Proof assistants contain now more and more automatic procedures that generate proofs in specific
domains. In the Coq system, several tactics exist, for example the omega tactic which proves inequalities
between linear expressions with integer variables, the fourier tactic which does the same thing with
real numbers, the ring and field tactic, which proves equalities between expressions in a ring or a
field, the sos tactic which proves some inequalities on real polynomials. We describe here a new tactic,
called gb, which proves (non-)equalities in rings using other (non-)equalities as hypotheses. For example
8xy : R; x2 + xy = 0; y2 + xy = 0 ) x + y = 0, or 8x : R; x2 6= 1 ) x 6= 1.</p>
      <p>This tactic uses external efficient programs that compute Gro¨bner bases, and their result to produce
a proof and a certificate.</p>
      <p>
        We wrote such a tactic several years ago [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], but using only the gbcoq program, which were rather
slow. So the tactic remained experimental and was not included in the Coq system. There are also similar
tactics in other proof systems: in hol-light, John Harrison wrote a program that computes Gro¨bner bases
to prove polynomial equalities, specially in arithmetics [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. This program was adapted in Isabelle by
Amine Chaieb and Makarius Wenzel for the same task [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. We show on examples that our tactic is faster.
      </p>
      <p>
        This paper is organized as follow. In section 2 we explain the mathematical method we use to reduce
the problem to Gro¨bner bases computations. In section 3 we detail the tactic and the way it builds a
proof in Coq. In section 4 we show how we connected Coq to the specialized programs that computes
Gro¨bner bases. Section 5 details the complete tactics that proves also non-equalities, and section 6 shows
how to produce certificates and then save time in the proof script. In section 7 we give some examples
of utilisations of the tactic in algebra, geometry and arithmetics, with comparisons with hol-light[
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] .
Section 8 contains the conclusion and perpectives of this work.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>Hilbert Nullstellensatz</title>
      <p>
        Hilbert Nullstellensatz shows how to reduce proofs of equalities on polynomials to algebraic
computations (see for example [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] for the notions introduced in this section).
s
      </p>
      <p>It is easy to see that if a polynomial P in K[X1; : : : ; Xn] verifies Pr = åi=1 QiPi, with r a positive
integer, Qi and Pi also in K[X1; : : : ; Xn], then P is zero whenever polynomials P1; :::; Ps are zero.</p>
      <p>Then we can reduce the proof of P1 = 0; : : : ; Ps = 0 ) P = 0 to find Q1; : : : ; Qs and r such that
Pr = åi QiPi.</p>
      <p>The converse is also true when K is algebraically closed: this is the Hilbert Nullstellensatz. In this
case, the method is complete.</p>
      <p>Finding Pr = åi QiPi can be done using Gro¨bner bases, as we will explain now.</p>
      <p>Recall that an ideal I of a ring is an additive sub-group of the ring such that ax 2 I whenever
a 2 I . The ideal generated by a family of polynomials is the set of all linear combinations of these
polynomials (with polynomial coefficients).</p>
      <p>A Gro¨bner basis of an ideal is a set of polynomials of the ideal such that their head monomials
(relative to a choosen order on monomials, e.g. lexicographic order, or degree order) generates the ideal
of head monomials of all polynomials in the ideal. The main property of a Gro¨bner basis is that it
provides a test for the membership to the ideal: a polynomial is in the ideal iff its euclidian division
by the polynomials of the basis gives a zero remainder. The division process is a generalisation of the
division of polynomials in one variable: to divide a polynomial P by a polynomial aX a Q we write
P = aX a S + T where T contains no monomial that is multiple of X a . Then change P with QS + T and
repeat divison. The last non zero T is the remainder of the division. To divide a polynomial by a family
of polynomials, we repeat this process with each polynomial of the family. In general, the remainder
depends on the order we use the polynomials of the family. But with a Gro¨bner basis, this remainder is
unique (this is a characteristic property of Gro¨bner basis).
2.1</p>
      <p>Method 1: how to find Q1; : : : ; Qs such that 1 = åi QiPi
Compute a Gro¨bner base of the polynomials ftPi ei; eie j; eitgi; j (where t; e1; : : : ; es are new variables)
with an order such that t &gt; Xi &gt; ei.</p>
      <p>Suppose that, in this basis, there is a polynomial of the form t åi Qiei. This polynomial is then in
the ideal generated by ftPi ei; eie j; eitgi; j, so is a linear combination of these polynomials:
t åi Qiei = åi hi(tPi ei) + åi j gi jeie j + åi kieit
ei are formal variables, so we can substitute formally ei with tPi, and we obtain t(1 åi QiPi) =
0 + t2( åi j gi jPiPj + åi kiPi).</p>
      <p>Then the coefficient of t in this equation must be zero: 1 åi QiPi = 0, and we are done.</p>
      <p>Note that the polynomials feit; eie jg are not necessary, but their presence much speed up the
computation of the Gro¨bner basis2.
2.2</p>
      <p>Method 2: how to find Q1; : : : ; Qs and r such that Pr = åi QiPi
Use the standard trick: search to write 1 = åi hiPi + h(1 zP) ( ), where z is a new variable. This can
be done with the previous method. Suppose we succeed. Let r be the max degree in z of polynomials hi.</p>
      <p>Substitute formally z with 1=P, and multiply the equation (*) by Pr. Then we obtain Pr = åi QiPi, as
required, where Qi = Prhi[z 1=P]</p>
      <sec id="sec-2-1">
        <title>2thanks to Bernard Mourrain for this trick</title>
        <p>2.3</p>
        <sec id="sec-2-1-1">
          <title>Completness</title>
          <p>It is easy to see that methods 1 and 2 are complete in the sense that if Pr = åi QiPi holds, there will find
such an equation:
method 1: suppose 1 åi QiPi = 0. Then t = åi QitPi, and t åi Qiei = åi Qi(tPi ei). Hence
t åi Qiei belongs to the ideal of which we have computed a Gro¨bner basis. Because of the order
we have choosen on variables, this implies that there is a polynomial t åi hiei in the Gro¨bner
basis.
method 2: suppose Pr = åi QiPi. We have 1 zrPr = (1 + zP + : : : + zr 1Pr 1)(1 zP). Replacing
Pr with åi QiPi we obtain 1 = zr(åi QiPi) + (1 + zP + : : : + zr 1Pr 1)(1 zP).
2.4</p>
        </sec>
        <sec id="sec-2-1-2">
          <title>Example</title>
          <p>Take p = x + y; p1 = x2 + xy; p2 = y2 + xy. With the previous method, the Gro¨bner basis is:
t zye0 zxe0 z2e1 z2e2
y2e0 x2e0 + zye1 zxe2
yxe0 + x2e0 + zye2 + zxe2
e20
xe1 ye2
e0e1; e12; e0e2; e1e2; e22
we obtain r = 2; Q1 = 1; Q2 = 1, and then (x + y)2 = 1
that x2 + xy = 0; y2 + xy = 0 ) x + y = 0.
3</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Proof in Coq</title>
      <p>
        (x2 + xy) + 1
(y2 + xy). Which proves
Coq [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] is a proof assistant based on type theory, where we can interactively build proofs of goals,
which are logical assertions of the form 8H1 : T1; : : : ; 8Hn : Tn;C(H1; : : : ; Hn). Using tactics, we can
simplify the goal, while the system builds the corresponding piece of proof.
      </p>
      <p>Typically we will treate goals of the form:
x : Z
y : Z
H : x ^ 2 + x * y = 0
H0 : y ^ 2 + x * y = 0
============================
x + y = 0
Here hypotheses are variables belonging in a ring or a field, and equalities between polynomials.</p>
      <p>We explain now how to compute and use the Nullstellensatz equation to build a proof of this goal
in Coq. The steps are: syntaxification, Gro¨bner basis computation, and building the proof from the
Nullstellensatz equation.
3.1</p>
      <sec id="sec-3-1">
        <title>Syntaxification</title>
        <p>We begin by building polynomials from the three equations in this goal. This is done in the tactic
language of Coq (LTAC, which is a meta-language for computing tactics and executing them) by first
computing the list of variables:</p>
        <p>and the list of polynomials:
lp = (cons (Add (Pow (Var 2) 2) (Mul (Var 2) (Var 1)))
(cons (Add (Pow (Var 1) 2) (Mul (Var 2) (Var 1)))
(cons (Sub (Add (Var 2) (Var 1)) (Const 0 1))</p>
        <p>nil)))</p>
        <p>Variables are represented by their rank in the list of variables. Polynomials are elements of an
inductive type, and we can recover the equations by interpreting them in Z with the list of variables. For
example,
(interpret (Add (Pow (Var 2) 2) (Mul (Var 2) (Var 1)))</p>
        <p>lv)
evaluates in x^2 + x * y.</p>
        <p>
          We used parts of the code of the sos[
          <xref ref-type="bibr" rid="ref8">8</xref>
          ] tactic, written by Laurent The´ry.
        </p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2 Calling Gro¨bner basis computation</title>
        <p>We call the external program gb (see section 4) with the list of polynomials; here we choose the program
F4 to compute Gro¨bner basis:
external "./gb" "jcf2" lp</p>
        <p>The result is the term:
(cons
(Pow
(Add
(Add Zero
(Mul
(Add (Add Zero (Mul (Const 0 1) (Const 1 1)))</p>
        <p>(Mul (Const 1 1) (Pow (Var 1) 1))) (Const 1 1)))
(Mul (Const 1 1) (Pow (Var 2) 1)))
2)
(cons (Const 1 1) (cons(Const 1 1) (cons (Const 1 1) nil))))</p>
        <p>which has the structure
(cons (Pow p d) (cons c lq))
such that the Nullstellensatz equation holds:
Here, we have lq = q1; q2, q1 = q2 = 1
cpd = å qi pi
qi2lq
3.3</p>
      </sec>
      <sec id="sec-3-3">
        <title>Building the proof from the Nullstellensatz equation</title>
        <p>After interpreting the polynomials q1 and q2 in Z using the original list of variables, we get and prove
easily the goal
1 * (x + y)^2 = 1 * (x ^ 2 + x * y) + 1 * (y ^ 2 + x * y)
by the ring tactic.</p>
        <p>To prove the original goal, it is now sufficient to rewrite x^2 + x * y and y^2 + x * y by 0,
getting 1 * (x + y)^2 = 0, and, using a simple lemma, we get x + y = 0 and we are done.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Connecting F4, GB, and gbcoq to Coq</title>
      <p>Coq allows to call arbitrary external programs via a function called ”external”. It sends Coq terms in
xml format (i.e. as tree) to the standard output of the external program, and gets its standard output (also
in xml format) as a resulting Coq term. We use this function to compute a Gro¨bner basis of a list of
polynomials, via a single interface to three specialized programs: F4, GB, and gbcoq. This interface,
called ”gb” is written in ocaml. It translates the list of polynomials given as standard input in xml format
in the format of the choosen program (F4, GB or gbcoq), call it with the good arguments, get its result
(a Gro¨bner basis, if no error occured), selects its useful information, translates it in xml and sends it as
result to standard output. More precisely:</p>
      <p>F4 is a C library, and has only an interface for Maple. We wrote a simple parser of polynomials to
use it on command line, helped by J.C. Fauge`re.</p>
      <p>GB is also written in C and has a command line interface, or accept inputs in a file; with a
Maplelike syntax for polynomials.</p>
      <p>Gbcoq is written in ocaml, so is integrated to gb. This program uses an Buchberger-like algorithm
which has been extracted from Coq. So it is proven to be correct. We added recently an
optimisation which reduces drastically the time to compute Nullstellensatz equations: each time we add a
new polynomial during the completion via the reduction of critical pairs, we divide the polynomial
that we want to test if it is in the ideal, by the current family of polynomials. If this gives zero,
then we stop:, and return the Nullstellensatz coefficients, deduced from the divisions we made.
More we also try its powers (up to a parametrized limit). Then, when we have computed the whole
Gro¨bner basis, we can compute the Nullstellensatz coefficients, without having to verify that the
remaining critical pairs reduce to zero. More, this is often the case that the polynomial reduces to
zero with a partial Gro¨bner basis! The time is sometimes divided by 1000 with such a technique,
and always much reduced. Note that such an improvement cannot be made in a blackbox program
such as the programs of JC Fauge`re, which are free but not opensource.
5</p>
    </sec>
    <sec id="sec-5">
      <title>The gbR and gbZ tactics in Coq</title>
      <p>We wrote two tactics: gbR for real numbers, gbZ for integers. The set of integer is not a field, but
we can simulate computations in the field of rational numbers using only integers. In this case, the
Nullstellensatz equation become cpd = åi qi pi, where c is an integer, and the qi have integer coefficients.</p>
      <p>We can allow negations of equations in the conclusion. For example xy = 1 ) x 6= 0. The trick is to
replace x 6= 0 with x = 0 ) 1 = 0, which is equivalent to add a new equation in hypotheses, and replace
the equation to prove with 1 = 0.</p>
      <p>In the case of real numbers, we can allow also negations of equations in hypotheses. For example
x2 6= 1 ) x 6= 1. This can be done by introducing new variables, remarking that p 6= 0 , 9t; p t = 1.
In the example, this gives t(x2 1) = 1 ) x 6= 1. The negation in conclusion can be removed and leads
to t(x2 1) = 1; x 1 = 0 ) 1 = 0, which is proven using the Nullstellensatz equation 1 = 1 (t(x2
1) 1) + (t + tx) (x 1)</p>
      <p>Finally, the tactics use first the program F4. If it fails (for memory limits), then the tactics try GB.
If it fails too, then the tactics uses gbcoq. We have also specialised tactics, allowing the user to choose
which program to use, between F4, GB, and gbcoq. Indeed, experiments show that no one is better than
others.</p>
    </sec>
    <sec id="sec-6">
      <title>6 Certificates</title>
      <p>Once the Nullstellensatz equation is computed, we can change the proof script, replacing the tactic gb
with a similar tactic, called ”check gb” which will not call external programs, but instead it will take as
arguments all the components of the Nullstellensatz equation. So, next time we will execute the proof
script, for compilation for example, it will not need external Gro¨bner computation3. Let us give an
example. Suppose we want to prove:</p>
      <p>Goal forall x y z:R, x^2+x*y=0 -&gt; y^2+x*y=0 -&gt; x+y=0.</p>
      <p>we execute the tactic gbR, which proves the goal, and prints these lines in the standard output of Coq:
(* with JC.Faugere algorithm F4 *)
gbR_begin; check_gbR
(x + y - 0)
(List.cons (x * (x * 1) + x * y) (List.cons (y * (y * 1) + x * y) List.nil))
(List.cons y (List.cons x List.nil))
(lceq
(Pow
(Add
(Add Zero
(Mul
(Add (Add Zero (Mul (Const 0 1) (Const 1 1)))</p>
      <p>(Mul (Const 1 1) (Pow (Var 1) 1))) (Const 1 1)))
(Mul (Const 1 1) (Pow (Var 2) 1))) 2)
(lceq (Const 1 1) (lceq (Const 1 1) (lceq (Const 1 1) lnil))))
.</p>
      <p>Then, we can replace the line calling gbR with these tactics lines, which contains no more than the
components of the needed Nullstellensatz equation (x + y)2 = 1 (x2 + xy) + 1 (y2 + xy), and then need
much less time to evaluate, because it doesn’t need Gro¨bner basis computation.</p>
    </sec>
    <sec id="sec-7">
      <title>7 Examples</title>
      <p>In this section we give several examples of use of the tactics gbR and gbR.</p>
      <sec id="sec-7-1">
        <title>3thanks to Julien Narboux for this suggestion</title>
        <sec id="sec-7-1-1">
          <title>7.1 Algebra</title>
          <p>The following examples uses the symetric expressions of coefficients with roots of a polynomial.</p>
          <p>First in degree 3: if x; y; z are the three complex roots of X3 + a X2 + b X + c then we have a =
(x + y + z), b = x y + y z + z x, and c = x y z. And then we can prove that x + y + z = 0 )
x y + y z + z x = 0 ) x y z = 0 ) x = 0, because then the polynomial becomes X3, and has only 0
as a root.</p>
          <p>Require gbZ.</p>
          <p>Goal forall x y z:Z,</p>
          <p>x+y+z=0 -&gt; x*y+y*z+z*x=0 -&gt; x*y*z=0 -&gt; x=0.
gbZ.</p>
          <p>Qed.</p>
        </sec>
      </sec>
      <sec id="sec-7-2">
        <title>More complicated, the same thing in degrees 4 and 5:</title>
        <p>Goal forall x y z u:Z,
x+y+z+u=0 -&gt;
x*y+y*z+z*u+u*x+x*z+u*y=0 -&gt;
x*y*z+y*z*u+z*u*x+u*x*y=0 -&gt;
x*y*z*u=0 -&gt; x=0.
gbZ.</p>
        <p>Qed.</p>
        <p>Goal forall x y z u v:Z,
x+y+z+u+v=0 -&gt;
x*y+x*z+x*u+x*v+y*z+y*u+y*v+z*u+z*v+u*v=0-&gt;
x*y*z+x*y*u+x*y*v+x*z*u+x*z*v+x*u*v+y*z*u+y*z*v+y*u*v+z*u*v=0-&gt;
x*y*z*u+y*z*u*v+z*u*v*x+u*v*x*y+v*x*y*z=0 -&gt;
x*y*z*u*v=0 -&gt; x^5=0.
gbZ.</p>
        <p>Qed.</p>
        <p>Last example takes less than 1s with F4 and GB, and gbcoq. With hol-light, it takes 1s.</p>
        <sec id="sec-7-2-1">
          <title>7.2 Geometry</title>
          <p>Open Scope R_scope.</p>
          <p>Record point:Type:={</p>
          <p>X:R;</p>
          <p>Y:R}.</p>
          <p>Desargues theorem is too complicated to be proved with Gro¨bner bases. But Pappus theorem can. We
formalize in Coq the set of points in the real plane:</p>
          <p>Then we give two definitions of colinearity of three points (the theorem is false if we use only the
second definition, because of degenerated configurations):
Definition colinear(C A B:point):=</p>
          <p>exists a:R,
(X C)=a*(X A)+(1-a)*(X B) /\ (Y C)=a*(Y A)+(1-a)*(Y B).</p>
          <p>Definition colinear2(A B C:point):=
(X A)*(Y B)+(X B)*(Y C)+(X C)*(Y A)
=(Y B)*(X C)+(Y C)*(X A)+(Y A)*(X B).</p>
          <p>Then we state and prove the Pappus theorem, in a specialized (but without lost of generality)
configuration:
Lemma pappus: forall A B C A' B' C' D E F:point,
(X A')=0 -&gt; (X B')=0-&gt; (X C')=0 -&gt;
(Y A)=0 -&gt; (Y B)=0 -&gt; (Y C) = 0 -&gt;
colinear D A B' -&gt; colinear D A' B -&gt;
colinear E A C' -&gt; colinear E A' C -&gt;
colinear F B C' -&gt; colinear F B' C -&gt;
colinear2 D E F.
...
gbR_choice 2.</p>
          <p>Qed.</p>
          <p>In this example, F4 fails, GB takes 9s, and gbcoq takes 3s. We also tried hol-light with this example,
which takes 77s:
./hol
prioritize_int();;
let t1 = Unix.time();;
int_ideal_cofactors
[`XD -( x4 * XA )`;
`YD -((&amp;1 - x4) * YB1)`;
`XD -( (&amp;1 - x3) * XB)`;
`YD - (x3 * YA1)`;
` XE - x2 * XA`;
`YE - (&amp;1 - x2) * YC1`;
` XE - (&amp;1 - x1) * XC`;
` YE - x1 * YA1`;
` XF - x0 * XB`;
` YF - (&amp;1 - x0) * YC1`;
` XF - (&amp;1 - x) * XC`;
` YF - x * YB1`]
` XD * YE + XE * YF + XF * YD -(YE * XF + YF * XD + YD * XE)`;;
Unix.time()-.t1;;
7.3</p>
        </sec>
        <sec id="sec-7-2-2">
          <title>Arithmetics</title>
          <p>The general case of Pappus theorem is too complicated to compute.</p>
          <p>
            Following the idea of [
            <xref ref-type="bibr" rid="ref7">7</xref>
            ], we can prove statements about coprimality, gcd and divisions. We have to do
some work for that, because the tactic gbZ is not sufficient. But the problem is again an ideal membership
one, then solvable by Gro¨bner basis computation. We have written a tactic doing that, called gbarith.
Here are examples of its use in Coq:
Definition divides(a b:Z):= exists c:Z, b=c*a.
          </p>
          <p>Definition modulo(a b p:Z):= exists k:Z, a - b = k*p.</p>
          <p>Definition ideal(x a b:Z):= exists u:Z, exists v:Z, x = u*a+v*b.</p>
          <p>Definition gcd(g a b:Z):= divides g a /\ divides g b /\ ideal g a b.</p>
          <p>Definition coprime(a b:Z):= exists u:Z, exists v:Z, 1 = u*a+v*b.</p>
          <p>Goal forall a b c:Z, divides a (b*c) -&gt; coprime a b -&gt; divides a c.
gbarith.</p>
          <p>Qed.</p>
          <p>Goal forall m n r:Z, divides m r -&gt; divides n r -&gt; coprime m n -&gt; divides (m*n) r.
gbarith.</p>
          <p>Qed.</p>
          <p>Goal forall x y a n:Z, modulo (x^2) a n -&gt; modulo (y^2) a n -&gt; divides n ((x+y)*(x-y)).
gbarith.</p>
          <p>Qed.
7.4</p>
        </sec>
        <sec id="sec-7-2-3">
          <title>Computation times, comparison with hol-light</title>
          <p>Previous examples, and more we made, show that no one among F4, GB, gbcoq and is better than others.
hol-light is sometimes better than F4 and GB, but gbcoq is much better than hol-light. The reason is
simple: we often stop computations before obtaining a Gro¨bner basis.
8</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-8">
      <title>Conclusion</title>
      <p>The ”external” tactic of Coq is a very good tool to use efficient programs to produce proofs in specific
domains. We have shown how to use efficient Gro¨bner bases computations in this context. The use
of certificates should be developped to reduce time of re-verification of proofs. The certificate can be
written explicitely in the proof script, as we have shown here, but it could be stored in a cache. We have
shown the interest of using external programs, but also their limits, as soon as it is impossible or difficult
to adapt them to specific use of proof systems. We plan to investigate other decisions procedures, for
example polynomial system solving, to produce new tactics in the same spirit.</p>
      <p>Acknowledgements: we thank anonymous referees for their suggestions on the redaction of this
paper and bibliographical completions.
Connecting Gro¨ bner bases programs with Coq</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Bruno</given-names>
            <surname>Buchberger</surname>
          </string-name>
          .
          <source>Bruno buchberger's phd thesis</source>
          <year>1965</year>
          :
          <article-title>An algorithm for finding the basis elements of the residue class ring of a zero dimensional polynomial ideal</article-title>
          .
          <source>Journal of Symbolic ComputationVolume 41, Issues 3-4</source>
          , Logic, Mathematics and Computer Science:
          <article-title>Interactions in honor of Bruno Buchberger (60th birthday)</article-title>
          ,,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Amine</given-names>
            <surname>Chaieb</surname>
          </string-name>
          and Makarius Wenzel.
          <article-title>Context aware calculation and deduction</article-title>
          . In Manuel Kauers, Manfred Kerber, Robert Miner, and Wolfgang Windsteiger, editors,
          <source>Calculemus/MKM</source>
          , volume
          <volume>4573</volume>
          of Lecture Notes in Computer Science, pages
          <fpage>27</fpage>
          -
          <lpage>39</lpage>
          . Springer,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>David</given-names>
            <surname>Eisenbud</surname>
          </string-name>
          .
          <article-title>Commutative algebra with a view toward algebraic geometry</article-title>
          .
          <source>Graduate Texts in Mathematics 150</source>
          . Springer-Verlag,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Jean-Charles Fauge</surname>
          </string-name>
          `re. Gb. http://fgbrs.lip6.fr/jcf/Software/Gb/index.html.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <surname>Jean-Charles Fauge</surname>
          </string-name>
          <article-title>`re. A new efficient algorithm for computing grobner bases (f4)</article-title>
          . volume
          <volume>139</volume>
          , issues 1-3
          <source>of Journal of Pure and Applied Algebra</source>
          , pages
          <fpage>61</fpage>
          -
          <lpage>88</lpage>
          ,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>John</given-names>
            <surname>Harrison</surname>
          </string-name>
          .
          <article-title>Towards self-verification of hol light</article-title>
          .
          <source>In Ulrich Furbach and Natarajan Shankar</source>
          , editors,
          <source>Proceedings of the third International Joint Conference, IJCAR</source>
          <year>2006</year>
          , volume
          <volume>4130</volume>
          of Lecture Notes in Computer Science, pages
          <fpage>177</fpage>
          -
          <lpage>191</lpage>
          , Seattle, WA,
          <year>2006</year>
          . Springer-Verlag.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>John</given-names>
            <surname>Harrison</surname>
          </string-name>
          .
          <article-title>Automating elementary number-theoretic proofs using gro¨bner bases</article-title>
          . In Frank Pfenning, editor,
          <source>Proceedings of the 21st International Conference on Automated Deduction, CADE 21</source>
          , volume
          <volume>4603</volume>
          of Lecture Notes in Computer Science, pages
          <fpage>51</fpage>
          -
          <lpage>66</lpage>
          , Bremen, Germany,
          <year>2007</year>
          . Springer-Verlag.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>John</given-names>
            <surname>Harrison</surname>
          </string-name>
          .
          <article-title>Verifying nonlinear real formulas via sums of squares</article-title>
          .
          <source>In Klaus Schneider and Jens Brandt</source>
          , editors,
          <source>Proceedings of the 20th International Conference on Theorem Proving in Higher Order Logics, TPHOLs</source>
          <year>2007</year>
          , volume
          <volume>4732</volume>
          of Lecture Notes in Computer Science, pages
          <fpage>102</fpage>
          -
          <lpage>118</lpage>
          , Kaiserslautern, Germany,
          <year>2007</year>
          . Springer-Verlag.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname>Lo</surname>
          </string-name>
          <article-title>¨ıc Pottier Je´roˆme Cre´ci</article-title>
          . Gb: une proce´dure de de´
          <article-title>cision pour le syste`me coq</article-title>
          .
          <source>Journe´es Francaises des Langages Applicatifs</source>
          ,
          <string-name>
            <surname>Sainte-</surname>
          </string-name>
          Marie-de-Re´, pages http://jfla.inria.fr/2004/actes/actes-jfla
          <article-title>-2004.tar</article-title>
          .gz,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Lo</surname>
          </string-name>
          <article-title>¨ıc Pottier Laurent The´ry</article-title>
          . gbcoq,
          <year>1998</year>
          . http://www-sop.inria.fr/croap/CFC/Gbcoq.html.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          <source>[11] The Coq Development Team. The coq proof assistant</source>
          ,
          <year>2008</year>
          . http://coq.inria.
          <source>fr/V8</source>
          .1pl3/refman/ index.html.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>