/// <summary>
 /// Visits the leaf node of the SAS+ operator decision tree.
 /// </summary>
 /// <param name="treeNode">Leaf node of the tree.</param>
 /// <param name="state">Reference state.</param>
 /// <returns>List of successors.</returns>
 public IEnumerable <ISuccessor> Visit(OperatorDecisionTreeLeafNode treeNode, IState state)
 {
     foreach (var oper in treeNode.Operators)
     {
         if (MutexChecker.Value.CheckSuccessorCompatibility(state, oper))
         {
             yield return(new Successor(state, oper));
         }
     }
 }
 /// <summary>
 /// Visits the leaf node of the SAS+ operator decision tree.
 /// </summary>
 /// <param name="treeNode">Leaf node of the tree.</param>
 /// <param name="sourceConditions">Source conditions being evaluated.</param>
 /// <param name="currentSubConditions">Currently evaluated sub-conditions.</param>
 /// <returns>List of predecessors.</returns>
 public IEnumerable <IPredecessor> Visit(OperatorDecisionTreeLeafNode treeNode, IConditions sourceConditions, ISimpleConditions currentSubConditions)
 {
     foreach (var oper in treeNode.Operators)
     {
         // relevant operator candidates need to be double-checked for the relevance with the original conditions, because there can be additional
         // conflicts with the operator preconditions, conditional effects constraints, and/or incompatibility with the mutex constraints
         if (oper.IsRelevant(sourceConditions))
         {
             yield return(new Predecessor(sourceConditions, oper));
         }
     }
 }