产生式系统

概念

产生式系统(production system)是指认知心理学程序表征系统的一种。为解决某一问题或完成某一作业而按一定层次联结组成的认知规则系统。

原理

产生式系统由规则库、推理机、综合数据库,控制程序四部分组成。其中,规则库里面存储大量的知识,综合数据库则是储存事实,综合数据库通过推理机根据规则库里面的知识,由控制程序的控制下完成推理,若是推出中间结果,则把中间结果放到综合数据库中,继续重新推理,直到推理出最终结果或推理失败,程序结束。

例子

下面我们就以交通工具识别系统为例,用java编写。
规则库:
R1:it_is(车),postive(体型小),postive(有轮子);
R2:it_is(飞机),postive(体型大),postive(流线型);
R3:it_is(飞机),postive(天上飞的);
R4:it_is(船),postive(水上游的);
R5:it_is(车),postive(地上跑的);
R6:trto_is(轮船),it_is(船),postive(体型大),postive(冒黑烟);
R7:trto_is(航天飞机),it_is(飞机),postive(有机翼);
R8:trto_is(直升机),it_is(飞机),postive(有螺旋桨);
R9:trto_is(汽车),it_is(车),postive(四个轮);
R10:trto_is(两轮车),it_is(车),postive(两个轮);
代码:
MainGui.java
该类为主界面类,调用GuiFrame类(自定义的类,代码在后面)显示主窗口。

package chanshengsi01;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class MainGUI {

	public static void main(String[] args) {
		GuiFrame g=new GuiFrame("交通工具识别");//主窗口
	}

}

GuiFrame.java
该类主要实现主界面的布局,以及两个按钮的监听器。点击匹配按钮会调用Brain(自定义的类,代码在后面)类的identify函数,来根据输入到综合数据库的事实去匹配结果。点击查看规则按钮会调用GuiRules(自定义的类,代码在后面)显示出规则库里面的知识。

package chanshengsi01;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class GuiFrame extends JFrame {
	JButton button;//匹配按钮
	JButton button1;//查看规则按钮
	JLabel label;//标题标签
	JLabel label_result;//结果标签
	JTextField textField1;//输入框1
	JTextField textField2;//输入框2
	JTextField textField3;//输入框3
	JTextField textField4;//输入框4
	Container contentPane;

	public GuiFrame(String title) {
		super(title);
		this.setSize(330, 350);
		this.setLocation(350, 150);
		this.setDefaultLookAndFeelDecorated(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		button = new JButton("匹配");
		button.setBounds(60, 168, 75, 30);
		button1 = new JButton("查看规则");
		button1.setBounds(150, 168, 100, 30);
		label = new JLabel("设置事实:");
		label.setBounds(120, 2, 90, 50);
		label_result = new JLabel("最终结果是:");
		label_result.setBounds(60, 210, 200, 20);
		textField1 = new JTextField(16);
		textField1.setBounds(55, 40, 200, 23);
		textField2 = new JTextField(16);
		textField2.setBounds(55, 72, 200, 23);
		textField3 = new JTextField(16);
		textField3.setBounds(55, 104, 200, 23);
		textField4 = new JTextField(16);
		textField4.setBounds(55, 136, 200, 23);
		contentPane = this.getContentPane();
		contentPane.setLayout(null);

		// 添加控件
		contentPane.add(label);
		contentPane.add(textField1);
		contentPane.add(textField2);
		contentPane.add(textField3);
		contentPane.add(textField4);
		contentPane.add(button);
		contentPane.add(button1);
		contentPane.add(label_result);
		// 设置按钮点击作用
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ArrayList al = new ArrayList();
				String str1 = textField1.getText();// 获取输入内容
				if (!str1.equals("")) {
					al.add(str1);
				}
				String str2 = textField2.getText();// 获取输入内容
				if (!str2.equals("")) {
					al.add(str2);
				}
				String str3 = textField3.getText();// 获取输入内容
				if (!str3.equals("")) {
					al.add(str3);
				}
				String str4 = textField4.getText();// 获取输入内容
				if (!str4.equals("")) {
					al.add(str4);
				}

				// 匹配
				Brain brain = new Brain();
				String result = brain.identify(al);

				// 结果界面
				label_result.setText("最终结果是:" + result);
				setVisible(true);
			}
		});

		button1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				GuiRules gt=new GuiRules();
			}
		});
		this.setVisible(true);

	}
}

