Many books focus on increasing the quality of software through the use of formal methods. However, most books embrace one particular method, and present it as the suggested solution for the software reliability problem. This book presents a wider picture of formal methods, through a collection of notations and techniques. It compares them, and discusses their advantages and disadvantages. One of the main challenges of formal methods is in transferring the tech nology developed by researchers to the software development community. Re cently, we seem to be starting to have a better understanding of the important ingredients of formal methods tools. This manifests itself in the growing ac ceptance of such tools in the software and hardware development industry. Ideally, formal methods need to be intuitive to use (preferably using graphi cal interfaces), do not impose on the user an extensive learning period, and incur only small overhead to the development process. Formal methods are much more acceptable today than ten or twenty years ago, in particular in the hardware industry. Yet there is still a lively contention between different approaches.