/// <summary> /// Processes conditional (when) effects. /// </summary> /// <param name="expression">Conditions expression in CNF.</param> /// <param name="relevantConditionalEffects">Output indices of relevant conditional effects (can be null).</param> /// <returns>Tuple of two values, where the first is true when the positive relevance condition (inclusion) is satisfied, while the second is /// true when the negative condition (exclusion) is not violated. False otherwise.</returns> private Tuple <bool, bool> ProcessWhenEffects(ConditionsCNF expression, IList <int> relevantConditionalEffects) { bool positiveCondition = false; int whenEffectIndex = -1; foreach (var whenEffect in Effects.WhenEffects) { ++whenEffectIndex; List <IEffect> subEffects = new List <IEffect>(); whenEffect.Effects.ForEach(subEffect => subEffects.Add(subEffect)); EffectsRelevanceConditionsEvaluator evaluator = new EffectsRelevanceConditionsEvaluator(subEffects, GroundingManager); var result = evaluator.EvaluateWithExtendedResult(expression, OperatorSubstitution, ExpressionSubstitution, relevantConditionalEffects); if (!result.Item2) { continue; } if (result.Item1 && result.Item2) { relevantConditionalEffects?.Add(whenEffectIndex); } positiveCondition |= result.Item1; } return(Tuple.Create(positiveCondition, true)); }
/// <summary> /// Processes forall effects. /// </summary> /// <param name="expression">Conditions expression in CNF.</param> /// <returns>Tuple of two values, where the first is true when the positive relevance condition (inclusion) is satisfied, while the second is /// true when the negative condition (exclusion) is not violated. False otherwise.</returns> private Tuple <bool, bool> ProcessForallEffects(ConditionsCNF expression) { bool positiveCondition = false; bool negativeCondition = true; foreach (var forallEffect in Effects.ForallEffects) { EffectsRelevanceConditionsEvaluator evaluator = new EffectsRelevanceConditionsEvaluator(forallEffect.Effects, GroundingManager); IEnumerable <ISubstitution> localSubstitutions = GroundingManager.GenerateAllLocalSubstitutions(forallEffect.Parameters); foreach (var localSubstitution in localSubstitutions) { OperatorSubstitution.AddLocalSubstitution(localSubstitution); var result = evaluator.EvaluateWithExtendedResult(expression, OperatorSubstitution, null); positiveCondition |= result.Item1; negativeCondition &= result.Item2; OperatorSubstitution.RemoveLocalSubstitution(localSubstitution); if (!negativeCondition) { return(result); } } } return(Tuple.Create(positiveCondition, true)); }