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