Designing basic protocols, used in networking, security and multiprocessor systems is hard. All of these have to deal with concurrency, that is the actions of multiple agents in parallel. This makes their design error-prone since all possible interactions between the various agents in the system have to be considered.

In addition to concurrency, many of these protocols are designed to work with any number of replicated agents. For instance, protocols that set up routing tables in a network are designed to work irrespective of the number of nodes present. Similarly in cache coherence protocols there may be any number of client caches present.

Model checking, a method of enumerating and checking all states of a system, can be used to prove properties of concurrent protocols that are finite state. It can also be applied to finite instances of parameterized protocols and makes an excellent tool for finding bugs. However, in the general case, the system is not finite state, and so model checking can not be used to prove correctness.

For such systems, interactive theorem proving has been used to prove correctness. Theorem proving is extremely powerful since the entire arsenal of mathematical techniques are at one's disposal. However applying it requires a skilled user. For large examples, it can also be tedious.

Here new predicate abstraction techniques are described that allow for easy, and in many cases automatic, verification of safety properties of infinite state systems. A finite set of abstraction predicates defined on the concrete system are used to create a conservative finite state abstraction. The reachable state set of the conservative abstraction, is by definition, a superset of the reachable state set of the original system. The abstract version of the verification condition, a safety property, is model checked on the abstract system. If successful the verification condition holds in the original system. Otherwise more analysis is carried out to figure out if there is a real bug in the system or if the abstraction needs to made more precise by adding extra predicates.