实验一 产生式系统实验
一、实验目的:熟悉一阶谓词逻辑和产生式表示法,掌握产生式系统的运行机制,以及基于规则推理的基本方法。
二、实验内容
设计并编程实现一个小型产生式系统(如:分类、诊断等类型)
三、实验要求
1.具体应用领域自选,具体系统名称自定。
2.用一阶谓词逻辑和产生式规则作为知识表示,利用产生式系统实验程序,建立知识库,分别运行正、反向推理。
四、实验报告要求
1.系统设置,包括系统名称和系统谓词,给出谓词名及其含义。
⒉.编辑知识库,通过输入规则或修改规则等建立规则库。
3.建立事实库((综合数据库),输入多条事实或结论。
4.运行推理,包括正向推理和反向推理,给出相应的推理过程、事实区和规则区。
5.总结实验心得体会。
1. 系统设置
系统名称:植物识别系统
谓词定义:
2. 编辑知识库
默认规则库:
R1:种子有果皮 -> 被子植物
R2:种子无果皮 -> 裸子植物
R3:无茎叶 & 无根 -> 藻类植物
R4:被子植物 & 有托叶 & 有刺 -> 玫瑰
R5:被子植物 & 水生 & 可食用 & 结果实 -> 荷花
R6:被子植物 & 缺水环境 & 有刺 -> 仙人球
R7:藻类植物 & 水生 & 药用 -> 水棉
R8:被子植物 & 有托叶 & 木本 & 可食用 & 结果实 -> 苹果树
R9:被子植物 & 吸引菜粉蝶 & 十字形花冠 & 黄色花 & 可食用 & 结果实 -> 油菜
R10:藻类植物 & 水生 & 可食用 -> 海带
R11:裸子植物 & 木本 & 叶片针状 & 结果实 -> 松树
3. 建立事实库((综合数据库)
(1) 植物个体:
玫瑰、荷花、仙人球、水棉、苹果树、油菜、海带、松树。
(2) 区别个体的特征:
有刺、水生、喜阳、药用、木本、可食用、有白色粉末、叶片针状、结果实、黄色花。
(3) 区别种类的特征:
种子有果皮、种子无果皮、无茎叶、无根、有托叶、吸引菜粉蝶、十字形花冠、缺水环境。
(4) 种类:
被子植物、裸子植物、藻类植物、蔷薇科、十字花科、仙人掌科。
4. 运行推理
具体源码见:demo.java
https://download.csdn.net/download/hgxiaojiujiu/28342999
import java.util.*;
/**
* 产生式系统 --- 植物识别系统
*
* @author whj | CSDN@hgxiaojiujiu
*
*/
public class demo {
//记录数据库植物特征
public static final String data[] = {
"有刺", "水生", "药用", "木本", "可食用", "叶片针状", "结果实", "黄色花",//区别个体的特征
//0 1 2 3 4 5 6 7
"种子有果皮", "种子无果皮", "无茎叶", "无根", "有托叶", "吸引菜粉蝶", "十字形花冠", "缺水环境",//区别种类的特征
// 8 9 10 11 12 13 14 15
"被子植物", "裸子植物", "藻类植物", //种类
// 16 17 18
"玫瑰", "荷花", "仙人球", "水棉", "苹果树", "油菜", "海带", "松树", "无此类植物"}; //植物个体
// 19 20 21 22 23 24 25 26 27
//规则
public static Map<String, Integer> rule = new HashMap<>();
//记录用户选择
public static List<String> userList = new ArrayList<>();
public static int plant = 0;
public static Integer flag = 1;
//系统运行入口
public static void main(String[] args) {
System.out.println("------------欢迎*植物识别系统*-------------");
InitSys();
System.out.println();
while (flag == 1) {
System.out.print("输入植物特征:");
Scanner scanner = new Scanner(System.in);
String choose = scanner.nextLine();
//正向推理
if (choose.length() > 3) {
ChooseComputer_pos(choose);
flag = 0;
break;
}
// 结束
if (Integer.parseInt(choose) == -1) {
flag = 0;
break;
}
userList.add(choose);
ChooseComputer_rev(userList); //条件逐步逆向推断
}
System.out.print("推理过程:");
//推理显示
for (String s : userList) {
System.out.print(data[Integer.parseInt(s)] + "->");
}
System.out.print(data[plant]);
}
已经明确植物的所有特征,直接得出植物
已知植物的部分特征,逐步推理
明确植物目标,但不明确植物特征进行推理
5 .总结实验心得体会。
本系统的规则库是静态的,不能很好的进行增删改操作,这使得在实际运用是不便于系统数据库的修改和维护,对于系统功能更方便地实现增加了一定难度。