The main objective of this chapter, and of the next one, is to make precise part of the notation that we intend to use in order to specify and design software systems. As a matter of fact, this notation is nothing but the one used, more or less formally, by every scientist: that of set theory.
Clearly, in order to perform our subsequent formal developments, we could have stayed within some extensions of the logic introduced in the previous chapter. For the following three reasons it is my view that set theory is a better choice.
First, when using set theory, one remains within first order logic while it is clearly possible to manipulate objects of “high order” such as sets and relations of any depth (that is, sets and relations built themselves on sets and relations, and so on). In any case, such constructs are objects (not predicates) and are thus licit candidates for first order quantifications.
Second, and more importantly, the use of set theory allows one, very often, to eliminate quantifiers. In fact, most of the set-theoretic concepts are introduced precisely because they hide some quantifications. Typical examples are: set inclusion, relational composition, and generalized intersection or union of sets of sets.
Third, set theory has the (apparently innocent but, in fact, very important) property of handling negation in a very controlled way: it is simply because the complement of a set is still a set. That is, negation does not extend beyond certain limits.