简介
用Python编写的人工智能小程序,实现了基于产生式系统的简易动物识别系统,实现了推理机与规则的分离,用户可以添加新的规则或者删除已有的规则而不影响推理机的正常运行。
源代码
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
from PIL import Image,ImageTk
group_o_animal = [] # 存放动物文件原始数据
group_o_cond = [] # 存放条件文件原始数据
group_o_rule = [] # 存放规则文件原始数据
group_animal = [] # 存放所有动物种类
group_database = [] # 存放动态数据库内容
group_all_rule = [] # 存放所有规则
group_test_rule = [] # 存放待测试规则
group_use_rule = [] # 存放推理过程使用规则
group_con_anim = [] # 存放条件加动物
group1 = [] # 存放条件
root = Tk()
root.title("产生式规则--动物识别系统")
# 读取所有动物种类
sv_anm = StringVar()
def read_animal():
group_o_animal[:] = []
group_animal[:] = []
animal_file = open("files/animal.txt")
for each_line in animal_file:
group_o_animal.append(each_line)
(each_str1, each_str2) = each_line.split(";")
group_animal.append(each_str1)
animal_file.close()
sv_anm.set(group_animal)
read_animal()
# 读取所有规则
def read_rule():
group_o_rule[:] = []
group_all_rule[:] = []
all_rule_file = open("files/rule.txt")
for each_line in all_rule_file:
group_o_rule.append(each_line)
(str1, str2) = each_line.split(' --> ')
(str3, str4) = str2.split(';')
str5 = str1.split(',')
grp1 = []
grp2 = [str3]
for i in str5:
grp1.append(i)
grp2.insert(0, grp1)
group_all_rule.append(grp2)
all_rule_file.close()
read_rule()
# 条件选项
frame1 = Frame(root)
frame1.grid(row=0, column=0, columnspan=2, padx=30, pady=35)
sb1 = Scrollbar(frame1)
sb1.pack(side=RIGHT, fill=Y)
v1 = StringVar(value=group1)
def read_cond():
group_o_cond[:] = []
group1[:] = []
con_file = open("files/condition.txt")
for each_line in con_file:
group_o_cond.append(each_line)
(each_str1, each_str2) = each_line.split(";")
group1.append(each_str1)
con_file.close()
v1.set(group1)
read_cond()
lb1 = Listbox(frame1, listvariable=v1, width=23, selectmode=EXTENDED, yscrollcommand=sb1.set)
lb1.pack(side=LEFT, fill=BOTH)
sb1.config(command=lb1.yview) # 设置为鼠标可拖拽
# 更新条件加动物集合
ca_sv = StringVar()
def update_con_anim():
group_con_anim[:] = group1[:]
for i in group_animal:
group_con_anim.append(i)
ca_sv.set(group_con_anim)
update_con_anim()
ca_sv.set(group_con_anim)
# 使用规则
frame2 = Frame(root)
frame2.grid(row=0, column=2, padx=30, pady=35)
sb2 = Scrollbar(frame2, orient=HORIZONTAL)
sb2.pack(side=BOTTOM, fill=X)
sb2_1 = Scrollbar(frame2)
sb2_1.pack(side=RIGHT, fill=Y)
group2 = ["使用规则:"]
v2 = StringVar(value=group2)
lb2 = Listbox(frame2, listvariable=v2, width=35, xscrollcommand=sb2.set, yscrollcommand=sb2_1.set)
lb2.pack(side=LEFT, fill=BOTH)
sb2.config(command=lb2.xview)
sb2_1.config(command=lb2.yview)
# 添加按钮响应函数
def callback1_1():
# 获取用户选中的条件的索引值
curselection1_1 = lb1.curselection()
# 将用户选中的规则添加到“已添加规则”里
for i in curselection1_1:
lb1.select_clear(i)
if group1[i] not in group4:
group4.append(group1[i])
v4.set(group4)
# 添加按钮
button1_1 = Button(root, text="添加", width=7, command=callback1_1)
button1_1.grid(row=1, column=0, padx=18)
# 删除按钮响应函数
def callback1_2():
# 获取用户选中的条件的索引值
curselection1_2 = lb4.curselection()
# 将索引值下标顺序反序,删除时从后往前删除
curselection1_3 = []
for i in curselection1_2:
curselection1_3.insert(0,i)
# 将用户选中的规则添加到“已添加规则”里
for i in curselection1_3:
lb4.select_clear(i)
group4.pop(i)
v4.set(group4)
# 删除按钮
button1_2 = Button(root, text="删除", width=7, command=callback1_2)
button1_2.grid(row=1, column=1, sticky=W)
# 已添加条件
frame4 = Frame(root)
frame4.grid(row=2, column=0, rowspan=5, columnspan=2, padx=30, pady=35)
sb4 = Scrollbar(frame4)
sb4.pack(side=RIGHT, fill=Y)
group4 = []
v4 = StringVar(value=group4)
lb4 = Listbox(frame4, fg="blue", listvariable=v4, width