Programming Logics: An Introduction to Verification and Semantics