Source: https://se.inf.ethz.ch/~meyer/publications/old/dbc_chapter.pdf