상속: BasicTraverser
예제 #1
0
파일: DPLL.cs 프로젝트: PaulMineau/AIMA.Net
 public bool dpllSatisfiable(Sentence s, Model m)
 {
     List<Sentence> clauses = new CNFClauseGatherer()
             .getClausesFrom(new CNFTransformer().transform(s));
     List<Symbol> symbols = new SymbolCollector()
             .getSymbolsIn(s);
     // System.Console.WriteLine(" numberOfSymbols = " + symbols.Count);
     return dpll(clauses, symbols, m);
 }
예제 #2
0
 public bool ttEntails(KnowledgeBase kb, String alpha)
 {
     Sentence kbSentence = kb.asSentence();
     Sentence querySentence = (Sentence)new PEParser().parse(alpha);
     SymbolCollector collector = new SymbolCollector();
     List<Symbol> kbSymbols = collector.getSymbolsIn(kbSentence);
     List<Symbol> querySymbols = collector.getSymbolsIn(querySentence);
     List<Symbol> symbols = SetOps.union(kbSymbols, querySymbols);
     List<Symbol> symbolList = symbols;
     return ttCheckAll(kbSentence, querySentence, symbolList, new Model());
 }
예제 #3
0
        public Model findModelFor(String logicalSentence, int numberOfFlips,
                double probabilityOfRandomWalk)
        {
            myModel = new Model();
            Sentence s = (Sentence)new PEParser().parse(logicalSentence);
            CNFTransformer transformer = new CNFTransformer();
            CNFClauseGatherer clauseGatherer = new CNFClauseGatherer();
            SymbolCollector sc = new SymbolCollector();

            List<Symbol> symbols = sc.getSymbolsIn(s);
            Random r = new Random();
            for (int i = 0; i < symbols.Count; i++)
            {
                Symbol sym = (Symbol)symbols[i];
                myModel = myModel.extend(sym, Util.randombool());
            }
            List<Sentence> clauses = clauseGatherer.getClausesFrom(transformer
                            .transform(s));

            for (int i = 0; i < numberOfFlips; i++)
            {
                if (getNumberOfClausesSatisfiedIn(clauses, myModel) == clauses.Count)
                {
                    return myModel;
                }
                Sentence clause = clauses[random.Next(clauses.Count)];

                List<Symbol> symbolsInClause = sc
                        .getSymbolsIn(clause);
                if (random.NextDouble() >= probabilityOfRandomWalk)
                {
                    Symbol randomSymbol = symbolsInClause[random
                            .Next(symbolsInClause.Count)];
                    myModel = myModel.flip(randomSymbol);
                }
                else
                {
                    Symbol symbolToFlip = getSymbolWhoseFlipMaximisesSatisfiedClauses(
                            clauses,
                            symbolsInClause, myModel);
                    myModel = myModel.flip(symbolToFlip);
                }

            }
            return null;
        }
예제 #4
0
 public void setUp()
 {
     parser = new PEParser();
     collector = new SymbolCollector();
 }
예제 #5
0
            public HornClause(Sentence sentence, PLFCEntails plfcEntails)
            {
                this.plfcEntails = plfcEntails;
                if (sentence is Symbol)
                {
                    _head = (Symbol)sentence;
                    plfcEntails.agenda.Push(_head);
                    premiseSymbols = new List<Symbol>();
                    plfcEntails.count.Add(this, 0);
                    plfcEntails._inferred.Add(_head, false);
                }
                else if (!isImpliedSentence(sentence))
                {
                    throw new ApplicationException("Sentence " + sentence
                            + " is not a horn clause");

                }
                else
                {
                    BinarySentence bs = (BinarySentence)sentence;
                    _head = (Symbol)bs.getSecond();
                    if (plfcEntails._inferred.ContainsKey(_head))
                    {
                        plfcEntails._inferred[_head] = false;
                    }
                    else
                    {
                        plfcEntails._inferred.Add(_head, false);
                    }
                    List<Symbol> symbolsInPremise = new SymbolCollector()
                            .getSymbolsIn(bs.getFirst());
                    foreach(Symbol s in symbolsInPremise)
                    {
                        plfcEntails._inferred.Add(s, false);
                    }
                    premiseSymbols = symbolsInPremise;
                    plfcEntails.count.Add(this, premiseSymbols.Count);
                }

            }
예제 #6
0
        public void testDPLLFindsPurePositiveSymbolsWhenTheyExist()
        {
            Model model = new Model();
            model = model.extend(new Symbol("A"), true).extend(new Symbol("B"),
                    true);
            Sentence sentence = (Sentence)parser
                    .parse("((A AND B) AND (B AND C))");
            List<Sentence> clauseList = new CNFClauseGatherer()
                            .getClausesFrom(new CNFTransformer()
                                    .transform(sentence));
            List<Symbol> symbolList = new SymbolCollector().getSymbolsIn(sentence);

            DPLL.SymbolValuePair sv = dpll.findPureSymbolValuePair(clauseList,
                    model, symbolList);
            Assert.IsNotNull(sv);
            Assert.AreEqual(new Symbol("C"), sv.symbol);
            Assert.AreEqual(true, sv.value);
        }