Source: https://www-sop.inria.fr/members/Frederic.Giroire/teaching/system/tp3.corr.pdf