As mentioned above, previous attempts at using event-based abstraction in debugging have been limited by the complexity of the modeling language. Ariadne's language is quite simple. It employs a three level description of communication patterns in terms of chains, p-chains, and pt-chains.
Each hierarchical level translates to a level in the tree. So all the internal nodes of the tree correspond to some abstract event as defined by the user. The leaf nodes of the match tree are the primitive events that are consumed by the match. The level containing the children of the root contains the set of events that constitute the pt-chain that was matched. The primitive events are removed from the trace and are unavailable for further matching unless explicitly restored, although the user retains the capability to superimpose other patterns on the same set of primitive events.
These three definitional levels appear to form a natural mechanism for describing parallel systems, as evidenced by their use in other contexts such as the XYZ levels of Phase Abstractions [24] and the LaRCS specification language [22]. The matching algorithm for our language is straightforward: a pt-chain is recognized by a finite state machine that invokes copies of other finite state machines to recognize chains on specific processes. This matching can be done efficiently, avoiding the costliness of pattern matching approaches [3,13] and the expensive implementations of previous languages [16]. At the same time, our matching algorithm can provide precise information on the reasons for a match failure.