public List<Action> SplitTaggedConditions(Dictionary<string, List<Predicate>> dTags, List<string> lAlwaysKnown)
        {
            List<Action> lSplitted = new List<Action>();

            CompoundFormula cfPreconditions = new CompoundFormula("and");
            HashSet<Predicate> lKnowPreconditions = new HashSet<Predicate>();
            if (Preconditions != null)
            {
                Preconditions.GetAllPredicates(lKnowPreconditions);
                cfPreconditions.AddOperand(Preconditions);
                foreach (Predicate p in lKnowPreconditions)
                    if (!lAlwaysKnown.Contains(p.Name))
                        cfPreconditions.AddOperand(new PredicateFormula(new KnowPredicate(p)));
            }

            if (Effects != null)
            {
                List<CompoundFormula> lConditions = new List<CompoundFormula>();
                List<Formula> lObligatory = new List<Formula>();
                SplitEffects(lConditions, lObligatory);

                HashSet<Predicate> lKnowEffects = new HashSet<Predicate>();
                CompoundFormula cfGeneralEffects = new CompoundFormula("and");
                foreach (Formula f in lObligatory)
                {
                    f.GetAllPredicates(lKnowEffects);
                    cfGeneralEffects.AddOperand(f);
                }
                foreach (Predicate p in lKnowEffects)
                    if (!lAlwaysKnown.Contains(p.Name))
                        cfGeneralEffects.AddOperand(new PredicateFormula(new KnowPredicate(p)));

                int iCondition = 0;
                foreach (CompoundFormula cfCondition in lConditions)
                {
                    Action aNew = new Action(Name + "_" + iCondition);
                    aNew.Preconditions = cfPreconditions.Clone();
                    CompoundFormula cfEffects = (CompoundFormula)cfGeneralEffects.Clone();

                    cfEffects.AddOperand(cfCondition);
                    cfEffects.AddOperand(CreateKnowledgeGainCondition(cfCondition, lAlwaysKnown));
                    cfEffects.AddOperand(CreateKnowledgeLossCondition(cfCondition, lAlwaysKnown));
                    foreach (string sTag in dTags.Keys)
                    {
                        cfEffects.AddOperand(CreateTaggedKnowledgeGainCondition(cfCondition, sTag, lAlwaysKnown, false));
                        cfEffects.AddOperand(CreateTaggedKnowledgeLossCondition(cfCondition, sTag, lAlwaysKnown));
                    }
                    aNew.Effects = cfEffects;
                    iCondition++;
                    lSplitted.Add(aNew);
               }
            }
            if (Observe != null)
            {
                throw new NotImplementedException();
            }
            return lSplitted;
        }
 private void RemoveDisjunctions(Action a, List<List<Formula>> lOptions, int iOption, CompoundFormula cfAnd, List<Action> lNoDisjunctions, ref int iIndex)
 {
     if (iOption == lOptions.Count)
     {
         Action aNew = a.Clone();
         aNew.Name += "." + iIndex;
         iIndex++;
         aNew.Preconditions = cfAnd;
         lNoDisjunctions.Add(aNew);
     }
     else
     {
         foreach (Formula fOption in lOptions[iOption])
         {
             CompoundFormula cfNew = (CompoundFormula)cfAnd.Clone();
             cfNew.AddOperand(fOption);
             RemoveDisjunctions(a, lOptions, iOption + 1, cfNew, lNoDisjunctions, ref iIndex);
         }
     }
 }
 public List<Action> SplitConditionalEffects(out CompoundFormula cfObligatory)
 {
     List<Action> lSplit = new List<Action>();
     List<CompoundFormula> lConditions = new List<CompoundFormula>();
     List<Formula> lObligatory = new List<Formula>();
     SplitEffects(lConditions, lObligatory);
     cfObligatory = new CompoundFormula("and");
     foreach (Formula fSub in lObligatory)
     {
         cfObligatory.AddOperand(fSub);
     }
     int cActions = 1;
     foreach (CompoundFormula cfCondition in lConditions)
     {
         Action a = new Action(Name + cActions);
         cActions++;
         CompoundFormula cfPreconditions = new CompoundFormula("and");
         if( Preconditions != null )
             cfPreconditions.AddOperand(Preconditions.Clone());
         cfPreconditions.AddOperand(cfCondition.Operands[0]);
         CompoundFormula cfEffects = new CompoundFormula("and");
         cfEffects.AddOperand(cfObligatory.Clone());
         cfEffects.AddOperand(cfCondition.Operands[1]);
         a.Preconditions = cfPreconditions;
         a.Effects = cfEffects;
         if(a.Observe != null)
             a.Observe = Observe.Clone();
         lSplit.Add(a);
     }
     return lSplit;
 }