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

