<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Connecting Gröbner bases programs with Coq to do proofs in algebra, geometry and arithmetics</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><roleName>Loïc Pottier INRIA</roleName><forename type="first">Sophia</forename><surname>Antipolis</surname></persName>
						</author>
						<title level="a" type="main">Connecting Gröbner bases programs with Coq to do proofs in algebra, geometry and arithmetics</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">E0441822C71BA69E3341B9E2052778F8</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-25T09:04+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>We describe how we connected three programs that compute Gröbner bases <ref type="bibr" target="#b0">[1]</ref> 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 <ref type="bibr" target="#b9">[10]</ref>. F4 and GB are the fastest (up to our knowledge) available programs that compute Grö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 Gröbner computation, via Hilbert's Nullstellensatz. We adapted also the results of <ref type="bibr" target="#b6">[7]</ref>, to allow to prove some theorems about modular arithmetics. The connection between Coq and the programs that compute Grö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></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><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 ∀xy : R, x 2 + xy = 0, y 2 + xy = 0 ⇒ x + y = 0, or ∀x : R, x 2 = 1 ⇒ x = 1.</p><p>This tactic uses external efficient programs that compute Gröbner bases, and their result to produce a proof and a certificate.</p><p>We wrote such a tactic several years ago <ref type="bibr" target="#b8">[9]</ref>, 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 Gröbner bases to prove polynomial equalities, specially in arithmetics <ref type="bibr" target="#b6">[7]</ref>. This program was adapted in Isabelle by Amine Chaieb and Makarius Wenzel for the same task <ref type="bibr" target="#b1">[2]</ref>. 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 Grö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 Grö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 <ref type="bibr" target="#b5">[6]</ref> . Section 8 contains the conclusion and perpectives of this work.</p><p>Rudnicki P, Sutcliffe G., Konev B., Schmidt R., Schulz S. (eds.); Proceedings of the Combined KEAPPA -IWIL Workshops, pp. 67-76 1 downloadable at http://www-sop.inria.fr/marelle/Loic.Pottier/gb-keappa.tgz</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Pottier</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Hilbert Nullstellensatz</head><p>Hilbert Nullstellensatz shows how to reduce proofs of equalities on polynomials to algebraic computations (see for example <ref type="bibr" target="#b2">[3]</ref> for the notions introduced in this section).</p><p>It is easy to see that if a polynomial P in K[X 1 , . . . , X n ] verifies P r = ∑ s i=1 Q i P i , with r a positive integer, Q i and P i also in K[X 1 , . . . , X n ], then P is zero whenever polynomials P 1 , ..., P s are zero.</p><p>Then we can reduce the proof of P 1 = 0, . . . , P s = 0 ⇒ P = 0 to find Q 1 , . . . , Q s and r such that</p><formula xml:id="formula_0">P r = ∑ i Q i P i .</formula><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 P r = ∑ i Q i P i can be done using Grö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 ∈ I whenever a ∈ 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 Grö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 Grö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 α − Q we write P = aX α S + T where T contains no monomial that is multiple of X α . 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 Gröbner basis, this remainder is unique (this is a characteristic property of Gröbner basis).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.1">Method 1: how to find</head><formula xml:id="formula_1">Q 1 , . . . , Q s such that 1 = ∑ i Q i P i</formula><p>Compute a Gröbner base of the polynomials {tP i − e i , e i e j , e i t} i, j (where t, e 1 , . . . , e s are new variables) with an order such that t &gt; X i &gt; e i .</p><p>Suppose that, in this basis, there is a polynomial of the form t − ∑ i Q i e i . This polynomial is then in the ideal generated by {tP i − e i , e i e j , e i t} i, j , so is a linear combination of these polynomials: t − ∑ i Q i e i = ∑ i h i (tP i − e i ) + ∑ i j g i j e i e j + ∑ i k i e i t e i are formal variables, so we can substitute formally e i with tP i , and we obtain t(1</p><formula xml:id="formula_2">− ∑ i Q i P i ) = 0 + t 2 ( ∑ i j g i j P i P j + ∑ i k i P i ).</formula><p>Then the coefficient of t in this equation must be zero: 1 − ∑ i Q i P i = 0, and we are done. Note that the polynomials {e i t, e i e j } are not necessary, but their presence much speed up the computation of the Gröbner basis<ref type="foot" target="#foot_0">2</ref> .</p><p>2.2 Method 2: how to find Q 1 , . . . , Q s and r such that P r = ∑ i Q i P i Use the standard trick: search to write 1 = ∑ i h i P i + 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 h i .</p><p>Substitute formally z with 1/P, and multiply the equation (*) by P r . Then we obtain P r = ∑ i Q i P i , as required, where</p><formula xml:id="formula_3">Q i = P r h i [z ← 1/P]</formula><p>Connecting Gröbner bases programs with Coq Pottier</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.3">Completness</head><p>It is easy to see that methods 1 and 2 are complete in the sense that if P r = ∑ i Q i P i holds, there will find such an equation:</p><formula xml:id="formula_4">• method 1: suppose 1 − ∑ i Q i P i = 0. Then t = ∑ i Q i tP i , and t − ∑ i Q i e i = ∑ i Q i (tP i − e i ).</formula><p>Hence t − ∑ i Q i e i belongs to the ideal of which we have computed a Gröbner basis. Because of the order we have choosen on variables, this implies that there is a polynomial t − ∑ i h i e i in the Gröbner basis.</p><p>• method 2: suppose P r = ∑ i Q i P i . We have 1 − z r P r = (1 + zP + . . .</p><formula xml:id="formula_5">+ z r−1 P r−1 )(1 − zP). Replacing P r with ∑ i Q i P i we obtain 1 = z r (∑ i Q i P i ) + (1 + zP + . . . + z r−1 P r−1 )(1 − zP).</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.4">Example</head><p>Take p = x + y, p 1 = x 2 + xy, p 2 = y 2 + xy. With the previous method, the Gröbner basis is: we obtain r = 2,</p><formula xml:id="formula_6">t − zye 0 − zxe 0 − z 2 e 1 − z 2 e 2 −</formula><formula xml:id="formula_7">Q 1 = 1, Q 2 = 1, and then (x + y) 2 = 1 × (x 2 + xy) + 1 × (y 2 + xy). Which proves that x 2 + xy = 0, y 2 + xy = 0 ⇒ x + y = 0.</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Proof in Coq</head><p>Coq <ref type="bibr" target="#b10">[11]</ref> is a proof assistant based on type theory, where we can interactively build proofs of goals, which are logical assertions of the form ∀H 1 : T 1 , . . . , ∀H n : T n ,C(H1, . . . , H n ). 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:</p><p>x : Z y : Z H : x ^2 + x * y = 0 H0 : y ^2 + x * y = 0 ============================ x + y = 0</p><p>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, Gröbner basis computation, and building the proof from the Nullstellensatz equation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1">Syntaxification</head><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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.3">Building the proof from the Nullstellensatz equation</head><p>After interpreting the polynomials q 1 and q 2 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.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Connecting F4, GB, and gbcoq to Coq</head><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 Grö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 Grö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. Faugè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 Grö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 Grö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 Faugère, which are free but not opensource.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">The gbR and gbZ tactics in Coq</head><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 cp d = ∑ i q i p i , where c is an integer, and the q i have integer coefficients. We can allow negations of equations in the conclusion. For example xy = 1 ⇒ x = 0. The trick is to replace x = 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 x 2 = 1 ⇒ x = 1. This can be done by introducing new variables, remarking that p = 0 ⇔ ∃t, p * t = 1.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Pottier</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7.1">Algebra</head><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 X 3 + a * X Last example takes less than 1s with F4 and GB, and gbcoq. With hol-light, it takes 1s.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7.2">Geometry</head><p>Desargues theorem is too complicated to be proved with Gröbner bases. But Pappus theorem can. We formalize in Coq the set of points in the real plane: Open Scope R_scope. Record point:Type:={ X:R; Y:R}.</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):</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Pottier</head><p>Unix.time()-.t1;;</p><p>The general case of Pappus theorem is too complicated to compute.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7.3">Arithmetics</head><p>Following the idea of <ref type="bibr" target="#b6">[7]</ref>, 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 Gröbner basis computation. We have written a tactic doing that, called gbarith. 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. Qed.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7.4">Computation times, comparison with hol-light</head><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 Gröbner basis.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8">Conclusion</head><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 Grö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></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head></head><label></label><figDesc>2 + 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 X 3 , and has only 0 as a root. Require gbZ. Goal forall x y z:Z, x+y+z=0 -&gt; x*y+y*z+z*x=0 -&gt; x*y*z=0 -&gt; x=0. gbZ. Qed. More complicated, the same thing in degrees 4 and 5: 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. Qed. 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. Qed.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head></head><label></label><figDesc>Here are examples of its use in Coq: Definition divides(a b:Z):= exists c:Z, b=c*a. Definition modulo(a b p:Z):= exists k:Z, a -b = k*p. Definition ideal(x a b:Z):= exists u:Z, exists v:Z, x = u*a+v*b. Definition gcd(g a b:Z):= divides g a /\ divides g b /\ ideal g a b. Definition coprime(a b:Z):= exists u:Z, exists v:Z, 1 = u*a+v*b. Goal forall a b c:Z, divides a (b*c) -&gt; coprime a b -&gt; divides a c. gbarith. Qed. Goal forall m n r:Z, divides m r -&gt; divides n r -&gt; coprime m n -&gt; divides (m*n) r. gbarith. Qed.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head></head><label></label><figDesc>e 0 y 2 e 0 − x 2 e 0 + zye 1 − zxe 2 − e 1 + e 2 yxe 0 + x 2 e 0 + zye 2 + zxe 2 − e 2 e 2</figDesc><table /><note>0 xe 1 − ye 2 e 0 e 1 , e21 , e 0 e 2 , e 1 e 2 , e 2 2</note></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_0">thanks to Bernard Mourrain for this trick</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="3" xml:id="foot_1">thanks to Julien Narboux for this suggestion</note>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Acknowledgements: we thank anonymous referees for their suggestions on the redaction of this paper and bibliographical completions.</p></div>
			</div>

			<div type="annex">
