“…This constraint is necessary, since given two ensemble specifications S1 and S2, it is not possible to statically decide whether S1 matches a subset of 1 violations(S, T, 'enclosing') :− 2 isEnclosedIn(E, EnclosingEnsemble), 3 part of(S, E), 4 tnot(part of(S, EnclosingEnsemble)). 5 6 violations(S, T, 'outgoing') :− 7 tnot(outPort(E, Port), isOpen(Port)), 8 (depends(E, DependentEnsemble) | E=DependentEnsemble), 9 part of(S, E), tnot(part of(T, DependentEnsemble)). 10 11 violations(S, T, 'incoming') :− 12 tnot(inPort(E, Port), isOpen(Port)), 13 (depends(E, DependentEnsemble) | E=DependentEnsemble), 14 tnot(part of(S, DependentEnsemble)), part of(T, E).…”