docs: public List<TerminalNode> addRule( final RuleImpl rule,
                                         final InternalKnowledgeBase kBase ) throws InvalidPatternException {
  
          // the list of terminal nodes
          final List<TerminalNode> nodes = new ArrayList<TerminalNode>();
  
          // transform rule and gets the array of subrules
          final GroupElement[] subrules = rule.getTransformedLhs( kBase.getConfiguration().getComponentFactory().getLogicTransformerFactory().getLogicTransformer(),
                                                                  kBase.getGlobals() );
  
          for (int i = 0; i < subrules.length; i++) {
  
              // creates a clean build context for each subrule
              final BuildContext context = new BuildContext( kBase );
              context.setRule( rule );
  
              // if running in STREAM mode, calculate temporal distance for events
              if (EventProcessingOption.STREAM.equals( kBase.getConfiguration().getEventProcessingMode() )) {
                  TemporalDependencyMatrix temporal = this.utils.calculateTemporalDistance( subrules[i] );
                  context.setTemporalDistance( temporal );
              }
  
              if (kBase.getConfiguration().isSequential() ) {
                  context.setTupleMemoryEnabled( false );
                  context.setObjectTypeNodeMemoryEnabled( false );
              } else {
                  context.setTupleMemoryEnabled( true );
                  context.setObjectTypeNodeMemoryEnabled( true );
              }
  
              // adds subrule
              final TerminalNode node = this.addSubRule( context,
                                                         subrules[i],
                                                         i,
                                                         rule );
  
              // adds the terminal node to the list of terminal nodes
              nodes.add( node );
          }
  
          return nodes;
      }