Automated Model Transformations Based on STRIPS Planning 1 2 3 Old°ich Nouza , Vojt¥ch Merunka , and Miroslav Virius 1 Czech Technical University in Prague, Faculty of Nuclear Sciences and Physical Engineering, Department of Software Engineering in Economy, nouza@fj.cvut.cz 2 Czech University of Life Sciences Prague, Faculty of Economics and Management, Department of Information Engineering, merunka@pef.czu.cz 3 Czech Technical University in Prague, Faculty of Nuclear Sciences and Physical Engineering, Department of Software Engineering in Economy, virius@fj.cvut.cz Abstract. This paper deals with application of STRIPS planning in automated model transformations. Object oriented model is viewed as a state space containing possible models as states and elementary transfor- mations as state transitions. A source model is represented by an initial state, a target model by a goal state. Automation of model transforma- tion consists in nding a plan to reach a goal state in this state space. Key words: automated model transformations, modeling, object ori- ented approach, refactoring, SBAT, STRIPS planning 1 Introduction Transformations play a key role in software engineering. Although there exist satisable solutions of automated transformations of models to text, the same cannot be said about transformations of models to models. This area is still in phase of research and exploring of possibilities [1]. According to the approaches of present implemented in several CASE tools, every model transformation requires application of the corresponding transfor- mation rule with suitable parameters [3, 4, 6, 13] Unfortunately, as mentioned in [4], this approach has one big disadvantage, which is a low reusability. For every transformation that has no rule dened, it is necessary to either apply a composition of other rules, or dene a new transformation rule. In this paper, we introduce transformation engine named SBAT (STRIPS Based Transformation Engine) that does not require such steps. 2 Model Transformations There are several ways how to dene model transformation. In this paper, we introduce the denition presented in [5] and cited by [8]: J. Barjis, M.M. Narasipuram, G. Rabadi, J. Ralyté, and P. Plebani (Eds.): CAiSE 2010 Workshop EOMAS’10, Hammamet, Tunisia, pp. 1-13, 2010. 2 Old°ich Nouza, Vojt¥ch Merunka, and Miroslav Virius A transformation is the automatic generation of a target model from a source model, according to a transformation denition. A transformation denition is a set of transformation rules that together describe how a model in the source language can be transformed into a model in the target language. A transformation rule is a description of how one or more constructs in the source language can be transformed into one or more constructs in the target language. 2.1 Classication of Transformations Publication [8] describes two criteria of classication of model transformations. The rst one is a dierence of abstraction level of source and target models: Horizontal transformation  A transformation where source and target models have the same level of abstraction. A typical example is refactoring. Vertical transformation  A transformation where source and target models have a dierent level of abstraction. A typical example is renement. The second classication criteria is a dierence of modeling languages in which the source and targets models are expressed: Endogenous transformation  A transformation where source and target models are expressed in the same language. Typical examples are refactoring and normalization. Exogenous transformation  A transformation where source and target models are expressed in dierent languages. Typical examples are code generation and reverse engineering. In this paper, we focus more closely on refactoring. 3 Refactoring There exist several ways how to dene refactoring. The denition presented in [7] says that refactoring is an improvement of software system without changing its behavior. In other words, for the same input, the refactored software must return the same output as the original software. Detail information on refactoring is available in [2]. 3.1 Complex Refactorings and Primitive Refactorings The idea of complex refactoring as composition of nite primitive (atomic) refac- torings was rst published in [10], where formal denition of C++ code refactor- ing was discussed, and later in [12], where it was demonstrated on refactoring of UML models. We have used the same idea to construct the SBAT transformation engine. Automated Model Transformations Based on STRIPS Planning 3 4 STRIPS Planning Technical report [9] denes STRIPS as following: STRIPS (STanford Research Institute Problem Solver) belongs to the class of problem solvers that search a space of world models to nd one in which a given goal is achieved. For any world model, we assume there exists a set of applicable operators each of which transforms the world model to some other world model. The task of the problem solver is to nd some composition of operators that transforms a given initial world model into one that satises some particular goal condition. The STRIPS language is based on the calculus of rst-order predicate logic. Formally, the STRIPS problem can be expressed by the following denitions: Denition 1. STRIPS problem is an ordered triple (I, O, G), where I is an initial state, O is a set of operators, and G is a goal state condition. Denition 2. Operator o (x̄) is dened as an ordered triple(P, A, D), whereP = (x̄) is an application condition, A = [A1 (x̄) , . . . , Al (x̄)] is a set of formulas which become true after operator application, D = [D1 (x̄) , . . . Dm (x̄)] is a set of formulas which become false after operator application, x̄ = (x1 , . . . xn ) are + 0 free variables contained in formulas P, A1 , . . . , Al , D1 , . . . Dm , n ∈ N , l, m ∈ N . Elements of A are called add-eects, elements of D delete-eects. Denition 3. Let o (x1 , . . . , xn ) = (P, A, D) ∈ O be operator. A transition func- 0 tion o : (x1 × x2 × . . . × xn × S) → S , where S is a state set, is dened in the following way: def (s ∪ A) − D ∅ o' (x1 , . . . , xn , s) = (1) sP A goal is to nd such list of operators applications, which cause transition for initial state to the state satisfying the goal state condition. More formally: Denition 4. State sm is a solution of problem  (I, O, G), if there exists a list of operators applications o1 h1 , . . . , om hm , where hi are vectors of constants, m ∈ N, and: 1. s0 = I 0  2. (∀i ∈ m̂) si = oi−1 hi−1 , si−1 3. sm  G If I  G, then the solution, which is I in this case, is called trivial solution. 4 Old°ich Nouza, Vojt¥ch Merunka, and Miroslav Virius 5 SBAT Transformation Engine 5.1 Requirements Resulting from the facts on present state model transformation discussed in the introduction of this paper, we have decided to design a new transformation engine fullling the following requirements: 1. The engine will support model transformations such as refactoring. 2. The input of transformation process will be the source model and conditions of a target model. 3. The output of transformation process will be a target model, or information that the source model cannot be transformed to any model fullling the input conditions. 4. The source model and the target model will be consistent in light of behavior of modeled system. 5. The transformation process will be fully automatized, without need to spec- ify transformation rules on input. 6. The engine will be universal and suciently reusable for wide scale of object models. 5.2 Formal Denition of Object Model In this paper, formal denition of object model is based on simplied metamodel of UML 2.0 class diagrams, in detail described in [11]. Because of intended gen- erality, we do not focus on implementation details, such as method parameters and bodies, access mode of class members, etc. 5.2.1 Model as State Space For our purposes we use the primitive refactor- ing composition mentioned earlier. For this reason, we dene model as a state space, where state set represents model in all possible states and state transitions represent primitive refactorings. Denition 5. Let C be a class universe, A attribute universe, and F method universe. LetObject, Client ∈ C be classes, where ∀ (x ∈ C − [Object]) (Object ≺ c), which means that Object is parent of all other classes and Client represent a client class, whose object sends messages to objects of classes in model. Let be empty value. Model state s is an ordered 5-tuple (Cs , ins , supers , types , sends ), where  Cs ⊂ C − [Object, Client] is a nite set of classes of model in state s,  ins ⊆ ((A ∪ F ) × Cs ) is a binary relation named is in class dened as def ins = {(x, y) |x ∈ (Attr (y) ∪ M eth (y)) ∧ y ∈ Cs } , (2) where Attr (y) and M eth (y) are sets of attributes and methods respectively of class y , Automated Model Transformations Based on STRIPS Planning 5  supers ⊆ ((Cs ∪ [Object]) × Cs ) is a binary relation is superclass dened as def supers = {(x, y) |x = super (y) ∧ x, y ∈ Cs } , (3) where super (y) means a superclass of y ,  types ⊆ (A × Cs ) ∪ (F × (Cs )) is a binary relation named is of type dened as def types = {(x, y) |x = type (y) ∧ y ∈ Cs } , (4) where type (y) means a type of y ,  sends ⊆ (F × (Cs ∪ [Client]) × (A ∪ F ) × Cs ) is a 4-ary relation named sends message dened as def sends = {(x, y, u, v) |(x, y) ∈ ins ∧ (∃w) ((u, w) ∈ ins ∧ (u ≺ w ∨ u = w)) (5) ∧ hx, Λi ∈ M eth (y)} , where lambda-expression Λ contains message sending o C u, where o is an instance of class w . The following conditions must be fullled:  in the class hierarchy, each attribute appears at most once, so (∀x ∈ A) (∀y, z ∈ C) (ins (x, y) ∧ ins (x, z) → ¬ (y ≺ z) ∧ ¬ (z ≺ y)) , (6)  each attribute is of some type, so (∀x ∈ A) (∃y ∈ Cs ) (types (x, y)) , (7)  each attribute is of at most one type and each method has at most one return value type, so (∀x ∈ (A ∪ F )) (∀y, z ∈ Cs ) (types (x, y) ∧ types (x, z) → y = z) . (8) Denition 6. Model  is a state space (M,  Φ), where M is a nite set of model n ϕi : M × E ki → M , (∀i ∈ n̂) (ki ∈ N) is a set of transfor- S states and Φ = i=1 mation rules. 5.3 Model Transformation Problem Each model transformation requires answers to the following questions [8]: 1. What needs to be transformed? 2. What will be the result of the transformation? To nd answers, we have to formulate the transformation problem and set the principle of its solution. This can be done by several ways, we have decided to apply the STRIPS planning. 6 Old°ich Nouza, Vojt¥ch Merunka, and Miroslav Virius 5.4 STRIPS Planning application Let's assume any nite subset B of object universal, containing elements of all possible model states. To formulate STRIPS problem (I, O, G) for model transformation, we must describe the model states and transformation rules using rst-order predicate logic calculus. For this purpose, we dene predicates shown in table 1. Table 1. Predicates for STRIPS problem formulation in SBAT engine Predicate Declaration Denition class c is in model inM odel (c) c ∈ Cs class c is not in outOf M odel (c) c ∈ (B − Cs ) model attribute a is in class attrInClass (a, c) (a, c) ∈ ins c attribute a is not in attrOutOf Class (a, c) ¬ ((a, c) ∈ ins ) ∧ a ∈ (B ∩ A) class c method µ is in class methInClass (µ, c) (µ, c) ∈ ins c method µ is not in methOutOf Class (µ, c) ¬ ((µ, c) ∈ ins ) ∧ µ ∈ (B ∩ F ) class c attribute a is of type hasT ype (a, t) (a, t) ∈ types t method µ has return hasRetT ype (µ, t) (µ, t) ∈ types value type t class c is superclass superClass (c, d) (c, d) ∈ supers of d class c is a parent of parent (c, d) c≺d d method µof class c sending (µ, c, η, d) (µ, c, η, d) ∈ sends sends messageη to objects of class d 5.4.1 Initial State Formulation Let mI = (CI , inI , superI , typeI , sendI ) be a model in initial state. We construct initial state I of STRIPS problem by the following steps: 1. Put I := ∅. 2. Add formulas about existence of classes in model: a) (∀c ∈ CI ) put (I := I ∪ [inM odel (c)]) and b) (∀c ∈ (B − CI )) put (I := I ∪ [outOf M odel (c)]). 3. Add formulas about class attributes: a) (∀ (a, c) ∈ (inI ∩ (B ∩ A, CI ))) put (I := I ∪ attrInClass (a, c)) and Automated Model Transformations Based on STRIPS Planning 7 b) (∀ (a, c) ∈ ((B ∩ A, B ∩ C) − inI )) put (I := I ∪ attrOutOf Class (a, c)). 4. Add formulas about class methods: a) (∀ (µ, c) ∈ (inI ∩ (B ∩ F, CI ))) put (I := I ∪ methInClass (µ, c)) and b) (∀ (µ, c) ∈ ((B ∩ F, B ∩ C) − inI )) put (I := I ∪ methOutOf Class (µ, c)). 5. Add formulas about inheritance: (∀ (c, d) ∈ superI ) put (I := I ∪ superClass (c, d)). 6. Add formulas about attribute types and return value types of methods: a) (∀ (a, c) ∈ (typeI ∩ (B ∩ A, CI ))) put (I := I ∪ hasT ype (a, c)) and b) (∀ (µ, c) ∈ (typeI ∩ (B ∩ F, CI ))) put (I := I ∪ hasT ype (µ, c)). 7. Add formulas about message sending: (∀ (a, c, b, d) ∈ sendI ) put (I := I ∪ sending (a, b, c, d)). 5.4.2 Formulation of Goal State Condition A goal state condition G is dened by the formula that is true in any goal state. 5.4.3 Formulation of Operator Set The set of operators O is dened iden- tically for each particular problem, because it represents a set of primitive refac- torings. The complete denition of the operator set is described in table 3 in appendix. 5.5 Example 5.5.1 Problem Let's suppose a simplied class model of le system (see g. 1). * +owner Folder File * +name +name +owner Fig. 1. File system class model The goal is to transform this model into state which satises the composite design pattern. 8 Old°ich Nouza, Vojt¥ch Merunka, and Miroslav Virius 5.5.2 Solution The initial model state ms = (Cs , ins , supers , types , sends ), where:  Cs = [F older, F ile, String]  ins = [(name, F older) , (owner, F older) , (name, F ile) , (owner, F ile)]  supers = [(Object, F older) , (Object, F ile) , (Object, String)]  types = [(name, String) , (owner, F older)]  sends = {(Client, main, x, y) |(x, y) ∈ ins } The corresponding initial state of STRIPS problem is the following: I = [inM odel (F older) , inM odel (F ile) , inM odel (String) , outOf M odel (Element) , attrInClass (name, F older) , attrInClass (owner, F older) , attrInClass (name, F ile) , attrInClass (owner, F ile) , attrOutOf Class (name, Elememt) , attrOutOf Class (owner, Element) , superClass (Object, F ile) , superClass (Object, F older) , hasT ype (owner, F older) , hasT ype (name, String) , sending (Client, main, F older, name) , sending (Client, main, F older, owner) , sending (Client, main, F ile, name) , sending (Client, main, F ile, owner)] (9) The goal state condition is the following: G =inM odel (Element) ∧ attrInClass (name, Element) ∧ attrInClass (owner, Element) ∧ superClass (Element, F ile) ∧ (10) superClass (Element, F odler) The STRIPS planner reaches the goal state by application of satisable operators (see table 2). Automated Model Transformations Based on STRIPS Planning 9 Table 2. List of operators application to reach the goal state Operator application Description addClass (Element) Add class Element to the model. changeSup (F ile, Object, Element) Change superclass Object of class F ile to Element. changeSup (F older, Object, Element) Change superclass Object of class F odler to Element. attrU p (name, Element, F ile, F older) Move attribute name to class Element from its subclasses F ile and F older. attrU p (owner, Element, F ile, F older) Move attribute owner to class Element from its subclasses F ile and F older. The goal state is as follows: Goal = [inM odel (F older) , inM odel (F ile) , inM odel (String) , inM odel (Element) , attrInClass (name, Element) , attrInClass (owner, Element) , attrOutOf Class (name, F older) , attrOutOf Class (owner, F older) , attrOutOf Class (name, F ile) , attrOutOf Class (owner, F ile) , (11) superClass (Element, F ile) , superClass (Element, F older) , hasT ype (owner, F older) , hasT ype (name, String) , sending (Client, main, F older, name) , sending (Client, main, F older, owner) , sending (Client, main, F ile, name) , sending (Client, main, F ile, owner)] A class model in UML notation corresponding to the goal state is shown in g. 2. 6 Conclusion and Future Work In this paper we have introduced SBAT transformation engine based on STRIPS planning system. This engine automates refactoring of the given source model to a target model fullling the input condition. The main asset of SBAT engine for practice is a contribution to an improve- ment of automation of object model transformations, which consequently would implicate saved human resources for software projects. Then, these resources could be allocated for example on software debugging or testing tasks, rather than on model transformation ones. Another asset should be a theoretical back- ground for research activities in the area of model transformations. 10 Old°ich Nouza, Vojt¥ch Merunka, and Miroslav Virius Element * +owner Folder File +name +name Fig. 2. File system as Composite design pattern Several consecutive research topics appeared during the SBAT development, e.g. the model state space optimization by reduction of states count or imple- mentation of SBAT in some CASE tool. Acknowledgment The authors would like to acknowledge the support of the research grant project SGS10/094 of the Czech Ministry of Education, Youth and Sports. References 1. Czarnecki K. and Helsen S.: Feature-based survey of model transformation ap- proaches. In: IBM Systems Journal 2006, vol. 45, no. 3, pp. 621-645. (2006) 2. Fowler M.: Refactoring. Addison-Wesley. ISBN 0-201-48567-2. (1999) 3. Gray J., Lin Y., and Zhang J.: Automating Change Evolution in Model-Driven Engineering. In Computer 2006, vol. 31, no. 2, pp. 51. (2006) 4. Jézequel J-M.: Model Transformation Techniques. Available online at http:// modelware.inria.fr/static_pages/slides/ModelTransfo.pdf. (2005) 5. Kleppe A. G., Warmer J., and Bast W.: MDA Explained: The Model Driven Ar- chitecture: Practice and Promise. Boston (MA, USA): Addison-Wesley Longman Publishing Co., Inc., 170 p. ISBN:032119442X. (2003) 6. Lin Y amd Gray J: A model transformation approach to automatic model construc- tion and evolution. In Proceedings of the 20th IEEE/ACM international Confer- ence on Automated Software Engineering, pp. 448-451. (2005) 7. Markovic S.: Composition of UML Described Refactoring Rules. In OCL and Model Driven Engineering, UML 2004 Conference Workshop, pp. 45-59. (2004) 8. Mens T., Czarnecki K, and Gorp P. V.: A Taxonomy of Model Transformations. In Language Engineering for Model-Driven Software Development, ser. Dagstuhl Seminar Proceedings. Internationales Begegnungs- und Forschungszentrum für In- formatik (IBFI), Dagstuhl (Germany). (2005) 9. Nilson N. J. and Fikes R. E. STRIPS: A new approach to the application of theroem proving to problem solving. Standford Research Institute, Menlo Park (California) 34 p. (1970). Automated Model Transformations Based on STRIPS Planning 11 10. Opdyke W. Refactoring Object-Oriented Frameworks. University of Illinois at Urbana-Champaign, Champaign, (IL, USA), PhD. thesis, 197 p. (1992) 11. Object Management Group (OMG): OMG Unied Modeling Language (OMG UML), Infrastructure: Version 2.2. 226 p. Available online at www.omg.org. (2009) 12. Sunyé G., Pollet D., Le Traon Y., Jézéquel J-M.: Refactoring UML Models. In Proceedings of the 4th International Conference on The Unied Modeling Lan- guage, Modeling Languages, Concepts, and Tools. Springer-Verlag, London (UK), pp. 134-148. ISBN 3-540-42667-1. (2001) 13. Zhang J., Lin Y., and Gray, J.: Generic and Domain-Specic Model Refactoring using a Model Transformation Engine. In Volume II of Research and Practice in Software Engineering, pp. 199-218. (2005) Appendix: Primitive Refactorings as STRIPS Operators Table 3: Primitive refactorings as STRIPS operators Primitive STRIPS Operator refactoring Declaration addClass (c) Condition outOf M odel (c) Add-eects inM odel (c) Add class c (∀x ∈ B ∩ C) attrOutOf Class (x, c) (∀x ∈ B ∩ F ) methOutOf Class (x, c) Delete-eects outOf M odel (c) Declaration addAttr (a, t, c) Add attribute a of Condition (∀x) (attrOutOf Class (x, d) type t into class c ∨¬superClass (x, c) ∨ ¬superClass (c, x) ∨x 6= c) ∧ (∀x) (¬hasT ype (a, x) ∨ (x = t)) Add-eects attrInClass (a, c) Delete-eects attrOutOf Class (a, c) Declaration addM eth (µ, c) Add method µ to Condition methOutOf Class (µ, c)∧ (∀x, y, z) class c (¬sending (x, y, µ, z) ∨ ¬parent (z, c) ∨ (z 6= c)) Add-eects methInClass (µ, c) Delete-eects methOutOf Class (µ, c) Declaration removeClass (c) Condition inM odel (c)∧ (∀x) (¬parent (c, x)) ∧ Remove class c (∀x) ¬attrInClass (x, c) ∧ ¬methInClass (x, c) Add-eects outOf M odel (c) Delete-eects inM odel (c) 12 Old°ich Nouza, Vojt¥ch Merunka, and Miroslav Virius Primitive STRIPS Operator refactoring Declaration removeAttr (a, c) Remove Condition attrInClass (a, c) ∧ (∀x, y, z) attribute a from (¬sending (x, y, µ, z) ∨ ¬parent (c, z) class c ∨ (z 6= c)) Add-eects attrOutOf Class (a, c) Delete-eects attrInClass (a, c) Declaration removeM eth (µ, c) Remove method µ Condition methInClass (µ, c) ∧ (∀x, y, z) from class c (¬sending (x, y, µ, z) ∨ ¬parent (c, z) ∨ (z 6= c)) ∧ (∀x, y) (¬sending (x, y, µ, c) ∨ (y = c)) Add-eects methOutOf Class (µ, c) Delete-eects methInClass (µ, c) Declaration changeAtrrT ype (a, t, u) Change type t of Condition hasT ype (a, t)∧super (u, t) attribute a to u Add-eects hasT ype (a, u) Delete-eects hasT ype (a, t) Declaration changeM ethT ype (µ, t, u) Change type t of Condition hasRetT ype (µ, t)∧super (u, t) values returned by Add-eects hasRetT ype (µ, u) method µ to u Delete-eects hasRetT ype (µ, t) Declaration changeSup(a, b, c) Change superclass Condition inM odel (c) ∧ b of class a to c superClass (b, a)∧(¬parent (a, c)) ∧ ∀ (x, u, v, w) ((¬superClass (x, c)) ∧ (¬superClass (x, b)) ∨ (¬sending (v, w, u, x)) ∧ (¬sending (u, x, v, w))) Add-eects superClass (c, a) Delete-eects superClass (b, a) Move attribute a Declaration attrDown (a, c, (b1 , . . . , bn )) from class c to its Condition attrInClass (a, c) ∧ (∀x) all subclasses (x = b1 ∨ . . . ∨ x = bn b1 , . . . , b n ∨¬superClass (c, x)) ∧ (∀x, y) ¬sending (x, y, a, c) Add-eects attrOutOf Class (a, c) (∀i ∈ n) attrInClass (a, bi ) Delete-eects attrInClass (a, c) (∀i ∈ n) attrOutOf Class (a, bi ) Move attribute a Declaration attrUp (a, c, (b1 , . . . , bn )) to class c from all Condition (attrInClass (a, x) ∨ ¬superClass (c, x)) its subclasses ∧ (∀x) ((x 6= b1 ∨ . . . ∨ x 6= bn ) b1 , . . . , b n ∨¬superClass (c, x)) Add-eects attrInClass (a, c) (∀i ∈ n) attrOutOf Class (a, bi ) Delete-eects attrOutOf Class (a, c) (∀i ∈ n) attrInClass (a, bi ) Automated Model Transformations Based on STRIPS Planning 13 Primitive STRIPS Operator refactoring Declaration methDown (µ, c, b) Copy methodµ Condition methInClass (µ, c) ∧ from class c to its methOutOf Class (µ, b) subclass b ∧ (superClass (c, b)) Add-eects methInClass (µ, b) Delete-eects methOutOf Class (µ, b) Declaration methUp (µ, c, b) Copy method µ to Condition methOutOf Class (µ, c) ∧ class c from its methInClass (µ, b) subclass b ∧ (superClass (c, b)) Add-eects methInClass (µ, c) Delete-eects methOutOf Class (µ, c) Add message η Declaration addSend (µ, c, η, d) sent to objects of Condition (¬sending (µ, c, η, d) ∧ methInClass (µ, c) class d from ∨ (∃x) ((parent (x, d) ∨ (x = d)) ∧ method µ of (methInClass (η, x)) class c ∨ (attrInClass (η, x)))) ∧ (∀x, y) (¬sending (x, y, µ, c) ∧ (c 6= Client)) Add-eects sending (µ, c, η, d) Delete-eects ∅ Remove message η Declaration removeSend (µ, c, η, d) sent to objects of Condition sending (µ, c, η, d) ∧ (c 6= Client) class d from ∧ (∀x, y) (¬sending (x, y, µ, c)) method µ of Add-eects ∅ class c Delete-eects sending (µ, c, η, d) Split message Declaration splitSend (µ, c, η, d, l, e) sending d C η to Condition sending (µ, c, η, d) ∧ attrInClass (l, d) (d C l) C η , where ∧hasT ype (l, e) l is of type e. Add-eects sending (µ, c, l, d) sending (µ, c, η, e) Delete-eects sending (µ, c, η, d) Merge message Declaration mergeSend (µ, c, η, d, l, e) sending Condition sending (µ, c, η, e) ∧ sending (µ, c, l, d) (d C l) C η into ∧attrInClass (l, d) ∧ hasT ype (l, e) d C η , where l is of Add-eects sending (µ, c, η, d) type e. Delete-eects sending (µ, c, l, d) sending (µ, c, η, e)