The verification of complex systems--which may be concurrent and may not terminate--is very important and usually very difficult. This paper describes a technique for verifying certain concurrent programs by using the established method of symbolic execution to verify each task independently and then checking that the tasks cooperate satisfactorily. Any approach that allows such problems to be broken down into a set of simpler, and more easily tackled, subproblems is to be welcomed.
The presentation is informal; a fuller, general description of the “isolation” approach is consigned to another paper, as yet unpublished. Two examples are worked through in detail. The language used in the examples is a limited subset of Ada, but any simple language with synchronous deterministic communication would do. Indeed, use of a language with a larger set of mathematical operators would be easier to follow and avoid typographical inconsistencies.
The specifications are given in terms of auxiliary variables, which are declared locally but needed globally to state the system invariant. Moreover, the “specifications” are derived from the program, so this approach is not really verification; it is a way of investigating whether system designs behave “safely.” As such, it makes a useful contribution to the study of distributed systems.
The work is ongoing. I hope it will be linked to results from other researchers whose work is based on temporal logic.