==== Interaction Rules ==== Below are the logic rules used to detect structural interactions in Reflex. These interaction rules take into account ordering and visibility between links. ordered(A,B,'interactionEnabled') :- ord(B,'all'), not(ord(A,'all')). ordered(A,B,'interactionDisabled') :- ord(A,'all'), not(ord(B,'all')). ordered(A,B,'interactionDisabled') :- ord(A,B). ordered(A,B,'interactionEnabled') :- ord(B,A). ordered(A,B,'notOrdered') :- not(ord(B,A)), not(ord(A,B)), not(ord(B,'all')), not(ord(A,'all')). remove(Link,Class,true) :- remove(Link,Class). remove(Link,Class,false) :- not(remove(Link,Class)). visible(Link1,Link2,true) :- visible(Link1,Link2). visible(Link1,Link2,false) :- not(visible(Link1,Link2)). interactFieldName(Link1,Link2,Class1,Class2,FieldName,View,Order,Mutex) :- readFieldName(Link1,Class2), addField(Link2,Class1,Class2,_,_,FieldName), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactMethodName(Link1,Link2,Class1,Class2,MethodName,View,Order,Mutex) :- readMethodName(Link1,Class2), addMethod(Link2,Class1,Class2,_,_,MethodName,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactClassName(Link1,Link2,Class1,Class2,View,Order,Mutex) :- readClassName(Link1,Class2), addClass(Link2,Class1,Class2,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link2,Class2,Mutex). interactInterfaceName(Link1,Link2,Class1,Class2,InterfaceName,View,Order,Mutex) :- readClassInterfaceName(Link1,Class2), addInterface(Link2,Class1,Class2,InterfaceName), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactAnnotField(Link1,Link2,Class1,Class2,Field,AnnotationName,View,Order,Mutex) :- readFieldAnnotationName(Link1,Class2,Field), addAnnotationToField(Link2,Class1,Class2,Field,AnnotationName), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactAnnotMethod(Link1,Link2,Class1,Class2,Method,AnnotationName,View,Order,Mutex) :- readMethodAnnotationName(Link1,Class2,Method), addAnnotationToMethod(Link2,Class1,Class2,Method,AnnotationName), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactAnnotConstructor(Link1,Link2,Class1,Class2,Constructor,AnnotationName,View,Order,Mutex) :- readConstructorAnnotationName(Link1,Class2,Constructor), addAnnotationToConstructor(Link2,Class1,Class2,Constructor,AnnotationName), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactAnnotClass(Link1,Link2,Class1,Class2,AnnotationName,View,Order,Mutex) :- readClassAnnotationName(Link1,Class2), addAnnotationToClass(Link2,Class1,Class2,AnnotationName), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactAnnotInterface(Link1,Link2,Class1,Interface,AnnotationName,View,Order,Mutex) :- readInterfaceAnnotationName(Link1,Interface), addAnnotationToInterface(Link2,Class1,Interface,AnnotationName), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactModifierField(Link1,Link2,Class1,Class2,Field,Modifier,View,Order,Mutex) :- readFieldModifier(Link1,Class2,_), addField(Link2,Class1,Class2,Modifier,_,Field), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactModifierField(Link1,Link2,Class1,Class2,Field,Modifier,View,Order,Mutex) :- readFieldModifier(Link1,Class2,Field), setModifierField(Link2,Class1,Class2,Field,Modifier), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactModifierMethod(Link1,Link2,Class1,Class2,Method,Modifier,View,Order,Mutex) :- readMethodModifier(Link1,Class2,_), addMethod(Link2,Class1,Class2,Modifier,_,Method,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactModifierMethod(Link1,Link2,Class1,Class2,Method,Modifier,View,Order,Mutex) :- readMethodModifier(Link1,Class2,Method), setModifierMethod(Link2,Class1,Class2,Method,Modifier), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactModifierConstructor(Link1,Link2,Class1,Class2,Constructor,Modifier,View,Order,Mutex) :- readConstructorModifier(Link1,Class2,_), addConstructor(Link2,Class1,Class2,Modifier,Constructor,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactModifierConstructor(Link1,Link2,Class1,Class2,Constructor,Modifier,View,Order,Mutex) :- readConstructorModifier(Link1,Class2,Constructor), setModifierConstructor(Link2,Class1,Class2,Constructor,Modifier), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactModifierClass(Link1,Link2,Class1,Class2,Modifier,View,Order,Mutex) :- readClassModifier(Link1,Class2), addClass(Aspect,Class1,Class2,Modifier), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactModifierClass(Link1,Link2,Class1,Class2,Modifier,View,Order,Mutex) :- readClassModifier(Link1,Class2), setModifierClass(Link2,Class1,Class2,Modifier), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactFieldType(Link1,Link2,Class1,Class2,Field,Type,View,Order,Mutex) :- readFieldType(Link1,Class2), addField(Link2,Class1,Class2,_,Type,Field), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactReturnType(Link1,Link2,Class1,Class2,Method,ReturnType,View,Order,Mutex) :- readMethodReturn(Link1,Class2), addMethod(Link2,Class1,Class2,_,ReturnType,Method,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactMethodParamTypes(Link1,Link2,Class1,Class2,Method,ParamTypes,View,Order,Mutex) :- readMethodParameterTypes(Link1,Class2), addMethod(Link2,Class1,Class2,_,_,Method,ParamTypes,_), ParamTypes \\= [], visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactConstructorParamTypes(Link1,Link2,Class1,Class2,Const,ParamTypes,View,Order,Mutex) :- readConstructorParameterTypes(Link1,Class2), addConstructor(Link2,Class1,Class2,_,Const,ParamTypes,_), ParamTypes \\= [], visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactMethodExceptionTypes(Link1,Link2,Class1,Class2,Method,ExceptionTypes,View,Order,Mutex) :- readMethodExceptionTypes(Link1,Class2), addMethod(Link2,Class1,Class2,_,_,Method,_,ExceptionsTypes), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactConstructorExceptionTypes(Link1,Link2,Class1,Class2,Const,ExceptionTypes,View,Order,Mutex) :- readConstructorExceptionTypes(Link1,Class2), addConstructor(Link2,Class1,Class2,_,Const,_,ExceptionsTypes), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactClassFields(Link1,Link2,Class1,Class2,View,Order,Mutex) :- readFields(Link1,Class2), addField(Link2,Class1,Class2,_,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactClassMethods(Link1,Link2,Class1,Class2,View,Order,Mutex) :- readMethods(Link1,Class2), addMethod(Link2,Class1,Class2,_,_,_,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactClassConstructors(Link1,Link2,Class1,Class2,View,Order,Mutex) :- readConstructors(Link1,Class2), addConstructor(Link2,Class1,Class2,_,_,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactClassInterfaces(Link1,Link2,Class1,Class2,View,Order,Mutex) :- readClassInterfaces(Link1,Class2), addInterface(Link2,Class1,Class2,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactFieldAnnotations(Link1,Link2,Class1,Class2,Field,View,Order,Mutex) :- readFieldAnnotations(Link1,Class2), addAnnotationToField(Link2,Class1,Class2,Field,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactMethodAnnotations(Link1,Link2,Class1,Class2,Method,View,Order,Mutex) :- readMethodAnnotations(Link1,Class2), addAnnotationToMethod(Link2,Class1,Class2,Method,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactConstructorAnnotations(Link1,Link2,Class1,Class2,Const,View,Order,Mutex) :- readConstructorAnnotations(Link1,Class2), addAnnotationToConstructor(Link2,Class1,Class2,Const,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactInterfaceAnnotations(Link1,Link2,Class1,Interface,View,Order,Mutex) :- readInterfaceAnnotations(Link1,Interface), addAnnotationToInterface(Link2,Class1,Interface,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactClassAnnotations(Link1,Link2,Class1,Class2,View,Order,Mutex) :- readClassAnnotations(Link1,Class2), addAnnotationToClass(Link2,Class1,Class2,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactFieldBody(Link1,Link2,Class1,Class2,Field,View,Order,Mutex) :- readFieldBody(Link1,Class2), addField(Link2,Class1,Class2,_,_,Field), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactMethodBody(Link1,Link2,Class1,Class2,Method,View,Order,Mutex) :- readMethodBody(Link1,Class2), addMethod(Link2,Class1,Class2,_,_,Method,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex). interactConstructorBody(Link1,Link2,Class1,Class2,Const,View,Order,Mutex) :- readConstructorBody(Link1,Class2), addConstructor(Link2,Class1,Class2,_,Const,_,_), visible(Link2,Link1,View), ordered(Link1,Link2,Order), remove(Link1,Class2,Mutex).