Formal methods involve mathematically-based techniques for specifying, developing, and verifying software and hardware systems. They use formal languages and logic to create unambiguous and precise descriptions that can be analyzed for consistency and correctness. Formal methods can be applied at different levels of rigor, from using some mathematical notation in English specifications to fully formal machine-checked proofs. While useful for complex, safety-critical systems, formal methods need not be applied to every component or phase of development in order to provide benefits like error detection.