In analysis and transformation specifications use rules that are conjunctions of binary predicates (sections 3.1 - 3.7). This is the style of [CGT89b]. Each predicate is binary and must correspond to an edge of a graph of the data model. The data model specification tells how these graphs, i.e. the predicates, are represented. provides graph representation transparency (functor transparency): it is transparent from a predicate specification how a corresponding graph is represented, this is only expressed by the type of the object field in the data model.
Types of graphs and sets are expressed by functor calls on object types. Functors are template classes, which are instantiated by one or several object types in order to specify a concrete graph or set. The given predicate name of the specification is used to find the object field in the data model, and with that the functor call. The code to traverse the concrete graphs is generated according to the functor call. A change of the type of a graph or set field, i.e. a change of a functor call changes the generated code, while the rewrite specification stays the same.
If graphs are implemented with these functors, you can test whether certain edges exist, and add or delete edges from them. also understands simple pointer fields. You are allowed to navigate via them by writing down their field name as predicate.