If at least one attribute is defined simultaneously, then the enumeration can be anonymous. Otherwise, these are the same as attributes defined outside a class. Identifiers should belong to the domain of the variable that occurs at their location in the state vector. The constraints in the statement block must hold in order for the transition or failure to be possible. Transitions have an additional argument that represents the cost of that transition.
Failures have an additional argument that represents the probability of that failure occurring.
They are essentially processed as macros, although they have some scope. For example, a relation in a class can refer to attributes of that class at the location of the relation invocation. Relations are invoked from instances of the class of which they are a part. Although constraints may sometimes look like executable code, they are not. The compiler converts these constraints into clauses for the engine.