Esempio n. 1
0
 public void ImportKB(StreamReader sr)
 {
     //表示知识库已经存在了,可以进行数据的加载了
     while (!sr.EndOfStream)
     {
         string sp;
         LinkedListNode <CAUSE> cp;
         LinkedListNode <RULE>  rp;
         sp = sr.ReadLine();
         if (sp == "" || sp == "\\") //新的规则的标记
         {
             break;
         }
         RULE nr = new RULE(sp);
         rp = new LinkedListNode <RULE>(KnowledgeBase, nr);
         KnowledgeBase.AddFirst(rp);
         sp = sr.ReadLine();
         while (sp != "\\") //表示的是前件
         {
             CAUSE nc = new CAUSE();
             nc.Cause = sp;
             cp       = new LinkedListNode <CAUSE>(rp.Item.Cause_chain, nc);
             rp.Item.Cause_chain.AddLast(cp);
             sp = sr.ReadLine();
         }
     }
     sr.Close();
     MarkKB();
 }
Esempio n. 2
0
        public void InputDB()                 //数据事实
        {
            int    i;
            string sp;
            LinkedListNode <CAUSE> cp;

            FreeDB(DataBase);
            FreeDB(Conclusion);
            for (i = 1; ; i++)
            {
                sp = Interaction.InputBox("Condition " + i + " :(is/can/has)", "Add Condition[" + i + "]");
                if (sp == "")
                {
                    break;
                }
                CAUSE nc = new CAUSE(sp);
                cp = new LinkedListNode <CAUSE>(DataBase, nc); //创建事实库的链表
                DataBase.AddFirst(cp);
            }
        }
Esempio n. 3
0
        public void InputDB()                 //数据事实
        {
            int    i;
            string sp;
            LinkedListNode <CAUSE> cp;

            FreeDB(DataBase);
            FreeDB(Conclusion);

            Console.Write("\n*****please input the knowledge:\n");
            for (i = 1; ; i++)
            {
                Console.Write("\n**tiao jian " + i + " (is/can/has):");
                sp = Console.ReadLine();
                if (sp == "")
                {
                    break;
                }
                CAUSE nc = new CAUSE(sp);
                cp = new LinkedListNode <CAUSE>(DataBase, nc); //创建事实库的链表
                DataBase.AddFirst(cp);
            }
        }
Esempio n. 4
0
        public int FindCause(string causeContent)          //知识库进行数据的匹配,if 和 then 中间的前件知识。
        {
            CAUSE cause = new CAUSE(causeContent);

            return(DataBase.Contains(cause) || Conclusion.Contains(cause) ? 1 : 0);
        }
Esempio n. 5
0
        public void Think()                      //推理机进行推理
        {
            LinkedListNode <RULE>  rp1, rp2;
            LinkedListNode <CAUSE> cp1;
            int    RuleCount, i;
            string sp;

            //用户使用过的规则,添加到数据库当中,因为使用过的规则被裁减下来,放到used当中去了
            if (Used.mHead != null)
            {
                rp1 = Used.mHead;
                while (rp1.next != null)
                {
                    rp1 = rp1.next;
                }
                rp1.next            = KnowledgeBase.mHead;
                KnowledgeBase.mHead = Used.mHead;
                Used.Clear();
            }
            //将结论的表进行清空,以便于进行新的推理解释
            if (Conclusion.mHead != null)
            {
                FreeDB(Conclusion);
            }
            //正式开始进行推理了.
            do
            {
                RuleCount = 0;
                rp1       = KnowledgeBase.mHead; //通过定位两个知识的指针,来进行知识的匹配
                rp2       = KnowledgeBase.mHead;
                while (rp1 != null)
                {
                    cp1 = rp1.Item.Cause_chain.mHead; //第一个规则的前件
                    while (cp1 != null)
                    {
                        if (FindCause(cp1.Item.Cause) == 0) //找到第一个规则当中的数据是否跟用户给出的事实进行匹配,如果有不匹配的退出
                        {
                            break;
                        }
                        else
                        {
                            cp1 = cp1.next;
                        }
                    }
                    if (cp1 != null) //证明没有完全匹配的前件,所以知识库的结果下移动一个位置
                    {
                        rp2 = rp1;
                        rp1 = rp1.next;
                    }
                    else if (FindCause(rp1.Item.Result) == 0)
                    {
                        /*若该条规格的结论文新事实,将该结论加入结论链表,并将该条规则从知识库中取出,插入已经使用的规则链表中*/
                        CAUSE nc = new CAUSE(rp1.Item.Result);
                        cp1 = new LinkedListNode <CAUSE>(Conclusion, nc);
                        Conclusion.AddFirst(cp1);
                        if (rp1.Item.Result == rp2.Item.Result)
                        {
                            rp2 = rp2.next;
                        }
                        else
                        {
                            rp2.next = rp1.next;
                        }
                        Used.AddFirst(rp1);
                        rp1 = rp2;
                        RuleCount++;
                        if (Used.mHead.Item.Lastflag == 1) //若该规则为结论性规则,推理结束.
                        {
                            RuleCount = 0;
                            break;
                        }
                    }
                    else
                    {
                        rp2 = rp1;
                        rp1 = rp1.next;
                    }
                }
            } while (RuleCount > 0);
            if (Conclusion.mHead == null || Used.mHead.Item.Lastflag == 0)
            {
                Console.Write("\n know is not enough!Please add the knowledge:\n");
                Console.Write("\n*****the known knowledge:\n");
                cp1 = DataBase.mHead;
                for (i = 1; cp1 != null; i++)
                {
                    Console.Write("\n**tiao jian" + i + ":(is/can/has) " + cp1.Item.Cause);
                    cp1 = cp1.next;
                }
                Console.Write("\n*****The add knowledge:\n");
                for (; ; i++)
                {
                    Console.Write("\n**tiao jian" + i + ":(shi/can/has)");
                    sp = Console.ReadLine();
                    if (sp == "")
                    {
                        break;
                    }
                    CAUSE nc = new CAUSE(sp);
                    cp1 = new LinkedListNode <CAUSE>(DataBase, nc);
                    DataBase.AddFirst(cp1);
                }
                Think();
            }
            else
            {
                Console.Write("\n this animal is:(is/can/has)\"%s\"\n", Conclusion.mHead.Item.Cause);
            }
        }
