The mathematical techniques used include denotational semantics, axiomatic semantics, operational semantics, and abstract interpretation. The theory of CSP includes mutually consistent denotational semantics, algebraic semantics, and operational semantics. In this sense, predicate transformer semantics are a kind of denotational semantics. Also the mathematical structure of operational semantics and denotational semantics can become very close. It is often considered important to connect denotational semantics with operational semantics. It is a mixture of denotational, operational and algebraic semantics. A basic denotational semantics in domain theory is compositional because it is given as follows. In fact, this is a general scheme for compositional denotational semantics. Both the operational and denotational semantics have been implemented (classically) in Haskell. The technical difference is in the denotational semantics of expressions containing failing or divergent computations. Selinger gives a denotational semantics for these languages in a category of superoperators. This work also formed the basis for the denotational semantics of programming languages. A recent research area has involved denotational semantics for object and class based programming languages. Such spaces naturally occur in computer science, specifically in denotational semantics. The following properties of a denotational semantics are often of interest.