# 知识库 {特征序号,特征描述}
base = {'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':'信天翁'}
# 二维列表:规则的集合
# 其中一维列表:一条规则;下标 0:结论;其他下标:该结论的前提
rules = [[21, 1], [21, 2], [22, 3], [22, 4, 5], [23, 6, 21],
[23, 7, 8, 9], [23, 10, 21], [24, 11, 21], [25, 12, 13, 21, 23],
[26, 12, 14, 21, 23], [27, 13, 15, 16, 24], [28, 14, 24],
[29, 4, 15, 16, 22], [30, 4, 18, 19, 22], [31, 20, 22]]
def printBase():
# 打印知识库
print("\n****************** 知识库 *********************")
for key, value in base.items():
print(key + ':' + value)
def classAnimal():
# 提示输入
print("\n请输入前提特征的序号:")
# 输入,分割,化为整数,转化为列表
premise = list(map(int, input().split()))
# 对输入的特征序号排序
premise.sort()
# 设置知识库中的全部特征的标志量,0:无该特征,1: 有该特征
basenum = [0 for i in range(32)]
# 输入的特征对应的标志量赋值 1
for i in premise:
basenum[i] = 1
# 遍历所有的规则
for rule in rules:
# 设置当前规则是否成立的标志量
flag = True
# 输出信息
msg = ""
# 遍历当前规则的所有前提
for r in range(1, len(rule)):
# 输出信息
msg = msg + " " + base.get(str(rule[r]))
# 判断当前的前提的标志量是否为 0,即不成立
if (basenum[rule[r]] == 0):
# 其中一个前提不成立,则当前规则不成立
flag = False
# 退出循环
break
# 判断当前规则是否成立
if (flag):
# 结论特征的标志量赋值 1
basenum[rule[0]] = 1
# 输出信息
msg = msg + " -> " + base.get(str(rule[0]))
# 输出
print(msg)
# 提示信息
print("************* 动物识别系统 ****************")
# 循环调用
while (1):
# 提示信息
print("\n请选择:\n0.退出程序\n1.动物分类")
# 选择需要的操作
choice = int(input())
# 退出程序
if choice == 0:
break
# 动物分类
elif choice == 1:
# 打印知识库
printBase()
# 分类
classAnimal()
else:
print("输入错误!!!")
print("\nEND !")
1.产生式,是知识表示的一种方法。
2.一个或多个前提得出一个结论,称为一个产生式。
3.用一组产生式求解问题的系统,称为产生式系统。
4.产生式具有一对多的关系,一组产生式具有多对多的关系,适用于数据结构当中的"网"。
5."网"可以用邻接矩阵来存储,此处使用二维列表,表示规则集。
6.把所有的前提和结论写入字典并给予序号,作为知识库。