/// <summary> /// Applies backwards the relevant operator effects and operator preconditions to the given target relative state. /// </summary> /// <param name="relativeState">Target relative state to be modified.</param> /// <param name="operatorSubstitution">Variables substitution.</param> /// <returns>Preceding relative states.</returns> public IEnumerable <Planner.IRelativeState> ApplyBackwards(IRelativeState relativeState, ISubstitution operatorSubstitution) { OperatorSubstitution = operatorSubstitution; Effects.GroundEffectsByCurrentOperatorSubstitution(GroundingManager, operatorSubstitution); relativeState = (IRelativeState)relativeState.Clone(); // prepare operator preconditions var operatorPreconditions = (OperatorPreconditions != null) ? GroundingManager.GroundConditions(ClearRigidRelations(OperatorPreconditions), OperatorSubstitution) : null; // remove positively contributing effects from the relative state and insert the operator preconditions ProcessPrimitiveEffects(relativeState); relativeState = ProcessForallEffects(relativeState); foreach (var resultState in ProcessWhenEffects(relativeState)) { if (operatorPreconditions != null) { foreach (var modifiedResultState in ProcessOperatorPreconditions(operatorPreconditions, resultState)) { yield return(modifiedResultState); } } else { yield return(resultState); } } }
/// <summary> /// Grounds the specified conditions by a minimal needed operator substitution. /// </summary> /// <param name="conditions">Conditions.</param> /// <returns>Grounded conditions.</returns> private Conditions GroundConditions(Conditions conditions) { return(GroundingManager.GroundConditions(conditions, IsApplicationLifted ? ExtractMinimalOperatorSubstitution() : OperatorSubstitution)); }