Source: https://web.mit.edu/16.35/www/lecturenotes/FormalMethods.pdf