Ejemplo n.º 1
0
 public void AddFact(Fact F)
 {
     BF.Add(new Fact(F));
 }
Ejemplo n.º 2
0
 public void AddCondition(Fact newConditions)
 {
     this._Conditions.Add(newConditions);
     return;
 }
Ejemplo n.º 3
0
        private bool Check(LinkedList <Fact> Facts, int Rec)
        {
            if (Facts.Count == 0)
            {
                return(true);
            }
            if (Rec > MaxRec)
            {
                return(false);
            }
            Fact Checked = Facts.First();

            Facts.RemoveFirst();
            foreach (Fact F in KB.BF)
            {
                Fact Copy = new Fact(Checked);
                if (CompareFacts(Checked, F))
                {
                    if (Check(Facts, Rec + 1))
                    {
                        return(true);
                    }
                    else
                    {
                        for (int i = 0; i < Copy.args.Length; ++i)
                        {
                            Checked.args[i].Type  = Copy.args[i].Type;
                            Checked.args[i].Value = Copy.args[i].Value;
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < Copy.args.Length; ++i)
                    {
                        Checked.args[i].Type  = Copy.args[i].Type;
                        Checked.args[i].Value = Copy.args[i].Value;
                    }
                }
            } // Окончание цикла проверки фактов

            foreach (Rule R in KB.BR)
            {
                if (R.BaseFact.Name == Checked.Name)
                {
                    if (R.BaseFact.CountArgs == Checked.CountArgs)
                    {
                        Dictionary <string, Arg> Vars = new Dictionary <string, Arg>();
                        Rule Work = new Rule(R);
                        for (int i = 0; i < Work.BaseFact.CountArgs; ++i)
                        {
                            if (Work.BaseFact.args[i].Type == TYPE_OF_ARG.VARIABLE)
                            {
                                Vars.Add(Work.BaseFact.args[i].Value, Work.BaseFact.args[i]);
                            }
                        }

                        for (int i = 0; i < Work.proof.Length; ++i)
                        {
                            for (int j = 0; j < Work.proof[i].CountArgs; ++j)
                            {
                                if (Work.proof[i].args[j].Type == TYPE_OF_ARG.VARIABLE)
                                {
                                    Arg Temp;
                                    if (Vars.TryGetValue(Work.proof[i].args[j].Value, out Temp))
                                    {
                                        Work.proof[i].args[j] = Temp;
                                    }
                                    else
                                    {
                                        Vars.Add(Work.proof[i].args[j].Value, Work.proof[i].args[j]);
                                    }
                                }
                            }
                        } // было создано правило, в котором все переменные связаны между собой

                        Fact Copy = new Fact(Checked);
                        // Необходимо проверить, не изменились ли аргументы-переменные
                        Fact CopyBase = new Fact(Work.BaseFact);
                        for (int k = 0; k < Work.BaseFact.args.Length; ++k)
                        {
                            CopyBase.args[k] = Work.BaseFact.args[k];
                        }

                        if (CompareFacts(Checked, Work.BaseFact))
                        {
                            // теперь проверяем, изменились ли аргументы-переменные
                            Vars = new Dictionary <string, Arg>();
                            for (int k = 0; k < CopyBase.args.Length; ++k)
                            {
                                if (CopyBase.args[k] != Work.BaseFact.args[k])
                                {
                                    Vars.Add(CopyBase.args[k].Value, Work.BaseFact.args[k]);
                                }
                            }
                            if (Vars.Count != 0)
                            {
                                for (int i = 0; i < Work.proof.Length; ++i)
                                {
                                    for (int j = 0; j < Work.proof[i].CountArgs; ++j)
                                    {
                                        if (Work.proof[i].args[j].Type == TYPE_OF_ARG.VARIABLE)
                                        {
                                            Arg Temp;
                                            if (Vars.TryGetValue(Work.proof[i].args[j].Value, out Temp))
                                            {
                                                Work.proof[i].args[j] = Temp;
                                            }
                                        }
                                    }
                                }
                            }

                            // конец проверки изменения

                            if (Work.Op == OPERATION.AND)
                            {
                                for (int i = Work.proof.Length - 1; i >= 0; --i)
                                {
                                    Facts.AddFirst(Work.proof[i]);
                                }
                                if (Check(Facts, Rec + 1))
                                {
                                    return(true);
                                }
                                else
                                {
                                    for (int i = 0; i < Work.proof.Length; ++i)
                                    {
                                        Facts.RemoveFirst();
                                    }
                                    for (int i = 0; i < Copy.CountArgs; ++i)
                                    {
                                        Checked.args[i].Type  = Copy.args[i].Type;
                                        Checked.args[i].Value = Copy.args[i].Value;
                                    }
                                }
                            } // конец блока в случае операции AND
                            else if (Work.Op == OPERATION.OR)
                            {
                                for (int i = 0; i < Work.proof.Length; ++i)
                                {
                                    Facts.AddFirst(Work.proof[i]);
                                    if (Check(Facts, Rec + 1))
                                    {
                                        return(true);
                                    }
                                    else
                                    {
                                        Facts.RemoveFirst();
                                        for (int j = 0; j < Copy.CountArgs; ++j)
                                        {
                                            Checked.args[j].Type  = Copy.args[j].Type;
                                            Checked.args[j].Value = Copy.args[j].Value;
                                        }
                                    }
                                }
                            } // конец блока в случае операции OR
                        }     // else для  блока if (Compare(Checked, Work.BaseFact))
                        else
                        {
                            for (int i = 0; i < Copy.CountArgs; ++i)
                            {
                                Checked.args[i].Type  = Copy.args[i].Type;
                                Checked.args[i].Value = Copy.args[i].Value;
                            }
                        }
                    } // окончание сравнения кол-ва аргументов
                }
            }         // окончание цикла проверки правил

            Facts.AddFirst(Checked);
            return(false);
        }
Ejemplo n.º 4
0
 public void AddFact(Fact newFact)
 {
     this._Facts.Add(newFact);
     return;
 }