private Action CreateReasoningAction(Predicate pEffect, HashSet <Predicate> lPredicates)
        {
            KnowPredicate kpEffect = new KnowPredicate(pEffect);

            if (Predicates.Contains(kpEffect))
            {
                return(null);
            }
            Action a = new KnowledgeAction("Reasoning_" + pEffect.ToString());

            a.Preconditions = new CompoundFormula("and");
            foreach (Predicate pOther in lPredicates)
            {
                if (pOther != pEffect)
                {
                    KnowPredicate kp = new KnowPredicate(pOther);
                    if (!Predicates.Contains(kp))
                    {
                        return(null);
                    }
                    ((CompoundFormula)a.Preconditions).AddOperand(new PredicateFormula(kp));
                }
            }
            CompoundFormula cfEffects = new CompoundFormula("and");

            cfEffects.AddOperand(new PredicateFormula(kpEffect));
            a.SetEffects(cfEffects);
            return(a);
        }
        private void AddKnowledgePredicatesToExistingActions(HashSet <Predicate> lKnowPredicates)
        {
            List <Action> lActions = AvailableActions;

            AvailableActions = new List <Action>();
            foreach (Action a in lActions)
            {
                KnowledgeAction ka = new KnowledgeAction(a);
                ka.Preconditions = AddKnowledgePredicatesToFormula(a.Preconditions, lKnowPredicates);
                CompoundFormula cfEffects = null;
                if (Contains(ka.Preconditions))
                {
                    if (a.Effects != null)
                    {
                        cfEffects = AddKnowledgePredicatesToFormula(a.Effects, lKnowPredicates);
                    }
                    else
                    {
                        cfEffects = new CompoundFormula("and");
                    }
                    if (a.Observe != null)
                    {
                        HashSet <Predicate> lPredicates = new HashSet <Predicate>();
                        a.Observe.GetAllPredicates(lPredicates);
                        foreach (Predicate p in lPredicates)
                        {
                            cfEffects.AddOperand(new PredicateFormula(new KnowPredicate(p)));
                        }
                        ka.Observe = null;
                    }
                    ka.SetEffects(cfEffects);
                    if (!Contains(ka.Effects))
                    {
                        AvailableActions.Add(ka);
                    }
                }
            }
        }