学生实验报告实验课名称:人工智能实验项目名称:产生式系统实验专业名称:计算机科学与技术班级:2012240201学号:12学生姓名:雷彬教师姓名:陈亮亮2014年12月10日实验日期:2012年12月10日实验室名称:明远2202一.实验名称:产生式系统实验二.实验目的与要求:1、确定推理方法(正向还是反向),并根据问题设计实现一个简单的不通用推理机(匹配、冲突消解)2、规则库要求至少包含15条规则3、初始事实可以任意给定,输入初始事实后能够得到推理结果4、设计人机界面,解释模块提供查询规则的功能5、可以不考虑知识库管理模块6、提交实验报告7、报告中要有推理树三.实验内容:动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。四.算法描述:动物识别的15条规则:规则1:如果:动物有毛发则:该动物是哺乳动物规则2:如果:动物能产奶则:该单位是哺乳动物规则3:如果:该动物有羽毛则:该动物是鸟规则4:如果:动物会飞,且会下蛋则:该动物是鸟规则5:如果:动物吃肉则:该动物是肉食动物规则6:如果:动物有犬齿,且有爪,且眼盯前方则:该动物是食肉动物规则7:如果:动物是哺乳动物,且有蹄则:该动物是有蹄动物规则8:如果:动物是哺乳动物,且是反刍动物则:该动物是有蹄动物规则9:如果:动物是哺乳动物,且是食肉动物,且是黄褐色的,且有暗斑点则:该动物是豹规则10:如果:动物是黄褐色的,且是哺乳动物,且是食肉,且有黑条纹则:该动物是虎规则11:如果:动物有暗斑点,且有长腿,且有长脖子,且是有蹄类则:该动物是长颈鹿规则12:如果:动物有黑条纹,且是有蹄类动物则:该动物是斑马规则13:如果:动物有长腿,且有长脖子,且是黑色的,且是鸟,且不会飞则:该动物是鸵鸟规则14:如果:动物是鸟,且不会飞,且会游泳,且是黑色的则:该动物是企鹅规则15:如果:动物是鸟,且善飞则:该动物是信天翁首先给定初始事实,将初始事实放入动态数组中,并用初始事实与15条规则进行匹配,如果规则匹配成功,将规则的后件存入数组中,再用数组中所有的元素与规则进行匹配,满足即加入数组,直到匹配出动物。如果给定初始事实能推出多种动物,按照数组中条件的先后顺序,顺序循环匹配规则,先匹配出哪种动物就显示该动物。五.源程序://MFC_AnimalDlg.cpp:实现文件#includestdafx.h#includeMFC_Animal.h#includeMFC_AnimalDlg.h#includeafxdialogex.h#ifdef_DEBUG#definenewDEBUG_NEW#endif//用于应用程序“关于”菜单项的CAboutDlg对话框classCAboutDlg:publicCDialogEx{public:CAboutDlg();//对话框数据enum{IDD=IDD_ABOUTBOX};protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持//实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialogEx(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)END_MESSAGE_MAP()//CMFC_AnimalDlg对话框CMFC_AnimalDlg::CMFC_AnimalDlg(CWnd*pParent/*=NULL*/):CDialogEx(CMFC_AnimalDlg::IDD,pParent){m_hIcon=AfxGetApp()-LoadIcon(IDR_MAINFRAME);}voidCMFC_AnimalDlg::DoDataExchange(CDataExchange*pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX,IDC_COMBO1,m_point1);DDX_Control(pDX,IDC_COMBO4,m_point2);DDX_Control(pDX,IDC_COMBO5,m_point3);DDX_Control(pDX,IDC_COMBO6,m_point4);DDX_Control(pDX,IDC_COMBO7,m_point5);DDX_Control(pDX,IDC_COMBO8,m_point6);DDX_Control(pDX,IDC_COMBO9,m_point7);}BEGIN_MESSAGE_MAP(CMFC_AnimalDlg,CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON2,&CMFC_AnimalDlg::OnClickedButton2)ON_BN_CLICKED(IDC_BUTTON1,&CMFC_AnimalDlg::OnClickedButton1)END_MESSAGE_MAP()//CMFC_AnimalDlg消息处理程序BOOLCMFC_AnimalDlg::OnInitDialog(){CDialogEx::OnInitDialog();//将“关于...”菜单项添加到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){BOOLbNameValid;CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if(!strAboutMenu.IsEmpty()){pSysMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码m_point1.SetCurSel(0);//设置组合框的默认值为第一项m_point2.SetCurSel(0);m_point3.SetCurSel(0);m_point4.SetCurSel(0);m_point5.SetCurSel(0);m_point6.SetCurSel(0);m_point7.SetCurSel(0);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}voidCMFC_AnimalDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==IDM_ABOUTBOX){CAboutDlgdlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID,lParam);}}//如果向对话框添加最小化按钮,则需要下面的代码//来绘制该图标。对于使用文档/视图模型的MFC应用程序,//这将由框架自动完成。voidCMFC_AnimalDlg::OnPaint(){if(IsIconic()){CPaintDCdc(this);//用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND,reinterpret_castWPARAM(dc.GetSafeHdc()),0);//使图标在工作区矩形中居中intcxIcon=GetSystemMetrics(SM_CXICON);intcyIcon=GetSystemMetrics(SM_CYICON);CRectrect;GetClientRect(&rect);intx=(rect.Width()-cxIcon+1)/2;inty=(rect.Height()-cyIcon+1)/2;//绘制图标dc.DrawIcon(x,y,m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSORCMFC_AnimalDlg::OnQueryDragIcon(){returnstatic_castHCURSOR(m_hIcon);}voidCMFC_AnimalDlg::OnClickedButton2(){//TODO:在此添加控件通知处理程序代码((CListBox*)GetDlgItem(IDC_LIST1))-ResetContent();inti,j,n;intflag=1;boolcheck=true;CStringmsg;CStringpoint[7];CStringFact[10];intk=-1;m_point1.GetWindowText(point[0]);m_point2.GetWindowText(point[1]);m_point3.GetWindowText(point[2]);m_point4.GetWindowText(point[3]);m_point5.GetWindowText(point[4]);m_point6.GetWindowText(point[5]);m_point7.GetWindowText(point[6]);for(i=0;i=5;i++){if(point[i]!=无){for(j=i+1;j=6;j++){if(point[i]==point[j]){check=false;}}}}if(check==false){MessageBox(L特征不能一样!);}else{for(i=0;i=6;i++)//初始事实放入综合数据库中{if(point[i]!=无){k++;Fact[k]=point[i];((CListBox*)GetDlgItem(IDC_LIST1))-InsertString(k,point[i]);}}for(i=0;i=k;i++)//R1{if(Fact[i]==有毛发){msg=哺乳动物;((CListBox*)GetDlgItem(IDC_LIST1))-InsertString(k+1,msg);k++;Fact[k]=msg;}}if(Fact[k]!=哺乳动物)//R2{for(i=0;i=k;i++){if(Fact[i]==有奶){msg=哺乳动物;((CListBox*)GetDlgItem(IDC_LIST1))-InsertString(k+1,msg);k++;Fact[k]=msg;}}}//Sleep(1000);for(i=0;i=k;i++)//R3{if(Fact[i]==有羽毛){msg=鸟;((CListBox*)GetDlgItem(IDC_LIST1))-InsertString(k+1,msg);k++;Fact[k]=msg;}}n=0;if(Fact[k]!=鸟)//R4{for(i=0;i=k;i++){if(Fact[i]==会飞){n++;}if(Fact[i]==会下蛋){n++