Le fichier pgcd.ml donne une solution, dont est extraite la fonction pgcd suivante :
let rec pgcd u v =
  if v = 0 then
    u
  else
    pgcd v (u mod v)
;;
C'est simplissime et suit directement l'énoncé. Il y a quand même une vague astuce sur la condition d'arrêt.

Du point de vue du langage, on remarque que les fonctions ne sont pas récursives par défaut : il faut introduire une fonction récursive par let rec.

On remarque aussi que Caml favorise l'écriture à l'aide de fonctions récursives (ici terminales, le résultat est donné par un appel récursif) par rapport aux boucles. Comparons avec un codage plus traditionnel à l'aide d'une boucle while.
let pgcd u v =
  let ur = ref u and vr = ref v in
  while
 !vr <> 0 do
    let
 x = !vr in
    vr := !ur mod !vr ;
    ur := x
  done ;
  !ur
;;
C'est moche, pour le meilleur comme pour le pire, Caml n'est pas fait pour écrire des boucles. Qu'on se le dise !