GuiRules.java
主要用于展示规则库的知识。

package chanshengsi01;

import java.awt.Container;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class GuiRules extends JFrame {
	JLabel l;
	String s;
	Rules rule;
	Rules[] r;
	Container contentPane;

	GuiRules() {
		super("查看规则");

		this.setSize(400, 400);
		this.setLocation(800, 150);
		this.setDefaultLookAndFeelDecorated(true);
		contentPane = this.getContentPane();
		contentPane.setLayout(null);
		rule = new Rules();
		r = new Rules[10];
		r = rule.RuleInit();
		int x=0;
		for (int i = 0; i < 10; i++) {
			ArrayList a = r[i].getCondition();
			s = "R"+i+":  "+(String) a.get(0);
			for (int j = 1; j < a.size(); j++) {
				s = s + "+" + a.get(j);
			}
			s=s+"--->"+r[i].result;
			l=new JLabel(s);
			l.setBounds(20, x, 300, 100);
			x=x+20;
			contentPane.add(l);
		}

		this.setVisible(true);
	}
}

Rules.java
规则库

package chanshengsi01;
import java.util.ArrayList;

public class Rules {
	ArrayList condition;
	String result;
	int is_temp;
	int is_use = 0;

	Rules() {
		condition = new ArrayList();
	}

	public int getIs_use() {
		return is_use;
	}

	public void setIs_use(int is_use) {
		this.is_use = is_use;
	}

	public int getIs_temp() {
		return is_temp;
	}

	public void setIs_temp(int is_temp) {
		this.is_temp = is_temp;
	}

	public ArrayList getCondition() {
		return condition;
	}

	public void setCondition(ArrayList condition) {
		this.condition = (ArrayList) condition.clone();
	}

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}

	public static Rules[] RuleInit() {
		Rules[] r = new Rules[10];

		Rules rule0 = new Rules();
		r[0] = rule0;
		ArrayList c0 = new ArrayList();
		c0.add("体型小");
		c0.add("有轮子");
		r[0].setCondition(c0);
		r[0].setResult("车");
		r[0].setIs_temp(1);

		Rules rule1 = new Rules();
		r[1] = rule1;
		ArrayList c1 = new ArrayList();
		c1.add("体型大");
		c1.add("流线型");
		r[1].setCondition(c1);
		r[1].setResult("飞机");
		r[1].setIs_temp(1);

		Rules rule2 = new Rules();
		r[2] = rule2;
		ArrayList c2 = new ArrayList();
		c2.add("天上飞的");
		r[2].setCondition(c2);
		r[2].setResult("飞机");
		r[2].setIs_temp(1);

		Rules rule3 = new Rules();
		r[3] = rule3;
		ArrayList c3 = new ArrayList();
		c3.add("水上游的");
		r[3].setCondition(c3);
		r[3].setResult("船");
		r[3].setIs_temp(1);

		Rules rule4 = new Rules();
		r[4] = rule4;
		ArrayList c4 = new ArrayList();
		c4.add("地上跑的");
		r[4].setCondition(c4);
		r[4].setResult("车");
		r[4].setIs_temp(1);

		Rules rule5 = new Rules();
		r[5] = rule5;
		ArrayList c5 = new ArrayList();
		c5.add("体型大");
		c5.add("冒黑烟");
		c5.add("船");
		r[5].setCondition(c5);
		r[5].setResult("轮船");
		r[5].setIs_temp(0);

		Rules rule6 = new Rules();
		r[6] = rule6;
		ArrayList c6 = new ArrayList();
		c6.add("飞机");
		c6.add("有机翼");
		r[6].setCondition(c6);
		r[6].setResult("航天飞机");
		r[6].setIs_temp(0);

		Rules rule7 = new Rules();
		r[7] = rule7;
		ArrayList c7 = new ArrayList();
		c7.add("飞机");
		c7.add("有螺旋桨");
		r[7].setCondition(c7);
		r[7].setResult("直升机");
		r[7].setIs_temp(0);

		Rules rule8 = new Rules();
		r[8] = rule8;
		ArrayList c8 = new ArrayList();
		c8.add("车");
		c8.add("四个轮");
		r[8].setCondition(c8);
		r[8].setResult("汽车");
		r[8].setIs_temp(0);

		Rules rule9 = new Rules();
		r[9] = rule9;
		ArrayList c9 = new ArrayList();
		c9.add("车");
		c9.add("两个轮");
		r[9].setCondition(c9);
		r[9].setResult("两轮车");
		r[9].setIs_temp(0);
		return r;
	}
}

