This document discusses formal methods in software engineering. It defines formal methods as techniques based on mathematical representation and analysis to produce consistent, complete and correct software specifications. Some key topics covered include formal specification languages, pre and post conditions, formal verification, advantages of formal specification in reducing errors and rework. It also discusses challenges in adopting formal methods like difficulty in scaling to large systems and fitting all problem domains. Examples are provided to illustrate specification of functions using logic symbols and assertions.