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