Hello,

I just noticed that the Haskell Report leaves "gcd 0 0" undefined.  Why is
that?  I think the gcd of 0 and N should be |N|, the absolute value of N.
Haskell currently does just that, except when N=0: the result of "gcd 0 0"
is undefined instead of 0.  I propose to remedy this, but let me first give
some mathematical details.

The definition for 'p divides q' is

   p|q == (EX n. n is integer /\ n*p=q)

(All variables are integers by default.)  We immediately have  p|0 , and a
basic property is

   (ALL m. m|a == m|b) == |a|=|b|

where  |a|  stands for the absolute value of  a .  Now gcd can be defined by

   (a gcd b = c) == c>=0 /\ (ALL m. m|a /\ m|b == m|c)

and it can be proven that this defines  a gcd b  uniquely for every  a  and
b .  Substituting  b=0  gives

     a gcd 0 = c
   ==  "definition of gcd"
     c>=0 /\ (ALL m. m|a /\ m|0 == m|c)
   ==  "m|0 for every m, see above"
     c>=0 /\ (ALL m. m|a == m|c)
   ==  "property of 'divides', see above"
     c>=0 /\ |a|=|c|
   ==  "arithmetic"
     |a|=c

so that  a gcd 0 = |a|  for every  a .

Actually, the above can be generalized to rational numbers, by assuming all
variables are rational by default.  We can even generalize to reals, but
then the existence of  a gcd b  is not guaranteed anymore; take a=1 and
b=sqrt(2).  If it exists, it is still unique, however.  In all these cases,
the well-known algorithm used in the Haskell Report can be used to compute
the gcd; if it doesn't exist, this algorithm simply does not terminate.

To make a long story short, I propose to remove the special case "gcd 0 0 =
undefined"  from the Haskell Prelude, thereby making "gcd 0 0 = 0".  Also, I
propose to make gcd applicable to rational numbers.

Groetjes,

 <><

Marnix
--
Marnix Klooster
[EMAIL PROTECTED]




Reply via email to