Source: http://cristal.inria.fr/~simonet/teaching/caml-prepa/tp-caml-2001-02.pdf