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