An Introduction to Proving the Correctness of Programs | Synapse