Formal Methods for High-Assurance Software Engineering