コード例 #1
0
ファイル: ExpertSystem.cs プロジェクト: zerbst901/ES
        /// <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);
            }
        }
コード例 #2
0
 public Rule(Fact reason, Fact result)
 {
     this.reasons.Add(reason);
     this.Result = result;
     Worked      = RuleWork.No;
 }