Theories of Programming and Formal Methods