
实 验 报 告
一、实验目的及要求
1. 理解产生式系统的结构原理与实际应用。
2. 掌握产生式规则表示及规则库组建的实现方法。
3. 理解推理机的算法原理并掌握其编程实现方法。
二、实验设备(环境)及方式
1. 实验环境:PC机,Windows XP,VC(可自选);
2. 实验方式:两人一组,开发某个产生式系统分别实现正向推理和反向推理,系统主题可自选。
三、实验内容与要求
运用所学知识,设计并编程实现一个简单的产生式系统(如三角形判定系统、动物识别系统、感冒诊断系统等)。
1. 简单产生式系统的名称与推理方式
①名称:动物识别系统(正向)
②推理方式:正向使用规则,即问题的初始状态作为初始数据库,仅当数据库中的事实满足某条规则的前提时,该规则才能被使用。
2. 简单产生式系统的总体设计(系统组成模块及功能说明,包括人机交互模块、规则库存储及管理模块、综合数据库管理模块以及推理机制模块等)。
①人机交互模块:通过勾选系统给出的判别条件来输入判别信息。如图1,2所示:
3. 简单产生式系统的详细设计(包括数据结构设计、参数设计、函数说明以及产生式规则集)
①数据结构设计:
class Animal //定义实体存放规则
{
int a_id;
public int A_id
{
get { return a_id; }
set { a_id = value; }
}
private String a_condition;
public String A_condition
{
get { return a_condition; }
set { a_condition = value; }
}
private String a_result;
public String A_result
{
get { return a_result; }
set { a_result = value; }
}
}
②参数设计:
int[] temp = new int[50]; // 存储当前所选择的的事实及推导出来的事实编号
string[] factInput = new string[30];
// 存储当前所选择的的事实及推导出来的事实内容
public static string[] factSelected = new string [20];
// 存储用户选择的事实,方便两个界面传递数据
public static int factLength; // 存储事实库中的实际数据个数
string[] resultList = new string[length]; // 存储规则库中所有后件
string[][] conditionList = new string[length][]; // 存储规则库中所有前件
③函数说明:
public List public Animal getResultByID(int a_id); // 根据ID取出规则的后件 private void Compare(string[] factInput,string[][] conditionList,int j); // 匹配规则和已知事实库 private void InsertRules(Animal a); // 将匹配成功的规则显示在界面上 4. 系统流程 5. 源程序清单 ①用户选择界面:Form1 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using animal_IS.data; namespace animal_IS { public partial class Form1 : Form { int[] temp = new int[50];//存?储洹?当獭?前°所ù选?择?的?实害?事?以?及°推?导?出?来ぁ?的?事?实害? public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.checkBox1.Checked = false; this.checkBox2.Checked = false; this.checkBox3.Checked = false; this.checkBox4.Checked = false; this.checkBox5.Checked = false; this.checkBox6.Checked = false; this.checkBox7.Checked = false; this.checkBox8.Checked = false; this.checkBox9.Checked = false; this.checkBox10.Checked = false; this.checkBox11.Checked = false; this.checkBox12.Checked = false; this.checkBox13.Checked = false; this.checkBox14.Checked = false; this.checkBox15.Checked = false; this.checkBox16.Checked = false; this.checkBox17.Checked = false; this.checkBox18.Checked = false; this.checkBox19.Checked = false; this.checkBox20.Checked = false; this.checkBox21.Checked = false; this.checkBox22.Checked = false; for (int i = 0; i Program.factSelected[i] = null; } }//重?置?所ù有瓺选?项? private void button2_Click(object sender, EventArgs e) { int[] factNum = new int [20]; int k = 0; for (int i = 1; i <= 22; i++) { CheckBox che = (CheckBox)this.groupBox1.Controls.Find("checkBox"+i, true)[0]; if (che.Checked) { factNum[k] = i; k++;//记?录?用?户§输?入?事?实害?的?编括?号? } } Program.factLength = k; for (int j = 0; j < factNum.Length; j++) { DB data = new DB(); string sql = "select factContent from [fact] where factID=" + factNum[j]; //根ù据Y编括?号?查é找ò出?规?则ò的?前°键ü的?内ú容╕,?显?示?在útextbox中D DataTable dt = data.query(sql); if (dt.Rows.Count > 0) { Program.factSelected[j] = dt.Rows[0][0].ToString(); } } Form2 fr = new Form2(); fr.ShowDialog(); } } } ②结果显示界面:Form2 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using animal_IS.data; using animal_IS.business; using animal_IS.entity; namespace animal_IS { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { /**********************将?数簓据Y库a中D的?数簓据Y取?出?放?在ú二t维?数簓组哩?里?*******************************/ List AnimalOption aop = new AnimalOption(); ls = aop.getAll(); int length = ls.Count; string[] resultList = new string[length]; string[][] conditionList = new string[length][]; for (int i = 0; i < length; i++) { resultList[i] = ls[i].A_result; conditionList[i] = ls[i].A_condition.Split(',?'); } /************************************************************************************/ /****************读á取?出?用?户§选?择?的?内ú容╕,?显?示?出?来ぁ?,?并¢放?入?数簓组哩 actInput*****************/ string fact = null; string[] factInput = new string[30]; //定¨义?数簓组哩?,?用?来ぁ?存?储洹?用?户§输?入?的?已?知a事?实害?库a for (int i = 0; i < Program.factSelected.Length; i++) { fact += " " + Program.factSelected[i]; factInput[i] = Program.factSelected[i]; } this.textBox3.Text = fact; /**********************************************************************************/ string start = "/***********************推?理え?开a始?**********************/\\r\\n\\r\\n"; textBox1.Text = start; for (int j = 0; j < conditionList.Length; j++) { if (conditionList[j] != null) { Compare(factInput, conditionList, j); } } if (this.textBox1.Text.Equals(start)) { this.textBox1.Text += "糟?糕a了?,?啥?也?没?推?出?。£o(╯ □?╰ )oTry Again?"; } if (factInput[Program.factLength-1].Equals("老?虎¢")) { this.textBox2.Text = "O(∩é_∩é)O~~~老?虎¢"; return; } if (factInput[Program.factLength-1].Equals("豹繿子哩?)) { this.textBox2.Text = "O(∩é_∩é)O~~~豹繿子哩?; return; } if (factInput[Program.factLength-1].Equals("斑?马í")) { this.textBox2.Text = "O(∩é_∩é)O~~~斑?马í"; return; } if (factInput[Program.factLength-1].Equals("长¤颈±鹿1")) { this.textBox2.Text = "O(∩é_∩é)O~~~长¤颈±鹿1"; return; } if (factInput[Program.factLength-1].Equals("海£鸟?")) { this.textBox2.Text = "O(∩é_∩é)O~~~海£鸟?"; return; } if (factInput[Program.factLength-1].Equals("企ó鹅ì")) { this.textBox2.Text = "O(∩é_∩é)O~~~企ó鹅ì"; return; } if (factInput[Program.factLength-1].Equals("鸵 ?鸟?")) { this.textBox2.Text = "O(∩é_∩é)O~~~鸵 ?鸟?"; return; } else { this.textBox2.Text = "o_O? 小?的?才?疏酣?学§浅3没?见?过y这a动ˉ物?,?你?丫?上?火e星?找ò去ǎ?吧悒?!?"; } } private void Compare(string[] factInput,string[][] conditionList,int j) { int flag = 0; //将?匹¥配?标括?志?个?数簓 int width = conditionList[j].Length; for(int k = 0; k for(int m=0; m if((conditionList[j][k].Equals(factInput[m]))) { flag ++; //一?旦?有瓺规?则ò前°键ü不?与?已?知a事?实害?库a匹¥配?的?,?匹¥配?标括?志?个?数簓加ó1 } } } if(flag==width) //当獭?一?条?规?则ò中D的?所ù有瓺前°键ü都?匹¥配?时骸? { Animal a = new Animal(); AnimalOption aop = new AnimalOption(); a = aop.getResultByID(j + 1); //获?取?该?条?规?则ò string result = a.A_result; //获?得?完 ?全?匹¥配?的?后ó键ü Program.factLength++; //已?知a事?实害?库afactInput的?非?空?位?数簓加ó1 factInput[Program.factLength-1] = result; //将?匹¥配?规?则ò的?后ó键ü放?入?已?知a实害?时骸?库a中D InsertRules(a); //讲2该?条?规?则ò显?示?出?来ぁ? } else { return; } } private void InsertRules(Animal a) { string condition = a.A_condition; string result = a.A_result; int id = a.A_id; string run = null; run = "使?用?第台? + id + "条?规?则ò:阰 " + condition + " ╮ (╯ ▽?╰ )╭ >> " + result + "\\r\\n\\r\\n"; this.textBox1.Text += run; } } } 四、分析讨论 签名: 日期:2013.4 1.系统演示 a) 界面显示要求 (1)有若干选择初始事实的选择列表; (2) 显示规则的调用次序及综合数据库的变化过程;(正向推理中显示每使用一次规则后,产生的新事实。反向推理中显示新的目标事实有哪些需要证明及哪些已经得到证实); (3)显示最后的推理结果。 b) 代码基本功能的实现要求 初始事实的输入;规则的存储与载入;规则匹配、冲突消解、规则执行;结果输出。 2.提交实验报告
说明:实验检查方式(7-8周) 此次试验在建立数据库的过程中斟酌了很久,最终选定前件和后件各为一个属性的办法,最后使用的时候取出放入二维数组,这样既方便取出,又减少了数据冗余。 六、教师评语 成绩
