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).