目录
实验目的:
实验代码:
实验内容:
实验结果
实验目的:
输入相应的条件,根据知识库推理得出相应的知识。
实验代码:
def find_data(input_process_data_list):for epoch, data_process in enumerate(data_process_list):number = 0for i in input_process_data_list:if i in data_process:number += 1if number == len(data_process):if data_result_list[epoch] not in result_list:# 弹出前提和此过程结论,因为该过程已经推理过过,此结果存入需要查找的过程中result = data_result_list.pop(epoch)process = data_process_list.pop(epoch)# 判断临时结论是否已经存在中,存在则重新寻找,不存在则加入到字典中,并将其存入推导结果if result not in input_process_data_list:dict_input[','.join(process)] = result#键为前提,值为结果end_result = find_data(input_process_data_list + [result])if end_result == 1:return 1else:return 0# 存在则直接寻找else:end_result = find_data(input_process_data_list)if end_result == 1:return 1else:return 0# 已经是动物结果,取出结果后返回else:process = data_process_list.pop(epoch)dict_input[','.join(process)] = data_result_list[epoch]return 1if __name__ == '__main__':# 存储IF前提data_process_list = []# 存储THEN结果data_result_list = []# 存储用于查询的数据list_data = []# 用于存储输出结果dict_input = {}# 规则库txt = '''有毛发,哺乳类
产奶,哺乳类
有羽毛,鸟类
会飞,会下蛋,鸟类
吃肉,食肉类
有犬齿,有爪,眼盯前方,食肉类
哺乳类,有蹄,蹄类
哺乳类,反刍,蹄类
哺乳类,食肉类,黄褐色,有斑点,金钱豹
哺乳类,食肉类,黄褐色,有黑色条纹,虎
蹄类,长脖,长腿,有斑点,长颈鹿
蹄类,有黑色条纹,斑马
鸟类,长脖,长腿,不会飞,黑白二色,鸵鸟
鸟类,会游泳,不会飞,黑白二色,企鹅
鸟类,善飞,信天翁'''# 将数据预处理datas = txt.split('\n')for data in datas:data = data.split(',')data_process_list.append(data[:-1])data_result_list.append(data[-1].replace('\n', ''))# 最终结果列表result_list = ['信天翁', '鸵鸟', '斑马', '长颈鹿', '虎', '金钱豹', '企鹅']# 数据库对应的过程database = {'1': '有毛发', '2': '产奶', '3': '有羽毛', '4': '会飞', '5': '会下蛋', '6': '吃肉', '7': '有犬齿','8': '有爪', '9': '眼盯前方', '10': '有蹄', '11': '反刍', '12': '黄褐色','13': '有斑点', '14': '有黑色条纹','15': '长脖', '16': '长腿', '17': '不会飞', '18': '会游泳', '19': '黑白二色', '20': '善飞','21': '哺乳类','22': '鸟类', '23': '食肉类', '24': '蹄类'}# 打印顶部星号边框print('****************************** 输入对应条件前面的数字: ******************************\n')# 打印数据库内容,每6个一行,保持对齐for i, (key, value) in enumerate(database.items(), 1):if i % 6 ==1: # 每6个一行print('*',end='')print(f"{key}:{value:<8}", end=' ') # 保持每列宽度相同,对齐if i % 6 == 0: # 每6个一行print(' *') # 换行,并加上右侧的星号if len(database) % 6 != 0:print(' *') # 如果最后一行不足6个,也加上右侧的星号# 打印底部星号边框和提示信息print('**********************************************************************************')print('****************************** 当输入数字0时,程序结束 ******************************\n')# 循环输入,遇0退出while 1:print('请输入:',end='')term = input("")if term == '0':breakif database[term] not in list_data:list_data.append(database[term])# 打印前提条件print('前提条件为:')print(' '.join(list_data) + '\n')# 进行递归查找,直到找到最终结果,返回1则找到最终结果end_result = find_data(list_data)if end_result == 1:print('推理过程如下:')# 将结果进行打印for i in dict_input.keys():print(f"{i}->{dict_input[i]}")# 得到最终结果即输出所识别动物if dict_input[i] in result_list:print()print(f'所识别的动物为{dict_input[i]}')else:# 将结果进行打印for i in dict_input.keys():print(f"{i}->{dict_input[i]}")
实验内容:
首先,将已知的动物特征及其对应的种类整理成规则库。规则库中的每一条规则都包含两部分:前提(动物的特征)和结果(动物的种类)。
然后通过命令行界面,用户可以输入一系列动物的特征。这些特征从规则库中的前提部分选取,并通过数字进行标识。用户输入的特征被存储在一个列表中,作为推理系统的输入;
推理过程采用递归方法。首先,将用户输入的特征列表作为输入参数传递给递归函数。函数遍历规则库中的每一条规则,检查当前特征列表是否满足规则的前提部分。如果满足,则进一步检查该规则的结果是否已经在之前的结果列表中。如果结果不在结果列表中,则将该结果添加到输入特征列表中,并继续递归调用函数进行推理。如果找到满足所有条件的动物种类,则停止递归并返回结果。
推理完成后,系统输出推理过程及最终结果。推理过程以键值对的形式展示,最终结果是满足所有输入特征的动物种类。