private int CanApply(Rule r) { int maxLevel = -1; foreach (IFact f in r.Premises) { IFact foundFact = fDB.Search(f.Name); if (foundFact == null) { if (f.Question != null) { foundFact = FactFactory.Fact(f, this); fDB.AddFact(foundFact); maxLevel = Math.Max(maxLevel, 0); } else { return(-1); } } if (!foundFact.Value.Equals(f.Value)) { return(-1); } else { maxLevel = Math.Max(maxLevel, foundFact.Level); } } return(maxLevel); }
public void Solve() { // On fait une copie des règle existantes // + création d'une base de faits vierge bool moreRules = true; RulesBase usableRules = new RulesBase(); usableRules.Rules = new List <Rule>(rDB.Rules); fDB.Clear(); // Tant qu'il existe des règles à appliquer while (moreRules) { // Cherche une règle à appeler Tuple <Rule, int> t = FindUsableRule(usableRules); if (t != null) { // Applique la règle et ajoute le nouveau fait // à la base IFact newFact = t.Item1.Conclusion; newFact.SetLevel(t.Item2 + 1); fDB.AddFact(newFact); // Enlève la règle des règles applicables usableRules.Remove(t.Item1); } else { // PLus de règles possible : on s'arrête moreRules = false; } } // Ecriture du résultat ihm.PrintFacts(fDB.Facts); }