예제 #1
0
        /// <summary>
        /// Grounds the conditions by the specified substitution.
        /// </summary>
        /// <param name="conditions">Conditions.</param>
        /// <param name="substitution">Variable substitution.</param>
        /// <returns>Grounded conditions.</returns>
        public Conditions Ground(Conditions conditions, ISubstitution substitution)
        {
            // (partially) ground the whole conditions by the specified substitution

            Conditions newConditions = conditions.CloneEmpty();

            foreach (var expression in conditions)
            {
                newConditions.Add(ExpressionsGrounder.Value.Ground(expression, substitution));
            }

            // for partially lifted conditions - remove parameters that were grounded by the substitution

            if (conditions.Parameters != null)
            {
                newConditions.Parameters.Clear();
                foreach (var parameter in conditions.Parameters)
                {
                    if (!substitution.Contains(parameter.ParameterNameId))
                    {
                        newConditions.Parameters.Add(parameter.Clone());
                    }
                }

                // if the conditions are fully grounded, set the parameters as null

                if (newConditions.Parameters.Count == 0)
                {
                    newConditions.Parameters = null;
                }
            }

            return(newConditions);
        }
        /// <summary>
        /// Removes rigid relations from the specified conditions.
        /// </summary>
        /// <param name="conditions">Conditions.</param>
        /// <returns>Conditions without rigid relations.</returns>
        private Conditions ClearRigidRelations(Conditions conditions)
        {
            Conditions newConditions = conditions.CloneEmpty();

            foreach (var expression in conditions)
            {
                PredicateExpression predicate = expression as PredicateExpression;
                if (predicate != null)
                {
                    if (EvaluationManager.IsPredicateRigidRelation(predicate.PredicateAtom))
                    {
                        continue;
                    }
                }
                newConditions.Add(expression);
            }

            return(newConditions);
        }