AIMA.Core.Logic.Propositional.Algorithms.DPLL.dpll C# (CSharp) Метод

dpll() приватный Метод

private dpll ( List clauses, List symbols, Model model ) : bool
clauses List
symbols List
model Model
Результат bool
        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)));
        }