Exemplo n.º 1
0
        private void AddReasoningActions(Formula fUnknown, HashSet <Predicate> lUnassigned, HashSet <Predicate> lAssigned, Dictionary <List <Predicate>, List <Predicate> > dActions)
        {
            if (fUnknown is PredicateFormula)
            {
                HashSet <Predicate> lEffects = new HashSet <Predicate>();
                Predicate           pEffect  = ((PredicateFormula)fUnknown).Predicate;
                if (pEffect.Name != Domain.TRUE_PREDICATE)
                {
                    lEffects.Add(pEffect);
                    AddReasoningAction(lAssigned, lEffects, dActions);
                }
                return;
            }
            CompoundFormula cfUnknown = (CompoundFormula)fUnknown;

            if (cfUnknown.Operator == "and")
            {
                bool bAllKnown = true;
                foreach (Formula f in cfUnknown.Operands)
                {
                    if (f is CompoundFormula)
                    {
                        bAllKnown = false;
                    }
                }
                if (bAllKnown)
                {
                    AddReasoningAction(lAssigned, lUnassigned, dActions);
                    return;
                }
            }
            Formula fReduced = null;

            foreach (Predicate p in lUnassigned)
            {
                HashSet <Predicate> lUnassignedReduced = new HashSet <Predicate>(lUnassigned);
                lUnassignedReduced.Remove(p);
                lAssigned.Add(p);
                fReduced = cfUnknown.Reduce(lAssigned);
                AddReasoningActions(fReduced, lUnassignedReduced, lAssigned, dActions);
                lAssigned.Remove(p);
                lAssigned.Add(p.Negate());
                fReduced = cfUnknown.Reduce(lAssigned);
                AddReasoningActions(fReduced, lUnassignedReduced, lAssigned, dActions);
                lAssigned.Remove(p.Negate());
            }
        }