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; }