public Clause GetStandardizeApartResult(Clause clause, IStandardizeApartIndexical standardizeApartIndexical)
        {
            var toRename = variableCollector.CollectAllVariables(clause);
            IDictionary <Variable, ITerm> renameSubstitution = new Dictionary <Variable, ITerm>();

            foreach (var var in toRename)
            {
                Variable v = null;
                do
                {
                    v = new Variable(standardizeApartIndexical.GetPrefix()
                                     + standardizeApartIndexical.GetNextIndex());
                    // Ensure the new variable name is not already
                    // accidentally used in the sentence
                } while (toRename.Contains(v));

                renameSubstitution[var] = v;
            }

            if (renameSubstitution.Count > 0)
            {
                var literals = clause.GetLiterals().Select(l => this.substVisitor.Subst(renameSubstitution, l)).ToList();

                var renamed = new Clause(literals);
                renamed.SetProofStep(new ProofStepRenaming(renamed, clause.GetProofStep()));
                return(renamed);
            }

            return(clause);
        }
Exemple #2
0
        public Clause Apply(TermEquality assertion, Clause clExpression)
        {
            Clause altClExpression = null;

            foreach (Literal l1 in clExpression.GetLiterals())
            {
                IAtomicSentence altExpression = Apply(assertion, l1.AtomicSentence);
                if (null != altExpression)
                {
                    // I have an alternative, create a new clause
                    // with the alternative and return
                    IList <Literal> newLits = new List <Literal>();
                    foreach (Literal l2 in clExpression.GetLiterals())
                    {
                        if (l1.Equals(l2))
                        {
                            newLits.Add(l1.NewInstance(altExpression));
                        }
                        else
                        {
                            newLits.Add(l2);
                        }
                    }
                    // Only apply demodulation at most once on
                    // each call.
                    altClExpression = new Clause(newLits);
                    altClExpression.SetProofStep(new ProofStepClauseDemodulation(
                                                     altClExpression, clExpression, assertion));
                    if (clExpression.Immutable)
                    {
                        altClExpression.Immutable = true;
                    }
                    if (!clExpression.IsStandardizedApartCheckRequired())
                    {
                        altClExpression.SetStandardizedApartCheckNotRequired();
                    }
                    break;
                }
            }

            return(altClExpression);
        }
        public ISet <Variable> CollectAllVariables(Clause aClause)
        {
            ISet <Variable> variables = new HashedSet <Variable>();

            foreach (Literal l in aClause.GetLiterals())
            {
                l.AtomicSentence.Accept(this, variables);
            }

            return(variables);
        }
        public static int StandardizeApart(Clause c, int saIdx)
        {
            IList <Variable> variables = new List <Variable>();

            foreach (Literal l in c.GetLiterals())
            {
                CollectAllVariables(l.AtomicSentence, variables);
            }

            return(StandardizeApart(variables, c, saIdx));
        }
Exemple #5
0
            public bool IsCheckForUnitRefutation(Clause clause) 
            {

                if (this.IsLookingForAnswerLiteral()) 
                {
                    if (2 == clause.GetNumberLiterals()) 
                    {
                        return clause.GetLiterals().Any(t => t.AtomicSentence.GetSymbolicName().Equals(this.answerLiteral.AtomicSentence.GetSymbolicName()));
                    }
                } else {
                    return clause.IsUnitClause();
                }

                return false;
            }