Source: https://www.cs.cmu.edu/~crary/819-f09/Hoare69.pdf