Example #1
0
            public bool IsAnswer(Clause aClause) 
            {
                bool isAns = false;

                if (answerClause.IsEmpty())
                {
                    if (aClause.IsEmpty()) 
                    {
                        proofs.Add(new ProofFinal(aClause.GetProofStep(), new Dictionary<Variable, ITerm>()));
                        complete = true;
                        isAns = true;
                    }
                } else 
                {
                    if (aClause.IsEmpty()) 
                    {
                        // This should not happen
                        // as added an answer literal to sos, which
                        // implies the database (i.e. premises) are
                        // unsatisfiable to begin with.
                        throw new InvalidOperationException(
                                "Generated an empty clause while looking for an answer, implies original KB or usable is unsatisfiable");
                    }

                    if (aClause.IsUnitClause()
                            && aClause.IsDefiniteClause()
                            && aClause.GetPositiveLiterals()[0].AtomicSentence.GetSymbolicName().Equals(
                                            this.answerLiteral.AtomicSentence.GetSymbolicName())
                        )
                    {
                        IDictionary<Variable, ITerm> answerBindings = new Dictionary<Variable, ITerm>();
                        IList<ITerm> answerTerms =
                            aClause.GetPositiveLiterals()[0].AtomicSentence.GetArgs().Cast<ITerm>().ToList();
                        var idx = 0;
                        foreach (Variable v in this.answerLiteralVariables)
                        {
                            answerBindings[v] = answerTerms[idx];
                            idx++;
                        }
                        bool addNewAnswer = this.proofs.All(p => !p.GetAnswerBindings().Equals(answerBindings));
                        if (addNewAnswer)
                        {
                            this.proofs.Add(new ProofFinal(aClause.GetProofStep(), answerBindings));
                        }
                        isAns = true;
                    }
                }

                var ts = DateTime.Now - DateTime.MinValue;
                if (ts.TotalMilliseconds > finishTime) 
                {
                    this.complete = true;

                    // Indicate that I have run out of query time
                    this.timedOut = true;
                }

                return isAns;
            }
        public override string GetProof()
        {
            var             sb    = new StringBuilder();
            IList <Literal> nLits = implication.GetNegativeLiterals();

            for (int i = 0; i < implication.GetNumberNegativeLiterals(); i++)
            {
                sb.Append(nLits[i].AtomicSentence);
                if (i != (implication.GetNumberNegativeLiterals() - 1))
                {
                    sb.Append(" AND ");
                }
            }
            sb.Append(" => ");
            sb.Append(implication.GetPositiveLiterals()[0]);
            return(sb.ToString());
        }