/// <summary> /// Применение одного правила /// </summary> /// <param name="r">Это правило</param> public Rightly DoRule(Rule r) { bool verno = true; foreach (Fact fact in r.Reasons) { if (!Fact.ContainsIn(fact, proved.ToArray())) { Fact f = Consult(fact.V); // доказываем и записываем факты proved.Add(f); if (f.Truly == Rightly.Yes) { verno = (fact.CompareTo(f) == 0); } else { verno = false; } // а аналогичные факты - на NO foreach (string s in f.V.Domain.ListVal) { if (s != f.Weight) { proved.Add(new Fact(f.V, s, Rightly.No)); } } if (!verno) { break; // если факт не верен - неверно все правило } } else { // факт уже известен if (Fact.GetFromMas(fact, proved.ToArray()).Truly == Rightly.Yes) { verno = true; } else { verno = false; break; } } } if (verno) // если все верно - делаем вывод { if (r.Result == null || !r.Result.V.Domain.ListVal.Contains(r.Result.Weight)) { throw new DomainException("Правило " + r.Name + " пытается присвоить значение не из домена!"); } r.Result.Truly = Rightly.Yes; proved.Add(r.Result); r.Worked = RuleWork.Signifi; // означилось workedRules.Add(r); return(Rightly.Yes); } else { r.Worked = RuleWork.Unsignify; // не означилось return(Rightly.Unknown); } }
public Rule(Fact reason, Fact result) { this.reasons.Add(reason); this.Result = result; Worked = RuleWork.No; }