Esempio n. 6
0
        public void CreatKB()                  //创建知识库
        {
            LinkedListNode <CAUSE> cp;
            LinkedListNode <RULE>  rp;
            int    i, j;
            string sp;

            FreeKB(KnowledgeBase);
            FreeKB(Used);
            try
            {
                StreamReader sr = new StreamReader("rule.dat");
                //表示知识库已经存在了,可以进行数据的加载了
                while (!sr.EndOfStream)
                {
                    sp = sr.ReadLine();
                    if (sp == "" || sp == "\\") //新的规则的标记
                    {
                        break;
                    }
                    RULE nr = new RULE(sp);
                    rp = new LinkedListNode <RULE>(KnowledgeBase, nr);
                    KnowledgeBase.AddFirst(rp);
                    sp = sr.ReadLine();
                    while (sp != "\\") //表示的是前件
                    {
                        CAUSE nc = new CAUSE();
                        nc.Cause = sp;
                        cp       = new LinkedListNode <CAUSE>(rp.Item.Cause_chain, nc);
                        rp.Item.Cause_chain.AddLast(cp);
                        sp = sr.ReadLine();
                    }
                }
                sr.Close();
            }
            catch (FileNotFoundException)
            {
                Console.Write("\n knowledgebase is not exist,to establish!\n");
                for (i = 1; ; i++)
                {
                    Console.Write("\n********NO  " + i + "  rule********");
                    Console.Write("\n**Conclusion:(is/can/has)"); //首先输入结论
                    sp = Console.ReadLine();
                    if (sp == "")
                    {
                        break;
                    }
                    RULE nr = new RULE(sp);
                    rp = new LinkedListNode <RULE>(KnowledgeBase, nr); //创建规则链
                    KnowledgeBase.AddFirst(rp);
                    for (j = 1; ; j++)
                    {
                        Console.Write("\n***tiao(" + j + ")(is/can/has):"); //输入支持结论的前件(条件)
                        sp = Console.ReadLine();
                        if (sp == "")
                        {
                            break; //回车表示,前件录入结束
                        }
                        CAUSE nc = new CAUSE(sp);
                        cp = new LinkedListNode <CAUSE>(rp.Item.Cause_chain, nc);
                        rp.Item.Cause_chain.AddFirst(cp);
                    }
                }
                if (KnowledgeBase.mHead == null)
                {
                    Console.Write("\n There is no rule in the Knowledgebase!\n");
                    return;
                }
                //将数据保存到文件当中,一共下一次进行数据的调用
                try
                {
                    StreamWriter sw = new StreamWriter("rule.dat");
                    rp = KnowledgeBase.mHead;
                    while (rp != null)
                    {
                        sw.WriteLine(rp.Item.Result);
                        cp = rp.Item.Cause_chain.mHead;
                        while (cp != null)
                        {
                            sw.WriteLine(cp.Item.Cause);
                            cp = cp.next;
                        }
                        sw.WriteLine("\\");  //规则和规则之间用字符"\"分开
                        rp = rp.next;
                    }
                    sw.Close();
                }
                catch (IOException)
                {
                    Console.Write("\n write file is error!\n");
                    return;
                }
            }
            finally
            {
                MarkKB();
            }
        }
