产生式系统
内容:
- 建立规则库
- 实现推理,打印推理过程,可文字或画图
例子:
输入:暗斑点、长脖子、长腿、奶、蹄
输出:
规则库如下:
实验中的条件、中间结论、最终结论:(需要自己分析哦!)
实验原理:
规则库:某一个领域内知识的产生式集合
综合数据库:存放问题求解过程中各种当前信息的数据结构(问题的初始状态、原始证据、推理的中间结论与最终结论)
推理解:推理算法,控制产生式系统的运行,实现对问题的求解。
代码如下:
import numpy as np;
# 确定是否有将推理出的中间结论特征加入features(list)中
def judge_repeat(value,list=[]):
for i in range(0,len(list)):
if(list[i]==value):
return 1
else:
if(i!=len(list)-1):
continue
else:
return 0
# 综合数据库
dict_data = {
# 前提条件
'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': '长颈鹿', '28': '斑马','29': '鸵鸟', '30': '企鹅', '31': '信天翁'
}
# 特征展示:
def printInfo():
print('''特征展示:
*1:有毛发 2:产奶 3:有羽毛 4:会飞 5:会下蛋 *
*6:吃肉 7:有犬齿 8:有爪 9:眼盯前方 10:有蹄 *
*11:反刍 12:黄褐色 13:暗斑点 14:有黑色条纹 15:长脖 *
*16:长腿 17:不会飞 18:会游泳 19:黑白二色 20:善飞 *
*21:哺乳类 22:鸟类 23:食肉类 24:有蹄类 *
''' )
# 用户输入:
def InputFeature():
print("请输入对应特征数字,并用英文','进行分割!")
num_real=input("请输入:")
features=num_real.split(",")
return features
# 匹配动物,获取最终结论
def matchfeatureanimal(features):
# 判别是否匹配到动物
flag=0;
for i in features:
if (i == '23'):
for i in features:
if (i == '12'):
for i in features:
if (i == '21'):
for i in features:
if (i == '13'):
flag=1
print("黄褐色,暗斑点,哺乳类,食肉类->金钱豹\n")
print("所识别的动物为金钱豹")
return 0
elif (i == '14'):
flag = 1
print("黄褐色,有黑色条纹,哺乳类,食肉类->虎\n")
print("所识别的动物为虎")
return 0
elif (i == '14'):
for i in features:
if (i == '24'):
flag = 1
print("有黑色条纹,蹄类->斑马\n")
print("所识别的动物为斑马")
return 0
elif (i == '24'):
for i in features:
if (i == '13'):
for i in features:
if (i == '15'):
for i in features:
if (i == '16'):
flag = 1
print("暗斑点,长腿,长脖,蹄类->长颈鹿\n")
print("所识别的动物为长颈鹿")
return 0
elif (i == '20'):
for i in features:
if (i == '22'):
flag = 1
print("善飞,鸟类->信天翁\n")
print("所识别的动物为信天翁")
return 0
elif (i == '22'):
for i in features:
if (i == '17'):
for i in features:
if (i == '15'):
for i in features:
if (i == '16'):
flag = 1
print("不会飞,长脖,长腿,鸟类->鸵鸟\n")
print("所识别的动物为鸵鸟")
return 0
elif (i == '17'):
for i in features:
if (i == '22'):
for i in features:
if (i == '18'):
for i in features:
if (i == '19'):
flag = 1
print("不会飞,会游泳,黑白二色,鸟类->企鹅\n")
print("所识别的动物企鹅")
return 0
else:
if (features.index(i) != len(features)-1):
continue
if(flag==0):
print("\n根据当前所给条件无法判断这些特征构成规则库中七种动物中的哪一种动物\n请增加初始综合数据库的信息!")
# 获取中间结论
def matchfeaturecategory(features) :
for i in features:
if (i == '1'):
if (judge_repeat('21', features) == 0):
features.append('21')
print("有毛发->哺乳类")
elif (i == '2'):
if (judge_repeat('21', features) == 0):
features.append('21')
print("产奶->哺乳类")
elif (i == '3'):
if (judge_repeat('22', features) == 0):
features.append('22')
print("有羽毛->鸟类")
else:
if (features.index(i) != len(features)-1):
continue
else:
break
for i in features:
if (i == '4'):
for i in features:
if (i == '5'):
if (judge_repeat('22', features) == 0):
features.append('22')
print("会飞,会下蛋->鸟类")
elif (i == '6'):
for i in features:
if (judge_repeat('23', features) == 0):
features.append('23')
print("食肉->食肉类")
elif (i == '7'):
for i in features:
if (i == '8'):
for i in features:
if (i == '9'):
if (judge_repeat('23', features) == 0):
features.append('23')
print("有犬齿,有爪,眼盯前方->食肉类")
elif (i == '10'):
for i in features:
if (i == '21'):
if (judge_repeat('24', features) == 0):
features.append('24')
print("有蹄,哺乳类->有蹄类")
elif (i == '11'):
for i in features:
if (i == '21'):
if (judge_repeat('24', features) == 0):
features.append('24')
print("反刍,哺乳类->蹄类")
else:
if (i != len(features)-1):
continue
else:
break
printInfo()
features=InputFeature()
for i in range(0,len(features)):
print(dict_data[features[i]], end=" ")
print("\n")
# 判断有几个数据
# print(len(features))
matchfeaturecategory(features)
matchfeatureanimal(features)
# 打印最后有多少个特征
# print(features)
# for i in range(0,len(features)):
# print(dict_data[features[i]], end=" ")
运行结果:
小结:
产生式系统的结构简单,表达的比较直观,但是只可以解决比较简单、数据量比较少的推理过程,在现在的大数据时代是不适用的;不然像代码中一堆if-else会疯掉的!