Postive.java
综合数据库,用于接收用户输入的事实或者推理机产生的中间结果。

package chanshengsi01;

import java.util.ArrayList;

public class Postive {
	public ArrayList s1;

	Postive() {
		s1 = new ArrayList();
	}

	public ArrayList getS1() {
		return s1;
	}
	public void setS1(ArrayList s1) {
		this.s1 = (ArrayList) s1.clone();
	}
	public void delete() {
		this.s1.clear();
	}
}

Brain.java
控制程序,控制推理机进行推理。

package chanshengsi01;
import java.util.ArrayList;

public class Brain {
	GuiTemp gt;

	public String identify(ArrayList al) {
		String result = null;

		Postive p = new Postive();
		p.setS1(al);

		Check ch = new Check();

		Rules rule = new Rules();
		Rules[] r = new Rules[10];
		r = rule.RuleInit();

		int i;
		for (i = 0; i < r.length; i++) {
			if (r[i].getIs_use() == 0 && ch.checkRule(r[i].getCondition(), p.getS1()) == 1) {
				if (r[i].getIs_temp() == 0) {
					// 如果不是中间值,打印最终结果;
					result = r[i].getResult();
					break;
				} else {
					r[i].setIs_use(1);
					// 如果是中间值,显示出来,并把结论加到postive中
					// 显示中间结果界面
					gt = new GuiTemp(r[i]);

					p.s1.add(r[i].getResult());
					// 进行下一轮匹配
					i = 0;
				}

			}
		}
		// 如果未匹配到,则机器不认识
		if (i >= r.length) {
			result = "不认识";
		}

		return result;

	}
}

Check.java
用于推理匹配,检查规则库中是否有符合的知识。

package chanshengsi01;

import java.util.ArrayList;

public class Check {

	public int checkRule(ArrayList a1, ArrayList a2) {
		int length1 = a1.size();
		int length2 = a2.size();
		for (int i = 0; i < length1; i++) {

			String s1 = (String) a1.get(i);
			int j;
			for (j = 0; j < length2; j++) {
				String s2 = (String) a2.get(j);
				if (s1.equals(s2)) {
					break;
				}
			}

			if (j >= length2) {
				return 0;
			}

		}
		return 1;
	}
}

GuiTemp.java
用于显示中间结果,如果推理出中间结果,则显示出来。

package chanshengsi01;

import java.awt.Container;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class GuiTemp extends JFrame {
	JLabel l1;
	Container contentPane;
	String s1="";

	public GuiTemp(Rules r) {
		super("推理出中间结果");
		
		this.setSize(200, 200);
		this.setLocation(800, 150);
		this.setDefaultLookAndFeelDecorated(true);
		contentPane = this.getContentPane();
		contentPane.setLayout(null);
		
		
		ArrayList a=r.getCondition();
		s1=(String) a.get(0);
		for(int i=1;i<a.size();i++) {
			s1=s1+"+"+a.get(i);
		}
		s1=s1+"--->"+r.result;
		l1=new JLabel(s1);
		l1.setBounds(20, 20, 200, 100);
		contentPane.add(l1);
		this.setVisible(true);
	}
}

运行结果

主界面的截图
主界面的截图
查看规则后截图:
查看规则库
匹配后截图

匹配后截图

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