public bool AskWithDpll(String queryString)
        {
            Sentence query = null, cnfForm = null;

            //TODO: figure out if we really need to eat the exception here, if so add debug compilation condition
            try {
                // just a check to see that the query is well formed
                query = (Sentence)parser.Parse(queryString);
            } catch (Exception e) {
                Debug.WriteLine("error parsing query" + e.Message);
            }

            Sentence kbSentence  = this.AsSentence();
            Sentence kbPlusQuery = null;

            if (kbSentence != null)
            {
                kbPlusQuery = (Sentence)parser.Parse(" ( " + kbSentence + " AND " + queryString + " )");
            }
            else
            {
                kbPlusQuery = query;
            }
            try {
                cnfForm = new CNFTransformer().Transform(kbPlusQuery);
                // System.out.println(cnfForm.toString());
            } catch (Exception e) {
                Debug.WriteLine("error converting kb +  query to CNF" + e.Message);
            }
            return(new DPLL().DPLLSatisfiable(cnfForm));
        }
Exemple #2
0
        public Model FindModelFor(String logicalSentence, int numberOfFlips,
                                  double probabilityOfRandomWalk)
        {
            this.myModel = new Model();
            var s              = (Sentence) new PEParser().Parse(logicalSentence);
            var transformer    = new CNFTransformer();
            var clauseGatherer = new CNFClauseGatherer();
            var sc             = new SymbolCollector();

            var symbols = sc.GetSymbolsIn(s).ToList();
            var r       = new Random();

            foreach (var sym in symbols)
            {
                this.myModel = this.myModel.Extend(sym, Util.RandomBoolean());
            }

            IList <Sentence> clauses = clauseGatherer.GetClausesFrom(transformer.Transform(s)).ToList();

            //IList<Sentence> ClauseSet = new Converter<Sentence>().ListToSet(clauses);
            lastClauses     = clauses;
            lastClausesFlip = new List <Int64>(clauses.Count + 1);
            for (int i = 0; i < clauses.Count; i++)
            {
                lastClausesFlip.Add(0);
            }

            for (int i = 0; i < numberOfFlips; i++)
            {
                List <int> unsatList = new List <int>();
                int        numSat    = this.GetNumberOfClausesSatisfiedIn(new Converter <Sentence>().ListToSet(clauses), myModel, unsatList);
                if (numSat == clauses.Count)
                {
                    trials = i;
                    return(myModel);
                }
                int probe = FindAnRandomUnsatisfiedClause(clauses, myModel, unsatList);
                //Sentence clause = clauses[random.Next(clauses.Count)];
                Sentence clause = clauses[probe];
                lastClausesFlip[probe]++;

                IList <Symbol> symbolsInClause = sc.GetSymbolsIn(clause).ToList();

                if (random.NextDouble() >= probabilityOfRandomWalk)
                {
                    Symbol randomSymbol = symbolsInClause[random.Next(symbolsInClause.Count)];
                    myModel = myModel.Flip(randomSymbol);
                }
                else
                {
                    Symbol symbolToFlip = this.GetSymbolWhoseFlipMaximisesSatisfiedClauses(
                        new Converter <Sentence>().ListToSet(clauses),
                        symbolsInClause, myModel);
                    myModel = myModel.Flip(symbolToFlip);
                }
            }
            trials = numberOfFlips;
            return(null);
        }
Exemple #3
0
        public void testAimaExample()
        {
            Sentence        aimaEg      = (Sentence)parser.parse("( B11 <=> (P12 OR P21))");
            CNFTransformer  transformer = new CNFTransformer();
            Sentence        transformed = transformer.transform(aimaEg);
            List <Sentence> clauses     = gatherer.getClausesFrom(transformed);
            Sentence        clause1     = (Sentence)parser.parse("( B11 OR  ( NOT P12 )  )");
            Sentence        clause2     = (Sentence)parser.parse("( B11 OR  ( NOT P21 )  )");
            Sentence        clause3     = (Sentence)parser
                                          .parse("(  ( NOT B11 )  OR  ( P12 OR P21 ) )");

            Assert.AreEqual(3, clauses.Count);
            Assert.IsTrue(clauses.Contains(clause1));
            Assert.IsTrue(clauses.Contains(clause2));
            Assert.IsTrue(clauses.Contains(clause3));
        }
Exemple #4
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);
        }
Exemple #5
0
        public bool askWithDpll(String queryString)
        {
            Sentence query = null, cnfForm = null;

            try
            {
                // just a check to see that the query is well formed
                query = (Sentence)parser.parse(queryString);
            }
            catch (Exception e)
            {
                System.Console.WriteLine("error parsing query" + e);
            }

            Sentence kbSentence  = asSentence();
            Sentence kbPlusQuery = null;

            if (kbSentence != null)
            {
                kbPlusQuery = (Sentence)parser.parse(" ( " + kbSentence.ToString()
                                                     + " AND (NOT " + queryString + " ))");
            }
            else
            {
                kbPlusQuery = query;
            }
            try
            {
                cnfForm = new CNFTransformer().transform(kbPlusQuery);
                // System.Console.WriteLine(cnfForm.ToString());
            }
            catch (Exception e)
            {
                System.Console.WriteLine("error converting kb +  query to CNF "
                                         + e);
            }
            return(!new DPLL().dpllSatisfiable(cnfForm));
        }
 public void setUp()
 {
     transformer = new CNFTransformer();
 }