<div xmlns="http://www.tei-c.org/ns/1.0"><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,</p><p>evaluates in x^2 + x * y.</p><p>We used parts of the code of the sos <ref type="bibr" target="#b7">[8]</ref> tactic, written by Laurent Théry.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2">Calling Gröbner basis computation</head><p>We call the external program gb (see section 4) with the list of polynomials; here we choose the program F4 to compute Gröbner basis: external "./gb" "jcf2" lp</p><p>The result is the term:</p><p>which has the structure</p><p>such that the Nullstellensatz equation holds:</p><p>Here, we have lq = q 1 , q 2 , q 1 = q 2 = 1 Connecting Gröbner bases programs with Coq</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Pottier</head><p>In the example, this gives t(x 2 − 1) = 1 ⇒ x = 1. The negation in conclusion can be removed and leads to t(</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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">Certificates</head><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 Gröbner computation 3 . 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: 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 × (x 2 + xy) + 1 × (y 2 + xy), and then need much less time to evaluate, because it doesn't need Gröbner basis computation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7">Examples</head><p>In this section we give several examples of use of the tactics gbR and gbR. Then we state and prove the Pappus theorem, in a specialized (but without lost of generality) configuration:</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:</p><p>./hol prioritize_int();; </p></div>			</div>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Bruno buchberger&apos;s phd thesis 1965: An algorithm for finding the basis elements of the residue class ring of a zero dimensional polynomial ideal</title>
		<author>
			<persName><forename type="first">Bruno</forename><surname>Buchberger</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Logic, Mathematics and Computer Science: Interactions in honor of Bruno Buchberger (60th birthday)</title>
				<imprint>
			<date type="published" when="2006">2006</date>
			<biblScope unit="volume">41</biblScope>
			<biblScope unit="page" from="3" to="4" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Context aware calculation and deduction</title>
		<author>
			<persName><forename type="first">Amine</forename><surname>Chaieb</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Makarius</forename><surname>Wenzel</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Calculemus/MKM</title>
		<title level="s">Lecture Notes in Computer Science</title>
		<editor>
			<persName><forename type="first">Manuel</forename><surname>Kauers</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Manfred</forename><surname>Kerber</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Robert</forename><surname>Miner</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Wolfgang</forename><surname>Windsteiger</surname></persName>
		</editor>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="volume">4573</biblScope>
			<biblScope unit="page" from="27" to="39" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<title level="m" type="main">Commutative algebra with a view toward algebraic geometry</title>
		<author>
			<persName><forename type="first">David</forename><surname>Eisenbud</surname></persName>
		</author>
		<imprint>
			<date type="published" when="1999">1999</date>
			<publisher>Springer-Verlag</publisher>
		</imprint>
	</monogr>
	<note type="report_type">Graduate Texts in Mathematics 150</note>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<title/>
		<author>
			<persName><forename type="first">Jean-Charles</forename><surname>Faugère</surname></persName>
		</author>
		<ptr target="http://fgbrs.lip6.fr/jcf/Software/Gb/index.html" />
		<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">A new efficient algorithm for computing grobner bases (f4)</title>
		<author>
			<persName><forename type="first">Jean-Charles</forename><surname>Faugère</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Journal of Pure and Applied Algebra</title>
		<imprint>
			<biblScope unit="volume">139</biblScope>
			<biblScope unit="page" from="61" to="88" />
			<date type="published" when="1999">1999</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Towards self-verification of hol light</title>
		<author>
			<persName><forename type="first">John</forename><surname>Harrison</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the third International Joint Conference, IJCAR 2006</title>
		<title level="s">Lecture Notes in Computer Science</title>
		<editor>
			<persName><forename type="first">Ulrich</forename><surname>Furbach</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Natarajan</forename><surname>Shankar</surname></persName>
		</editor>
		<meeting>the third International Joint Conference, IJCAR 2006<address><addrLine>Seattle, WA</addrLine></address></meeting>
		<imprint>
			<publisher>Springer-Verlag</publisher>
			<date type="published" when="2006">2006</date>
			<biblScope unit="volume">4130</biblScope>
			<biblScope unit="page" from="177" to="191" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Automating elementary number-theoretic proofs using gröbner bases</title>
		<author>
			<persName><forename type="first">John</forename><surname>Harrison</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 21st International Conference on Automated Deduction, CADE 21</title>
		<title level="s">Lecture Notes in Computer Science</title>
		<editor>
			<persName><forename type="first">Frank</forename><surname>Pfenning</surname></persName>
		</editor>
		<meeting>the 21st International Conference on Automated Deduction, CADE 21<address><addrLine>Bremen, Germany</addrLine></address></meeting>
		<imprint>
			<publisher>Springer-Verlag</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="volume">4603</biblScope>
			<biblScope unit="page" from="51" to="66" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Verifying nonlinear real formulas via sums of squares</title>
		<author>
			<persName><forename type="first">John</forename><surname>Harrison</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 20th International Conference on Theorem Proving in Higher Order Logics</title>
		<title level="s">Lecture Notes in Computer Science</title>
		<editor>
			<persName><forename type="first">Klaus</forename><surname>Schneider</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Jens</forename><surname>Brandt</surname></persName>
		</editor>
		<meeting>the 20th International Conference on Theorem Proving in Higher Order Logics<address><addrLine>Kaiserslautern, Germany</addrLine></address></meeting>
		<imprint>
			<publisher>Springer-Verlag</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="volume">4732</biblScope>
			<biblScope unit="page" from="102" to="118" />
		</imprint>
	</monogr>
	<note>TPHOLs 2007</note>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Gb: une procédure de décision pour le système coq</title>
		<author>
			<persName><forename type="first">Loïc</forename><surname>Pottier</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jérôme</forename><surname>Créci</surname></persName>
		</author>
		<ptr target="http://jfla.inria.fr/2004/actes/actes-jfla-2004.tar.gz" />
	</analytic>
	<monogr>
		<title level="m">Journées Francaises des Langages Applicatifs, Sainte-Marie-de-Ré</title>
				<imprint>
			<date type="published" when="2004">2004</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<author>
			<persName><forename type="first">Loïc</forename><surname>Pottier</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Laurent</forename><surname>Théry</surname></persName>
		</author>
		<ptr target="http://www-sop.inria.fr/croap/CFC/Gbcoq.html" />
		<title level="m">gbcoq</title>
				<imprint>
			<date type="published" when="1998">1998</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<monogr>
		<ptr target="http://coq.inria.fr/V8.1pl3/refman/index.html" />
		<title level="m">The Coq Development Team</title>
				<imprint>
			<date type="published" when="2008">2008</date>
		</imprint>
	</monogr>
	<note>The coq proof assistant</note>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