Esempio n. 7
0
        public void Think()                      //推理机进行推理
        {
            LinkedListNode <RULE>  rp1, rp2;
            LinkedListNode <CAUSE> cp1;
            int    RuleCount, i;
            string sp;

            //使用过的规则,添加到数据库当中
            if (Used.mHead != null)
            {
                rp1 = Used.mHead;
                while (rp1.next != null)
                {
                    rp1 = rp1.next;
                }
                rp1.next            = KnowledgeBase.mHead;
                KnowledgeBase.mHead = Used.mHead;
                Used.Clear();
            }
            //将结论的表进行清空,以便于进行新的推理解释
            if (Conclusion.mHead != null)
            {
                FreeDB(Conclusion);
            }
            //正式开始推理了
            do
            {
                RuleCount = 0;
                rp1       = KnowledgeBase.mHead; //通过定位两个知识的指针,来进行知识的匹配
                rp2       = KnowledgeBase.mHead;
                while (rp1 != null)
                {
                    cp1 = rp1.Item.Cause_chain.mHead; //第一个规则的前件
                    while (cp1 != null)
                    {
                        if (FindCause(cp1.Item.Cause) == 0) //找到第一个规则当中的数据是否跟用户给出的事实进行匹配,如果有不匹配的退出
                        {
                            break;
                        }
                        else
                        {
                            cp1 = cp1.next;
                        }
                    }
                    if (cp1 != null) //证明没有完全匹配的前件,所以知识库的结果下移动一个位置
                    {
                        rp2 = rp1;
                        rp1 = rp1.next;
                    }
                    else if (FindCause(rp1.Item.Result) == 0)
                    {
                        /*若该条规格的结论文新事实,将该结论加入结论链表,并将该条规则从知识库中取出,插入已经使用的规则链表中*/
                        CAUSE nc = new CAUSE(rp1.Item.Result);
                        cp1 = new LinkedListNode <CAUSE>(Conclusion, nc);
                        Conclusion.AddFirst(cp1);
                        if (rp1.Item.Result == rp2.Item.Result)
                        {
                            rp2 = rp2.next;
                        }
                        else
                        {
                            rp2.next = rp1.next;
                        }
                        Used.AddFirst(rp1);
                        rp1 = rp2;
                        RuleCount++;
                        if (Used.mHead.Item.Lastflag == 1) //若该规则为结论性规则,推理结束.
                        {
                            RuleCount = 0;
                            break;
                        }
                    }
                    else
                    {
                        rp2 = rp1;
                        rp1 = rp1.next;
                    }
                }
            } while (RuleCount > 0);
            if (Conclusion.mHead == null || Used.mHead.Item.Lastflag == 0)
            {
                string known = "Known condition is not enough! Please add more.\n";
                known += "==========\nKnown condition:\n";
                cp1    = DataBase.mHead;
                for (i = 1; cp1 != null; i++)
                {
                    known += ("(" + i + "): " + cp1.Item.Cause + "\n");
                    cp1    = cp1.next;
                }
                MessageBox.Show(known, "Lack Condition", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                for (; ; i++)
                {
                    sp = Interaction.InputBox("Condition " + i + " :(is/can/has)", "Add More Condition[" + i + "]");
                    if (sp == "")
                    {
                        break;
                    }
                    CAUSE nc = new CAUSE(sp);
                    cp1 = new LinkedListNode <CAUSE>(DataBase, nc);
                    DataBase.AddFirst(cp1);
                }
                Think();
            }
            else
            {
                Explain();
            }
        }
Esempio n. 8
0
        public void CreatKB(StreamWriter sw)                  //创建知识库
        {
            LinkedListNode <CAUSE> cp;
            LinkedListNode <RULE>  rp;
            int    i, j;
            string sp;

            FreeKB(KnowledgeBase);
            FreeKB(Used);
            for (i = 1; ; i++)
            {
                sp = Interaction.InputBox("Result:(is/can/has)", "Rule[" + i + "]-Result");//首先输入结论
                if (sp == "")
                {
                    break;
                }
                RULE nr = new RULE(sp);
                rp = new LinkedListNode <RULE>(KnowledgeBase, nr); //创建规则链
                KnowledgeBase.AddFirst(rp);
                for (j = 1; ; j++)
                {
                    //输入支持结论的前件(条件)
                    sp = Interaction.InputBox("Condition " + j + " :(is/can/has)", "Rule[" + i + "]-Condition[" + j + "]");
                    if (sp == "")
                    {
                        break;
                    }
                    CAUSE nc = new CAUSE(sp);
                    cp = new LinkedListNode <CAUSE>(rp.Item.Cause_chain, nc);
                    rp.Item.Cause_chain.AddFirst(cp);
                }
            }
            if (KnowledgeBase.mHead == null)
            {
                MessageBox.Show("There is no rule in the Knowledgebase!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            //将数据保存到文件当中,一共下一次进行数据的调用
            try
            {
                rp = KnowledgeBase.mHead;
                while (rp != null)
                {
                    sw.WriteLine(rp.Item.Result);
                    cp = rp.Item.Cause_chain.mHead;
                    while (cp != null)
                    {
                        sw.WriteLine(cp.Item.Cause);
                        cp = cp.next;
                    }
                    sw.WriteLine("\\");  //规则和规则之间用字符"\"分开
                    rp = rp.next;
                }
                sw.Close();
            }
            catch (IOException)
            {
                MessageBox.Show("Create file \"Rule.rim\" error", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            MarkKB();
        }