Constructive Algebra in Functional Programming and Type Theory
Constructive Algebra in Functional Programming and Type Theory
Constructive Algebra in Functional Programming and Type Theory
Type Theory
1234567895AB45C
DEF777AE
77CE
3!F77D! 767F"74
C#$76%"$778F7&'('
AE71 E7F77DEF777AE7F"777CE 7
E7)* 7E77! E7E7+,7F7F"77F7)F7
! !7F,77F77E7-.7
AE71 E7%FF7EF7E/E77E7F E77E7+,$7F"7%FF7EF7E7+,7
"77F7*$7! 77E7FF7EF7F7!E7F%.7
AE71 E7EF$7%E7F7E7E77E7+,77F7E"7!F707*F!7F7
! E77F7!F1$7F,%"7E7E"7!F7F 7E7F.7-7E71 E7
EF7"7F7!E7F7%E7F7E"7!F7F"7E7+,$7E71 E7
%FF7E7EF7E/E7EF7F"7F7F7!77E7E"7!F77
7DEF777AE7F"777CE 777E7+,7
F7F"7F,77F77E7-.
Anders Mörtberg
Cover:
An exact sequence defining that the module M is finitely presented. This is related to the
notion of coherent rings presented in chapter 3.
This thesis considers abstract algebra from a constructive point of view. The
central concept of study is coherent rings − algebraic structures in which it is
possible to solve homogeneous systems of linear equations. Three different alge-
braic theories are considered; Bézout domains, Prüfer domains and polynomial
rings. The first two of these are non-Noetherian analogues of classical notions.
The polynomial rings are presented from a constructive point of view with a
treatment of Gröbner bases. The goal of the thesis is to study the proofs that
these theories are coherent and explore how the proofs can be implemented in
functional programming and type theory.
Acknowledgments
First of all I would like to thank Thierry Coquand for all help and support
during the work on this thesis.
I would also like to thank Bassel Mannaa for interesting discussions and help
with the implementation. The comments presented during the opposition was
also very helpful.
Finally I would like to thank everyone that has read and given constructive
and helpful comments on this thesis.
Contents
1 Introduction 1
1.1 Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Previous work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4 Outline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Coherent rings 11
3.1 Definition and properties . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Coherence and strongly discrete rings . . . . . . . . . . . . . . . 14
4 Bézout domains 15
4.1 Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Euclidean domains . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.3 Coherence of Bézout domains . . . . . . . . . . . . . . . . . . . . 17
4.4 Bézout domains and strong discreteness . . . . . . . . . . . . . . 18
4.5 GCD domains and fields of fractions . . . . . . . . . . . . . . . . 18
5 Prüfer domains 21
5.1 Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2 Principal localization matrices . . . . . . . . . . . . . . . . . . . . 22
5.3 Invertible ideals and coherence of Prüfer domains . . . . . . . . . 25
5.4 Ideal arithmetic . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.5 Examples of Prüfer domains . . . . . . . . . . . . . . . . . . . . . 27
5.6 Prüfer domains and strong discreteness . . . . . . . . . . . . . . . 31
6 Polynomial rings 33
6.1 Monomials and monomial orderings . . . . . . . . . . . . . . . . 33
6.2 Polynomial rings . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6.3 Properties of ideals in k[x1 , . . . , xn ] . . . . . . . . . . . . . . . . . 36
6.4 Gröbner bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
6.5 Coherence of k[x1 , . . . , xn ] . . . . . . . . . . . . . . . . . . . . . . 38
6.6 Strong discreteness of k[x1 , . . . , xn ] . . . . . . . . . . . . . . . . . 39
i
7 Conclusions 41
7.1 Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
7.2 Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
7.3 Further work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
ii
Chapter 1
Introduction
1.1 Background
”It is important to keep in mind that constructive algebra is
algebra; in fact it is a generalization of algebra in that we do not
assume the law of excluded middle.” [16]
1
ify classical mathematics using computers, but the point is that in constructive
mathematics the proofs correspond to algorithms.
This thesis explores the question of how advanced algebra can be made con-
structive by considering classical structures where the assumptions of Noethe-
rianity has been dropped. This will be defined and discussed further in the
introduction to ring theory in chapter 2.
In linear algebra one of the main questions is how to solve homogeneous
systems of linear equations, but in linear algebra the central notion is vector
spaces which relies on the assumption that all nonzero elements has a multi-
plicative inverse. One main aim of this thesis is to look at what happens if this
assumption is dropped. The proofs of the results should be constructive and be
implemented in a functional programming language and eventually also verified
in a constructive proof system.
1.2 Method
The results presented in this thesis has been implemented in the pure lazy func-
tional programming language Haskell. The reason for using Haskell is that it has
a powerful type system and the features that makes it suitable for implementing
algebraic theories are mainly polymorphism and the type class system.
In order to specify the axioms of algebraic structures the automated test-
ing tool QuickCheck [2] is used, since the axioms are natural to represent as
QuickCheck properties and implementations of specific instances of the alge-
braic structures easily can be tested.
The final goal of the thesis is to represent the work in type theory, as an
implementation in a logical proof system based on intuitionistic type theory,
e.g. Agda1 or Coq2 . Due to time limitations this has not been done yet.
2
In [12] a framework for representing algebraic structures in Coq is presented.
This is done as part of a project to give a formalized proof of the fundamen-
tal theorem of algebra. This is a part of the Constructive Coq Repository at
Nijmegen5 which is a large library containing formalized mathematics focusing
mostly on constructive real numbers.
Another implementation of algebraic structures in Coq is the Mathematical
Components project6 . This is based on the ssreflect extension to Coq which was
used in the formal proof of the Four-Color Theorem by Georges Gonthier [14].
In [11] possible ways to represent algebraic structures as part of this project is
discussed together with problems related to the complexity of the representation.
Both of the references on implementations of algebraic theories in Coq has
many further references to other work on representing constructive mathemat-
ics in type theory, but none of them implement neither Bézout domains nor
Prüfer domains. Polynomial rings, on the other hand, has been represented in
Coq together with a verified implementation of the Buchberger algorithm for
computing Gröbner bases [17].
All of the major computer algebra systems like Maple, Mathematica and
Matlab implement algorithms for solving systems of linear equations and com-
puting Gröbner bases. These systems are based on less general algorithms than
the algorithms presented in this thesis. Instead they focus on more specialized
algorithms in order to be able to do as much optimization as possible.
The results on Bézout domains and Prüfer domains is based on the work
presented in the PhD thesis of Maimouna Salou [18]. As part of it many of the
proofs has been represented in the Axiom computer algebra system.
A project that studies generalized linear algebra is the homalg project7 . It
is a project that aims to translate as much homological algebra as possible
into computer programs. This project is implemented using object oriented
programming.
All of the web pages that has been referred to in this section has been visited
in May 2010.
1.4 Outline
In chapter 2 ring theory is introduced for a reader without a background in
abstract algebra. The most basic definitions that are necessary in order to read
the thesis are introduced. This chapter can be read very briefly by a reader who
is already familiar with ring theory. The discussions on implementation of the
concepts in functional programming and type theory are probably interesting
even if the reader already know the subject.
Chapter 3 presents coherent rings from a constructive point of view. Tra-
ditionally these are considered in terms of module theory but here they are
described in terms of solving equations à la linear algebra.
The following two chapters discusses Bézout domains and Prüfer domains
which are constructive analogies of principal ideal domains and Dedekind do-
mains. Just as in classical mathematics where principal ideal domains are a
subset of Dedekind domains are Bézout domains a subset of Prüfer domains.
5 http://c-corn.cs.ru.nl/
6 http://www.msr-inria.inria.fr/Projects/math-components
7 http://homalg.math.rwth-aachen.de/
3
The high-point of these chapters are the proofs that the classes of rings are
coherent and thus that it is possible to solve homogeneous systems of equations
over them.
In chapter 6 polynomial rings are presented, these are rings of polynomials
with coefficients from an underlying ring. The theory of Gröbner bases is pre-
sented from a constructive point of view together with the famous Buchberger
algorithm used to compute these. In the end of the chapter there is a proof that
these rings are also coherent.
Finally the results of the implementation are presented together with some
examples and a discussion on limitations and further work.
4
Chapter 2
This chapter should serve as a short introduction to the concepts of ring theory
that are necessary in order to understand the thesis. It does not claim to be a
complete and thorough presentation of all concepts of basic ring theory. For a
good introduction to general abstract algebra see [9] and for an introduction to
some of the more advanced concepts see [1]. If the reader already has a good
understanding of ring theory this chapter can be read briefly. Most important
are the notes about how to define the concepts in functional programming and
type theory.
2.1 Rings
The most fundamental concept of this thesis is the concept of rings. These can
be defined compactly in terms of groups and monoids, but here the definition
is a bit more verbose in order to give a summary of all the properties of rings
in one place.
Definition 2.1. A ring is a set R equipped with two binary operations called
addition and multiplication written +, • : R × R → R respectively. The axioms
that the triple (R,+,•) must satisfy are
1. Closure under addition: ∀a b ∈ R. a + b ∈ R
2. Associativity of addition: ∀a b c ∈ R. (a + b) + c = a + (b + c)
3. Existence of additive identity: ∃0 ∈ R. ∀a ∈ R. 0 + a = a + 0 = a
4. Existence of additive inverse: ∀a ∈ R. ∃b ∈ R. a + b = b + a = 0
5. Commutativity of addition: ∀a b ∈ R. a + b = b + a
6. Closure under multiplication: ∀a b ∈ R. a • b ∈ R
7. Associativity of multiplication: ∀a b c ∈ R. (a • b) • c = a • (b • c)d
8. Existence of multiplicative identity: ∃1 ∈ R. ∀a ∈ R. 1 • a = a • 1 = a
9. Left distributivity of multiplication over addition:
∀a b c ∈ R. a • (b + c) = (a • b) + (a • c)
5
10. Right distributivity of multiplication over addition:
∀a b c ∈ R. (a + b) • c = (a • c) + (b • c)
Definition 2.2. A commutative ring is a ring (R,+,•) satisfying the axiom that
multiplication is commutative:
∀a b ∈ R. a • b = b • a
This thesis will only consider commutative rings. All of the above examples
of rings are commutative.
An example of a ring that is not commutative is the ring of n × n matrices,
written Mn (R), where R is the ring of the elements. Here addition and multi-
plication are the standard operations on matrices and it is easy to construct an
example to show that matrix multiplication is non-commutative.
6
The previous examples have all been infinite, but there are also many finite
rings. A fundamental class of finite rings are the ring of integers modulo n,
written Zn 1 . This corresponds to the elements a ∈ Z in the same congruence
class modulo n, for example Z3 ≃ {0, 1, 2} since there are three congruence
classes modulo 3. Addition and multiplication are defined by using the addition
and multiplication of Z and then computing modulo n.
Note on implementation. To implement Zn the power of dependent types
would be desirable to have. The compiler would then be able to distinguish
elements from different rings and verify that they are for instance not multiplied.
The reason is that the type of Zn depends on the value of n. It is possible to
represent integers at the type level in Haskell but it is a bit cumbersome and
having real dependent types is preferable.
Another example of rings is polynomial rings, written R[x1 , . . . , xn ] where R
is the ring of the coefficients and x1 , . . . , xn are variables. It is easy to see that
these rings are commutative if R is. A concrete example of an element of Z[x, y]
is 3x + 7y 2 . This special class of rings has many applications and are considered
in more detail in chapter 6.
Definition 2.3. An integral domain is a commutative ring satisfying:
∀a b ∈ R. (ab = 0 → a = 0 ∨ b = 0)
Definition 2.4. A field is an integral domain in which all nonzero elements has
a multiplicative inverse:
∀a ∈ R∗ . ∃b ∈ R∗ . ab = 1
1 Often written Z/nZ.
7
This is often written using standard division notation, so a/b or ab actually
means a • (b−1 ) where b−1 is the multiplicative inverse of b.
Some of the infinite rings that presented so far are fields, these are Q, R, C.
Some finite fields have also been presented. These are, just as for integral
domains, Zn where n is a prime number.
Note on implementation. The representation of fields is very similar to the
representation of rings. The new operation that fields add is the ability to
compute multiplicative inverses. This can be implemented and specified as:
class IntegralDomain a ⇒ Field a where
inv :: a → a
This is the final definition of this section. It is possible to make these def-
initions more fine-grained by having several intermediate structures like semi
rings with and without a one or starting from monoids and groups to construct
rings. The reason not to do this is simply that the concepts presented here is
sufficiently complex for the following chapters. For a general abstract algebra
library the approach of having more structures would be much more sensible.
2.2 Ideals
The concept of ideals is very important in commutative algebra. They are
generalizations of many concepts of the integers like ”even number” or ”prime
number”. Since this thesis only consider commutative rings are all ideals two-
sided, that is left ideals are equal to right ideals. For non-commutative rings it
would have been possible to define left and right ideals instead.
Definition 2.5. For a commutative ring (R, +, •) and ideal I is a subset I ⊆ R
such that:
1. Closure of addition: ∀a b ∈ I. a + b ∈ I
∀a ∈ I. ∃r1 , . . . , rn ∈ R. a = x1 r1 + · · · + xn rn
8
The ideal generators are not written using the standard set notation but
with h. . . i. Examples of finitely generated ideals are both of the canonical
ideals where the zero ideal is generated by h0i and the whole ring is generated
by h1i. The even integers are generated by h2i, but they are also generated by
h2, 4i. So h2i and h2, 4i generate the same subset in Z and are thus equal. One
important property of the ideals in Z is that they all can be generated by one
element. This property of ideals have a special name.
Definition 2.7. A principal ideal is an ideal generated by only one element.
Rings like Z in which all ideals are principal are classically called principal
ideal domains. But constructively this definition is not suitable. Instead we
would only want to consider rings in which all finitely generated ideals are
principal. These rings are called Bézout domains and are considered in chapter
4.
I + J = hx1 , . . . , xn , y1 , . . . , ym i
Definition 2.9. The product of two ideals I and J is the ideal IJ generated
by all products xy where x ∈ I and y ∈ J.
The intersection of two ideals is also an ideal. But there is no general method
for computing the set of generators for the intersection of two ideals in arbitrary
rings. In chapter 3 it will be established that if the intersection of two finitely
generated ideals is finitely generated, the ring is coherent.
In fact the ideals form a complete lattice with respect to inclusion with the
sum and intersection operations. A lattice is a partially ordered set where every
pair of elements have a least upper bound and a greatest lower bound. This
lattice need not be distributive, that is the operators need not distribute over
each other, but in chapter 5 it will be proved that one way to define Prüfer
domains is by this property.
Now an example of ideal operations. Consider h4i and h6i in Z, that is the
sets generated by all multiples 4 and 6. The sum h4i + h6i = h4, 6i = h2i since
2 = 4 · (2) + 6 · (−1). The product is h4i h6i = h24i and the intersection h4i ∩ h6i
is the set generated by the lowest common multiple which will be proved in the
next chapter. Thus the intersection of h4i and h6i is h12i.
9
2.3 Discrete and strongly discrete rings
This section will consider some rings that are especially relevant for constructive
mathematics.
Definition 2.10. A ring is called discrete if equality is decidable.
All of the rings studied in the thesis will be discrete. But there are many
examples of rings that are not discrete. For example R is not discrete since it is
not possible to decide if two irrational numbers are equal in finite time. Another
example of rings that do not need to be discrete are formal power series rings;
rings of polynomials with and infinite number of terms.
Definition 2.11. A ring is called strongly discrete if ideal membership is de-
cidable.
This property is very strong. Many of the rings we have seen so far are
strongly discrete, this is in fact tightly connected to whether division is decidable
in the ring. In section 3.2 we will see that strong discreteness and coherence
give us the possibility of solving arbitrary systems of the type AX = B.
10
Chapter 3
Coherent rings
All rings in this section are integral domains. One of the main aims of the
following sections will be to prove that different rings are coherent. That means
that it is possible to solve systems of equations in them.
11
Not only is it possible to solve equations in a coherent ring, but in fact it
is possible to compute generators for any homogeneous system of equations in
a coherent ring. The proof of this proposition is a translation of the proof of
proposition 1.2 in [18].
Proposition 3.2. In a coherent ring it is possible to solve a system M X = 0
where M ∈ Rm×n and X ∈ Rn×1 .
Proof. Let Mi ∈ R1×n be the rows of M . By coherence it is possible to solve
M1 X = 0 and get L1 ∈ Rn×p1 such that
M1 X = 0 ↔ ∃Y ∈ Rp1 ×1 . X = L1 Y
M1 X = M2 X = 0 ↔ ∃Y ∈ Rp1 ×1 . X = L1 Y and M2 L1 Y = 0
↔ ∃Z ∈ Rp2 ×1 . X = L1 L2 Z
AX1 = BY1
..
.
AXp = BYp
12
Proposition 3.4. If R is an integral domain such that the intersection of two
finitely generated ideals is finitely generated then R is coherent.
Proof. The proof is by induction on the length of the system to solve. First
consider
ax = 0
Here the only solution is the trivial solution. Now assume that it is possible
to solve a system in n − 1 variables and consider the case with n ≥ 2 variables:
a1 x1 + . . . + an xn = 0
If a1 = 0 one set of solutions to the system is generated by (1, 0, . . . , 0),
but it is also possible to use the induction hypothesis and get the generators
vi2 , . . . , vin for the system with x2 , . . . , xn and the solutions of the system with
n unknowns are generated by (0, vi2 , . . . , vin ) and (1, 0, . . . , 0).
If a1 6= 0 the set (0, vi2 , . . . , vin ) of solutions can be found by the induction
hypothesis again. Further, by hypothesis it is possible to find t1 , . . . , tp such
that
ha1 i ∩ h−a2 , . . . , −an i = ht1 , . . . tp i
where ti = a1 wi1 = −a2 wi2 − . . . − an win . So if a1 x1 + . . . + an xn = 0 then
a1 x1 = −a2 x2 − . . . − an xn . We also have ui such that
p
X
a1 x1 = −a2 x2 − . . . − an xn = u i ti
i=1
Pp Pp
This implies that a1 x1 = P i=1 ui ti = i=1 ui a1 wi1 which by the cancella-
p
tion property give that x1 = i=1 ui wi1 . Similarly
p
X p
X
−a2 x2 − . . . − an xn = u i ti = ui (−a2 wi2 − . . . − an win )
i=1 i=1
This gives that (wi1 , . . . , win ) and (0, vi2 , . . . , vin ) generate the module of
solution.
This gives a method for proving that rings are coherent. Now the ”only” thing
to prove is how to compute the intersection of finitely generated ideals and
then this will imply that the ring is coherent. This also shows that coherent
rings can be characterized only in terms of the intersection of finitely
generated ideals.
Note on implementation. One thing worth emphasizing here is the depen-
dence on the witnesses of the intersection. That is given two finitely generated
ideals I = hx1 , . . . , xn i and J = hy1 , . . . , yn i the functions that compute the in-
tersection must also give a set of witnesses. If the intersection I ∩J = hz1 , . . . , zl i
then the function should give aij and bij such that
zk = ak1 x1 + . . . + akn xn
= bk1 y1 + . . . + bkm ym
13
Note that this only gives the witnesses in one direction, that is if x ∈ I ∩ J
then x ∈ I and x ∈ J.
MX = A ↔ ∃Y. X = LY + X0
14
Chapter 4
Bézout domains
This section will consider a class of integral domains called Bézout domains.
These are non-Noetherian analogues of principal ideal domains. Examples of
Bézout domains are Z and k[x]. The goal of this section is to give some moti-
vation and examples of Bézout domains and then prove that they are coherent.
Finally there will be some discussion on what is required for them to be strongly
discrete.
4.1 Definition
One interesting class of integral domains is principal ideal domains, that are
integral domains in which all ideals are principal. This means that all principal
ideal domains are Noetherian, but as mentioned in chapter 2 is Noetherianity
not suitable for constructive mathematics. Thus are principal ideal domains not
suitable and we instead introduce Bézout domains.
t = a 1 u1 + · · · + a n un
The second list is the witness that there exists vi for each ai such that
ai = tvi
15
4.2 Euclidean domains
Many examples of Bézout domains are Euclidean domains. These are rings with
additional structure, namely an Euclidean function. This allows a generalization
of the Euclidean algorithm on integers.
Definition 4.2. An Euclidean domain is an integral domain R with a function
f : R∗ → N with the property that for a, b ∈ R there exist q, r ∈ R such that
a = bq + r where either r = 0 or f (r) < f (b).
Euclidean domains are integral domains where it is possible to perform divi-
sion with remainder. Examples include Z with the absolute value function and
the ring of polynomials k[x] with the degree function.
In order to show that Euclidean domains are Bézout domains some lemmas
are needed. In Euclidean domains the Euclidean algorithm for computing the
greatest common divisor of two elements can be applied. There is a generalized
version which computes the greatest common divisor of more than two elements.
Lemma 4.3. The generalized greatest common divisor (ggcd) of n elements can
be computed by recursively applying the algorithm for computing the gcd of two
elements. More specifically:
16
Note on implementation. The implementation of this proof will have to
compute the witnesses also. One direction follow directly from the proof since
the extended Euclidean algorithm is used. The other direction is also direct
since division is decidable and t divides all ai .
lcm(a, b) = au
lcm(a, b) = bv
g = au1 + bu2
a = gv1
b = gv2
a b ab
lcm(a, b) = gv1 v2 = g · = (∗)
g g g
17
Now that the lowest common multiple has been computed the witnesses has
to be computed. But this is easy since by (∗) we get that
b
u= g = v2
a
v= g = v1
The inclusion Bézout domains ⊂ GCD domains is easy to see. But note that
not all GCD domains are coherent.
18
One reason to look at GCD domains is that they provide a good setting in
which to implement the field of fractions for an integral domain. As the name
indicates it is a field in which the integral domain can be embedded.
An integral domain can be embedded by the map a 7→ (a, 1). Addition and
multiplication can be defined as
The inverse of (a, s) where a, s 6= 0 is (s, a). It is easy to verify that this satisfies
the conditions for a field.
The equivalence classes can be viewed as fractions. Thus is the construction
of fields of fractions a generalization of the construction of Q from Z to arbitrary
integral domains. Another special construction is the field of fractions for k[x]
(k discrete field) which is called the field of rational functions and is denoted
by k(x). This is the field where the elements are fractions of polynomials in one
variable which will be important in section 5.5.2 when looking at an example
of a Prüfer domains that is not a Bézout domains. This can be generalized to
multivariate polynomials and one then get the field of rational functions of a
polynomial ring k[x1 , . . . , xn ] denoted by k(x1 , . . . , xn ).
The reason that GCD domains are a good setting for constructing the field of
fractions is that it is possible to restrict the equivalence classes to those in which
gcd(a, b) = 1. So all fractions will be in normal form. This is a generalization
of the fact that 24 can be simplified to 12 in Q to arbitrary fields of fractions.
Note on implementation. To implement GCD domains just follow the usual
method without forgetting the witnesses. Given nonzero a, b ∈ R we should
compute gcd(a, b), x and y such that
a = gcd(a, b)x
b = gcd(a, b)y
1 = gcd(x, y)
This makes it very easy to represent the field of fractions over a GCD domain.
It can be represented by a pair where the second element always should be
nonzero.
The reduction to normal form of a pair (a, b) works by computing gcd(a, b)
and if it is 1 everything is fine. If it is not equal to 1 then return (x, y).
Using this it is trivial to implement Q with the help of a suitable imple-
mentation of Z and if one also have an implementation of k[x] it is trivial to
implement k(x). This method could be used as a basis for implementing the
rational numbers in type theory. For instance this is how it is implemented in
the C-CORN library mentioned in the section on previous work.
19
In this section we have seen that Bézout domains are coherent and given
some examples of them. But the assumption that all finitely generated ideals
are principal is quite strong and there are many examples of coherent rings in
which this assumption does not hold. The next section will look at a superset of
Bézout domains that also are coherent. These rings are called Prüfer domains
and there will be some examples of Prüfer domains that are not Bézout domains
for which it is not clear that it is possible to solve systems of equations over.
20
Chapter 5
Prüfer domains
This chapter describes another class of coherent rings called Prüfer domains.
First one of the many characterizations of Prüfer domains will be presented
followed by some constructions leading up to the coherence proof. Next there
will be some examples of what can be done in terms of ideal arithmetic in Prüfer
domains and finally there will be some examples of Prüfer domains that are not
Bézout domains. This whole section follow [8, 18].
5.1 Definition
The classical definition of Prüfer domains is that they are non-Noetherian gen-
eralization of Dedekind domains. Just as Bézout domains inherit many proper-
ties from principal ideal domains Prüfer domains inherit many properties from
Dedekind domains. A first observation is that Prüfer domains allow many dif-
ferent classifications concerning aspects like: localization, structural and arith-
metical properties of ideals and polynomial rings. The classification that will
be considered in this thesis is a simple first-order condition.
Definition 5.1. An integral domain R is a Prüfer domain iff
∀x y. ∃u v w. ux = vy ∧ (1 − u)y = wx (∗)
Note on implementation. As for the other algebraic structures this can be
represented in the Haskell type class system as
class IntegralDomain a ⇒ PruferDomain a where
calcUVW :: a → a → (a,a,a)
21
Proposition 5.2. Bézout domains are Prüfer domains.
Proof. Since we have Bézout domain we can compute g, a and b such that
g = gcd(x, y)
x = ag
y = bg
ca + db = 1
dbx = vy
Which simplifies to
dbag = vbg
Take
v = ad
Now we want to compute w such that
wx = (1 − u)y
= (1 − db)y
= cay
= cagb
22
Proposition 5.4. Let R be a Bézout domain and let I = hx1 , . . . , xn i be an
ideal in R. Then I has a principal localization matrix.
hgi = hx1 , . . . , xn i
Xn
g = xi ui
i=1
xi = gvi ∀i ∈ {1, . . . , n}
We also have
n
X n
X n
X
g= xi ui = gvi ui = g aii
i=1 i=1 i=1
P
So 1 = aii and thus (aij ) is principal localization matrix for I.
The next step is to generalize this to Prüfer domains and thus show that
principal localization matrices for ideals are computable in Prüfer domains.
∀x y. ∃u v w t. u + t = 1 ∧ ux = vy ∧ wx = ty
Now the proof proceeds by induction on n. For the case of n = 2 let the matrix
be
u v
w t
This obviously satisfies the requirements for being a principal localization
matrix. For n > 2 assume that it holds for n − 1 and thus there is a principal
localization matrix B = (bij )1≤i,j≤n−1 such that
n−1
Pb =1
ii
i=1
blj xi = bli xj
Using this we will proceed by showing how aii and ann , aij where i 6= j ∈
{1, . . . , n − 1} and finally ani and ain can be computed using B.
23
• aii and ann : We have
n−1
X n−1
X n−1
X n−1
X
1= bii = bii (ui + ti ) = bii ui + bii ti
i=1 i=1 i=1 i=1
Pn−1 Pn
Now we can let aii = bii ui and ann = i=1 bii ti and get that i=1 aii = 1.
• aij where i 6= j ∈ {1, . . . , n − 1}: We have
Pn−1
Now let ani = j=1 bji wj .
• ain : Finally for i ∈ {1, . . . , n − 1} we have
One of the reasons to study principal localization matrices is that they can
be used to invert ideals in Prüfer domains, more about this in the next section.
The following proposition describe one of the many things that can be done
with ideals and principal localization matrices, see proposition 2.6 in [8] for more
results.
24
Proposition 5.6. Let I = hx1 , . . . , xn i be a finitely generated ideal in a Prüfer
domain and let A = (aij ) be a principal localization matrix for this ideal. Then
the following holds:
Proof. Recall that the result of multiplying two finitely generated ideals is the
ideal generated by all products of the generators. Thus
IJ = (I ∩ J)(I + J)
25
Theorem 5.10. Prüfer domains are coherent.
Proof. Combine lemmas 5.8 and 5.9 to get
I = hx1 , . . . , xn i
J = hy1 , . . . , ym i
This give
I +J = hx1 , . . . , xn , y1 , . . . , ym i = hz1 , . . . , zk i
such that
Let
K = a1(n+1) , . . . , ak(n+1) , . . . , a1k , . . . , akk
This gives
IK = I ∩ J
Using this an algorithm can be implemented to compute the generators of
the intersection.
Thus it is possible to solve homogeneous linear systems over any Prüfer
domain. Note that for Bézout domains this gives another way of solving systems.
Next it would be interesting to see some examples of Prüfer domains that are
not Bézout domains, but first we will look at what Prüfer domains give us in
terms of ideal arithmetic.
26
5.4 Ideal arithmetic
Recall the definition of a lattice. A lattice is a partially ordered set where every
pair of elements has a lowest upper bound (join) and a greatest lower bound
(meet). For more information on this see any basic book on algebra, for example
[9]. For finitely generated ideals we have that the join of two ideals correspond
to the sum of them and the meet is the intersection, so the set of ideals in a
Prüfer domain form a lattice with ⊆.
For ideals I, J, K in a Prüfer domain the following property hold
I ∩ (J + K) = (I ∩ J) + (I ∩ K)
So ∩ distributes over + and thus the set of ideals in a Prüfer domain form
a distributive lattice. In fact this is one of the different ways to classify Prüfer
domains that were mentioned in the beginning of this chapter. For a proof that
this property is sufficient to be a Prüfer domain see theorem 1.1 in [10].
Another interesting property of the ideals in Prüfer domains is that they
satisfy the cancellation property. That is given finitely generated ideals I, J, K,
if
IJ = IK
then J = K or I = 0.
27
So ao s + a1 ∈ S also. Now (∗) can be rewritten as
(ao s + a1 )sn−1 + · · · + an = 0
It follows that (a0 s + a1 )s ∈ S. This process can be repeated and finally we
get that
a0 , a0 s, a0 s + a1 , (a0 s + a1 )s, (a0 s + a1 )s + a2 , . . .
are all in S. Thus we have in S
ha0 , a0 s, a0 s + a1 , (a0 s + a1 )s, (a0 s + a1 )s + a2 , . . . i = ha0 , . . . , an i = 1
This means that there exists m0 , m1 , . . . such that
m0 a0 + m1 a0 s + m2 (a0 s + a1 ) + m3 (a0 s + a1 )s + · · · = 1
The final step in the proof is to find u, v, w such that
(
ux = vy
(1 − u)y = wx
Let
u = m0 a0 + m2 (a0 s + a1 ) + . . .
This give
(m0 a0 + m2 (a0 s + a1 ) + . . . )x = vy
So we can let v = us. Finally we have
1−u = m1 a0 s + m3 (a0 s + a1 )s + . . .
= s(m1 a0 + m3 (a0 s + a1 ) + . . . )
This give (1 − u)y = x(m1 a0 + m3 (a0 s + a1 ) + . . . ) and thus
w = m1 a0 + m3 (a0 s + a1 ) + . . .
Both the proposition and the proof are quite abstract. To make this more
concrete we will consider two examples of rings which are not Bézout domains
but can be shown to be Prüfer domains using the method just described. The
first example is an extension of the integers and the second is an algebraic curve.
√
5.5.1 Z[ −5]
√
This is the set where all elements are of the type a + b −5 where a, b ∈ Z.
This ring is an example of an quadratic integer ring. These has been studied by
number theorists for a long time, since quadratic integers are related to many
important problems in number theory, for example Fermat’s last theorem.
Addition and multiplication can be defined as
√ √ √
(a + b −5) + (c + d −5) = (a + c) + (b + d) −5
√ √ √
(a + b −5)(c + d −5) = (ac − 5bd) + (ad + bc) −5
It is easy to verify that this forms a ring. To see that it is not a Bézout
domain we need to find a finitely generated ideal that is not principal.
28
√ √
Proposition 5.13. The ideal generated by 2, 1 + −5 in Z[ −5] is not prin-
cipal.
√
Proof. Assume that it is generated by a single element, that is hxi = 2, 1 + −5 .
√ √ √
Let
√ x = a+b √ −5 and y = a−b −5 such that xy divide both 4 and (1+ −5)(1−
−5) = 1 − ( −5)2 = 6. Thus xy|2, but xy = a2 + 5b2 = 2 is impossible. This
means that xy
= 1 and√ thus
x = 1 or x = −1.
√
But h1i =
6 2, 1 + −5 which means that 2, 1 + −5 cannot be generated
by a single element.
√
The proof that Z[ −5] is a Prüfer domain follow proposition 5.12. The
reason that the proof is so verbose is that this hopefully will clarify the proof
of proposition 5.12.
√
Proposition 5.14. Z[ −5] is a Prüfer domain.
Proof. Given x and y the goal is to compute u, v, w such that
(
ux = vy
(1 − u)y = wx
29
So we can find m0 , m1 , m2 , m3 such that
m0 a0 + m1 a0 s + m2 (a0 s + a1 ) + m3 (a0 s + a1 )s = 1
This give
u
= m0 a0 + m2 (a0 s + a1 )
v = m0 a0 s + m2 (a0 s + a1 )s
w = m1 a0 + m3 (a0 s + a1 )
√
Note on implementation. Z[ −5] can be represented in Haskell√as a pair
where the first element correspond to a and the second to b in a + b −5. The
proof that the ring is a Prüfer domain follow proposition 5.14 and is straight
forward to implement now that most of the details has been worked out.
One important thing to keep in mind is that s lies in the field of fractions and
thus the type of s is different from the type of, for instance, a0 . So to perform
the computations some conversions has to be made. First, elements has to be
embedded into the field of fractions. Then, elements has to be extracted and
the extraction should only be possible if the divisor is 1. But since the √ proof
tells us that all of a0 s, a0 s + a1 , (a0 s + a1 )s lie in the integral closure of Z[ −5]
this is not a problem.
Again the proof that this is a Prüfer domain follow proposition 5.12.
Proposition 5.15. k[x, y] with y 2 = 1 − x4 is a Prüfer domain.
Proof. Let a, b, c, d be nonzero elements of k[x]. Start with
√
a + b 1 − x4
s = √
c + d 1 − x4
√ √
(a + b 1 − x4 )(c − d 1 − x4 )
=
c2 − d2 (1 − x4 )
√
ac − bd(1 − x4 ) + (bc − ad) 1 − x4
=
c2 − d2 (1 − x4 )
√
Now s can be written on the form s = p + q 1 − x4 where p, q ∈ k(x).
30
This can be written in the form a0 s2 + a1 s + a2 = 0 where a0 , a1 , a2 ∈ k(x)
and ha0 , a1 , a2 i = h1i. By exactly the same reasoning as above we get
u = m0 a0 + m2 (a0 s + a1 )
v = m0 a0 s + m2 (a0 s + a1 )s
w = m1 a0 + m3 (a0 s + a1 )
31
The next chapter will study yet another class of rings which has many differ-
ent applications, these are polynomial rings. There have been a small taste of
special polynomial rings in this chapter and the next chapter will consider them
in general. Traditionally Dedekind domains has been of great interest in number
theory while polynomial rings has been of interest in algebraic geometry.
32
Chapter 6
Polynomial rings
where α1 , . . . , αn ∈ N.
This can be simplified by just looking at α = (α1 , . . . , αn ) and letting xα =
xα
1
1
· . . . · xα
n . The total degree of a monomial α is |α| = α1 + . . . + αn .
n
33
Definition 6.4. Graded lexicographical order : α >grlex β if
Here the total degree of the monomials first decide which is the greatest and
lexicographical ordering is used to break ties. The following ordering is a bit
less intuitive, but can be more efficient when doing computations.
Definition 6.5. Graded reverse lexicographical order : α >grevlex β if
tal degree of a polynomial is the monomial with maximum total degree with
nonzero coefficient, for example deg(f ) = 5. It is possible to prove that addi-
tion and multiplication of polynomials can be defined in a way which satisfy the
properties of commutative rings. Next some terminology.
Definition 6.7. Let f = α aα xα be a polynomial in k[x1 , . . . , xn ] and let >
P
be a monomial order. Then
1. The multidegree of f (with respect to >) is
multideg(f ) = max(α ∈ Nn : aα 6= 0)
LC(f ) = amultideg(f )
34
3. The leading monomial of f is
LM (f ) = xmultideg(f )
LT (f ) = LC(f ) · LM (f )
multideg(f ) = (3, 2, 0)
LC(f ) = 3
LM (f ) = x3 y 2
LT (f ) = 3x3 y 2
f = q1 f 1 + · · · + qn f n + r
x2 = (x − y)(x + y) + 0 · x + y 2
x2 = x · x + 0 · (x + y) + 0
35
6.3 Properties of ideals in k[x1 , . . . , xn ]
In section 4.2 it is proved that all ideals in Euclidean domains are principal and
this especially hold for k[x]. But this does not hold for k[x1 , . . . , xn ] if n ≥ 2.
Consider for example the ideal generated by hx, yi in k[x, y]. If it were to
be generated by a single element then this element would have to divide both x
and y. But then it must be a nonzero constant and the ideal contain no other
constant than zero. Thus it is not possible for the ideal to be generated by a
single element.
From here on this section deviates from [7] and is instead based on [15]. The
reason for this is that [7] builds the theory leading up to the Hilbert basis theo-
rem and the theory of Gröbner bases on a nonconstructive version of Dickson’s
lemma.
Definition 6.9. A poset (E, ≤) is said to satisfy the ascending chain condition
(ACC) if for every non decreasing sequence (un )n∈N in E there exists n ∈ N
such that un = un+1 .
This definition is to be read constructively. This means that there exist an
effective method for computing n. Section 3.1 in [15] contains a motivation
why it is so important that ACC is read and motivated constructively and not
classically.
The versions of Dickson’s lemma and the Hilbert basis theorem in [7] relies
on a classical interpretation of ACC and are thus not valid constructively.
Theorem 6.10. (Constructive) Dickson’s lemma: The poset finitely generated
monomial ideals in k[x1 , . . . , xn ], ordered with ⊆, satisfies ACC.
This can then be used to prove the termination of the Buchberger algorithm
for computing Gröbner bases. Another important application of this is in the
proof of the Hilbert basis theorem.
Definition 6.12. Let I ⊂ k[x1 , . . . , xn ] be an ideal other than {0}. Then LT (I)
is the set of leading terms of elements
36
Definition 6.13. A Gröbner basis of an ideal I ⊆ k[x1 , . . . , xn ] is a list of
generators g1 , . . . , gm of the ideal such that for all f ∈ I the division of f by
g1 , . . . , gm leads to a zero remainder.
Note that the S-polynomials is constructed in a way such that leading terms
should be cancelled. This will be crucial to the algorithm for computing Gröbner
bases. This algorithm is the famous Buchberger algorithm.
Theorem 6.15. Let I = hf1 , . . . , fs i be a nonzero polynomial ideal. Then
a Gröbner basis for I can be constructed in a finite number of steps by the
following algorithm:
Input: I = (f1,...,fs)
Output: A Gröbner basis G = (g1,...,gt) for I
G := I
REPEAT
G’ := G
FOR each pair (p,q), p 6= q in G’ DO
S := remainder (S_poly(p,q)) G’
IF S 6= 0 THEN G := G ∪ {S}
UNTIL G = G’
Lemma 6.16. Let G be a Gröbner basis for the polynomial ideal I. Let p ∈ G
be a polynomial such that LT (p) ∈ hLT (G − {p})i. Then G − {p} is also a
Gröbner basis for I.
Using this it is possible to define what a minimal Gröbner basis is.
37
Definition 6.17. A minimal Gröbner basis for a polynomial ideal I is a Gröbner
basis such that
∀p ∈ G. (LC(p) = 1 ∧ LT (p) ∈
/ hLT (G − {p})i)
By multiplying with constant terms all leading coefficients can be made 1
and by applying lemma 6.16 a minimal Gröbner basis can be constructed.
Now consider an example, we saw earlier that division of x² by [x + y, x]
in k[x, y] give different results depending on the order, so [x + y, x] does not
form a Gröbner basis. Using the algorithm above together with the method for
computing minimal Gröbner bases we get the generators [x, y] as a Gröbner
basis for the ideal. It is clear that x2 divided by [x, y] will not depend on the
order of the divisors.
Note on implementation. In Haskell this is quite straight forward to imple-
ment. But in type theory it would require more effort since all of the proofs
would have to be formalized. This has been done using a combination of Agda
and Coq in [17].
Another thing worth emphasizing is that the algorithm presented is not
optimized in any way, so it will be unrealistic to use it on larger examples.
A lot of effort has been put into optimizing the Buchberger algorithm. One
approach to optimize the algorithm is not to try all pairs of polynomials but try
to find the ”best” pairs, for more details see [13]. Some of the optimizations has
been implemented in Haskell in the HaskellForMaths library by David Amos
mentioned in the section on previous work.
38
Note on implementation. In order to be able to test that the generated ideal
is in fact the intersection witnesses has to be computed.
In order to modify the algorithm to compute these some bookkeeping needs
to be done. At each time an element is added to the basis the algorithm would
have to store the witness that this can be written using the elements of the
initial ideal.
f = w 1 h 1 + · · · + w m hm
f = q1 g 1 + · · · + ql g l
We also have a witness that hh1 , . . . , hm i ⊇ hg1 , . . . , gl i which consists of
a11 , . . . , a1m , . . . , al1 , . . . , alm such that
g1 = a11 h1 + · · · + a1m hm
..
.
gm = al1 h1 + · · · + alm hm
f = q1 (a11 h1 + · · · + a1m hm ) +
..
.
ql (al1 h1 + · · · + alm hm )
= h1 (q1 a11 + · · · + ql al1 ) +
..
.
hm (q1 a1m + · · · + ql alm )
39
The witnesses that f ∈ hh1 , . . . , hm i are
w1 = q1 a11 + · · · + ql al1
..
.
wm = q1 a1m + · · · + ql alm
40
Chapter 7
Conclusions
The aim of this chapter is to tie together all the previous chapters by looking at
the result of the implementation and showing some examples of computations
using it. The results are discussed and finally further work and limitations of
the implementation are considered.
7.1 Implementation
The definitions and proofs in this thesis have been implemented in Haskell,
the implementation can be found at http://hackage.haskell.org/package/
constructive-algebra. This section will give a short overview of what can
be done with this implementation and motivate some of the design choices.
The algorithms has been implemented in the form of a library. One point of
implementing it as a library is that a user easily can extend it by adding new
algorithms and examples of rings.
The library is organized in three sections presented here with the most gen-
eral parts first. The most general part is the level of all algebraic structures
represented as type classes with QuickCheck properties to specify them. The
general proofs or algorithms that hold for the different structures are also rep-
resented at this level. For example are coherent rings together with the proof
that coherence implies that it is possible to solve systems of linear equations are
represented at this level.
Next there is a part which contain general notions that are neither structures
nor instances of the structures. Examples include ideals and the construction
of fields of fractions.
Finally there is the most concrete part which are concrete instances √ of the
structures. The rings that has been implemented are Z, Zn , Z[ −5], Q, k[x],
k(x), k[x, y] with y 2 = 1 − x4 and k[x1 , . . . , xn ]. All of these has been tested to
verify the different QuickCheck properties for the structures that they imple-
ment. This give some assurance that the implementation is in fact correct.
Both Q and k(x) has been implemented using the representation of fields
of fractions. Using this the implementation become more or less trivial. For
example the representation of Q looks like
type Q = FieldOfFractions Z
41
This relies on that Z is an instance the GCD domain type class. This is no
problem since Z is just a type synonym for the built-in arbitrary size integers of
Haskell. The implementation of fields of fractions then take care of all instance
declarations necessary for making it a field. It also implements equality and
pretty printing functionality for the structure, given that the underlying ring is
discrete and is an instance of the Show class. This illustrates the power of the
Haskell type class system very well. It is easy to write general code which leads
to modularity.
The hierarchy of algebraic structures is presented in figure 7.1.
42
> toPrincipal (Id [2,3])
(<1>,[-1,1],[2,3])
−1 · 4 + 1 · 6 = 2
2·2 = 4
2·3 = 6
This give that Bézout domains are coherent and that it is possible to solve sys-
tems of equation in them.
Finally Bézout domains are also strongly discrete, so it is possible to test ideal
membership in them.
43
√ √
The intersection of ideals can also be computed. First h2i∩ 1 − −5 in Z[ −5]
and then hxi ∩ h1 − yi in Q[x, y] with y 2 = 1 − x4 are computed.
44
The algorithm find four generators for the solutions, including the trivial one.
The first one of these is
t1 = x2 y + x − 2y 2
t2 = −x3 + 2xy
t3 = 0
7.2 Discussion
The process of converting constructive proofs into computer programs is diffi-
cult. The reason is that many things are left out in the mathematical arguments.
For example are the computation of witnesses often taken for granted and not
considered at all, but it is often not completely trivial to compute them. This
is the case when computing the intersection in polynomial rings, here the Buch-
berger algorithm has to be modified in a nontrivial manner.
The mathematical arguments also often rely on notions where the computa-
tional content is implicit. One example is the proof of proposition 5.12. Most
proofs of this that I have seen are quite abstract and the steps to compute
u, v, w in the definition of Prüfer domains are left out. Thus some effort has to
be put into finding the computational content of the proofs even if the proofs
are constructive. Note that this is not the case for all proofs, for example are the
proofs that principal localization matrices are computable for Bézout domains
and Prüfer domains presented in a form that is easy to convert into programs.
The difficulty of converting proofs is the reason that an implementation of
the library in type theory would be good. All of the programs would then
have to be proved correct and not just randomly tested. This would give an
implementation that is proved correct for doing generalized linear algebra.
I am very satisfied with the choice of implementing the library in Haskell.
Two of the main advantages of Haskell are polymorphism and type classes. If
this would have been done in a language without polymorphism every algorithm
would have to be implemented for each specific instance. But using Haskell one
implementation is sufficient for all instances that implement the correct type
classes.
The type class system also make the implementation elegant. The types of
the programs capture the main aspects of the propositions. Just by looking at
a type it is clear to what kind of structure the algorithm is applicable. Haskell
is also quite compact in terms of the amount of code that need to be written,
so the programs quite literally follow the mathematical proofs which make the
implementation look appealing and easy to debug.
A traditional argument against Haskell is that it can be slow and that it is
hard to reason about the complexity of programs due to laziness. This is not
entirely true today. The GHC compiler does a very good work in optimizing
programs, so the speed is not much of an issue. A possibility to make the
implementation faster would be to use Haskell as a host language and then
convert the programs into a more optimized mathematical language specialized
in doing fast matrix computations.
The choice to use QuickCheck as the method to specify and test properties
of rings proved useful. It works very well with random testing most of the time,
45
but sometimes the computations can get too heavy. This is the case for poly-
nomial rings where the computation of Gröbner bases is very computationally
expensive. Thus some heuristics are needed in order to reduce the space of test
cases. Heuristics used in the project is to only use ideals of limited length and
only have polynomials with multidegree less than some value.
The most important aspects when it comes to implementing mathemati-
cal programs are in my opinion expressability and compactness. The program
should resemble the mathematical proofs as close as possible so that it is easy to
read and understand. With respect to this, Haskell makes a very good language
for developing mathematical programs.
46
Bibliography
[5] Thierry Coquand, Henri Lombardi, and Claude Quitte. Generating non-
Noetherian modules constructively. Manuscripta Mathematica, 115(4):513–
520, 2004.
[6] Thierry Coquand, Henri Lombardi, and Claude Quitté. Curves and coher-
ent Prüfer rings. 2009.
[7] David Cox, John Little, and Donal O’Shea. Ideals, Varieties and Algo-
rithms: An introduction to Computational Algebraic Geometry and Com-
mutative Algebra. Springer, 2006.
[8] L. Ducos, H. Lombardi, C. Quitté, and M. Salou. Théorie algorithmique des
anneaux arithmétiques, des anneaux de Prüfer et des anneaux de Dedekind.
Journal of Algebra, 281(2):604 – 650, 2004.
[9] John R. Durbin. Modern Algebra: An Introduction. Wiley, 2004.
[10] László Fuchs and Luigi Salce. Modules ofer Non-Noetherian Domains, vol-
ume 84 of Mathematical Surveys and Monographs. American Mathematical
Society, 2001.
[11] François Garillot, Georges Gonthier, Assia Mahboubi, and Laurence
Rideau. Packaging Mathematical Structures. In TPHOLs ’09: Proceed-
ings of the 22nd International Conference on Theorem Proving in Higher
Order Logics, pages 327–342, Berlin, Heidelberg, 2009. Springer-Verlag.
[12] Herman Geuvers, Randy Pollack, Freek Wiedijk, and Jan Zwanenburg. A
Constructive Algebraic Hierarchy in Coq. Journal of Symbolic Computa-
tion, 34(4):271 – 286, 2002.
47
[13] Alessandro Giovini, Teo Mora, Gianfranco Niesi, Lorenzo Robbiano, and
Carlo Traverso. "One sugar cube, please" or Selection strategies in the
Buchberger algorithm. In Proceedings of the ISSAC’91, ACM Press, pages
49–54, 1991.
[14] Georges Gonthier. Formal Proof – The Four-Color Theorem. Notices of
the American Mathematical Society, 55(11), 2008.
[15] Henri Lombardi and Hervé Perdry. The Buchberger Algorithm as a Tool
for Ideal Theory of Polynomial Rings in Constructive Mathematics. 1998.
[16] Ray Mines, Fred Richman, and Wim Ruitenburg. A Course in Constructive
Algebra. Springer-Verlag, 1988.
[17] Henrik Persson. An Integrated Development of Buchberger’s Algorithm in
Coq. 2001.
[18] Maïmouna Salou Idi Malam. Théorie Algorithmique des Anneaux Arith-
métiques, des Anneaux de Prüfer et des Anneaux de Dedekind. PhD thesis,
2002.
[19] A.S. Troelstra and D. van Dalen. Constructivism in Mathematics. North-
Holland, 1988. 2 volumes.
48