private bool dpll(List<Sentence> clauses, List<Symbol> symbols, Model model)
{
// List<Sentence> clauseList = asList(clauses);
List<Sentence> clauseList = clauses;
// System.Console.WriteLine("clauses are " + clauses.ToString());
// if all clauses are true return true;
if (areAllClausesTrue(model, clauseList))
{
// System.Console.WriteLine(model.ToString());
return true;
}
// if even one clause is false return false
if (isEvenOneClauseFalse(model, clauseList))
{
// System.Console.WriteLine(model.ToString());
return false;
}
// System.Console.WriteLine("At least one clause is unknown");
// try to find a unit clause
SymbolValuePair svp = findPureSymbolValuePair(clauseList, model,
symbols);
if (svp.notNull())
{
Symbol[] copy = new Symbol[symbols.Count];
symbols.CopyTo(copy);
List<Symbol> newSymbols = new List<Symbol>(copy);
newSymbols.Remove(new Symbol(svp.symbol.getValue()));
Model newModel = model.extend(new Symbol(svp.symbol.getValue()),
svp.value);
return dpll(clauses, newSymbols, newModel);
}
SymbolValuePair svp2 = findUnitClause(clauseList, model, symbols);
if (svp2.notNull())
{
Symbol[] copy = new Symbol[symbols.Count];
symbols.CopyTo(copy);
List<Symbol> newSymbols = new List<Symbol>(copy);
newSymbols.Remove(new Symbol(svp2.symbol.getValue()));
Model newModel = model.extend(new Symbol(svp2.symbol.getValue()),
svp2.value);
return dpll(clauses, newSymbols, newModel);
}
Symbol symbol = (Symbol)symbols[0];
// System.Console.WriteLine("default behaviour selecting " + symbol);
Symbol[] symbolsArr = new Symbol[symbols.Count];
symbols.CopyTo(symbolsArr);
List<Symbol> newSymbols2 = symbolsArr.ToList<Symbol>();
newSymbols2.RemoveAt(0);
return (dpll(clauses, newSymbols2, model.extend(symbol, true)) || dpll(
clauses, newSymbols2, model.extend(symbol, false)));
}