This book provides an introduction to formal methods based on temporal logic, describing techniques for testing and developing complex computational systems. It starts with a full introduction to the subject and then goes into more detail, covering the basics of temporal logics in order to give the reader a firm basis on which to progress further.