一、前言
- 此实验还不太完整,就是简单地用于交作业。
- 后期有时间会修改具体逻辑。
- 如果有什么错误,请评论指出。
- 原理:创建知识库模块用于知识获取,建立知识库把各条知识用链表链接起来形成“知识规则链表”,建立数据库模块用于把提供的已知事实以及推理中推出的新事实放入数据库中,分别形成“已知事实链表” 和“结论事实链表”,推理机用于实现推理,推理中凡是被选中参加推理的规则形成“已使用规则链表”,解释机构用于回答用户的问题,并根据“已使用规则链表”进行解释。
二、代码
"""
1.信息库
2.数据库 (1) 兴趣 (2) 行为 (3) 成绩
"""
check_init = ['100-80分', '79-60分', '习惯差', '习惯好', '玩游戏', '看书籍', '看漫画', '玩手机', '打篮球', '测数独', '做实验', '敲代码', '在自学', '勤思考']
rule = [
[['100-80分'], '学习情况优秀'],
[['79-60分'], '学习情况良好'],
[['学习情况优秀', '玩游戏', '看漫画', '玩手机', '打篮球'], '特等天赋型选手'],
[['学习情况优秀', '玩游戏', '玩手机', '看漫画'], '上等天赋型选手'],
[['学习情况优秀', '玩游戏', '玩手机', '打篮球'], '中等天赋运动型选手'],
[['学习情况优秀', '玩游戏', '玩手机'], '中等天赋型选手'],
[['学习情况优秀', '看书籍', '测数独', '做实验', '敲代码'], '特等努力型T选手'],
[['学习情况优秀', '看书籍', '测数独', '做实验'], '上等努力型T选手'],
[['学习情况优秀', '看书籍', '做实验', '打篮球'], '中等努力运动型T选手'],
[['学习情况优秀', '看书籍', ], '中等努力型T选手'],
[['学习情况良好', '看书籍', '测数独', '做实验', '敲代码'], '特等努力型选手'],
[['学习情况良好', '看书籍', '测数独', '做实验'], '认真努力型选手'],
[['学习情况良好', '看书籍', '做实验', '打篮球'], '适度努力运动型选手'],
[['学习情况良好', '看书籍', ], '正常努力型选手'],
[['学习情况良好', '玩游戏', '看漫画', '玩手机', '打篮球'], '摆烂型选手'],
[['学习情况良好', '玩游戏', '玩手机', '看漫画'], '贪玩型选手'],
[['学习情况良好', '玩游戏', '玩手机', '打篮球'], '正常运动型选手'],
[['学习情况良好', '玩游戏'], '正常型选手'],
[['特等天赋型选手', '习惯好'], '中丙'],
[['特等天赋型选手', '习惯差'], '下丙'],
[['上等天赋型选手', '习惯好'], '特丙'],
[['上等天赋型选手', '习惯差'], '上丙'],
[['中等天赋型选手', '习惯好'], '中乙'],
[['中等天赋型选手', '习惯差'], '下乙'],
[['中等天赋运动型选手', '习惯好'], '特乙'],
[['中等天赋运动型选手', '习惯差'], '上乙'],
[['中等努力型T选手', '习惯好'], '中乙'],
[['中等努力型T选手', '习惯差'], '下乙'],
[['中等努力运动型T选手', '习惯好'], '特乙'],
[['中等努力运动型T选手', '习惯差'], '上乙'],
[['特等努力型T选手', '习惯好'], '特甲'],
[['特等努力型T选手', '习惯差'], '上甲'],
[['上等努力型T选手', '习惯好'], '中甲'],
[['上等努力型T选手', '习惯差'], '下甲'],
[['正常努力型选手', '习惯好'], '下乙'],
[['正常努力型选手', '习惯差'], '特丙'],
[['适度努力运动型选手', '习惯好'], '上乙'],
[['适度努力运动型选手', '习惯差'], '中乙'],
[['认真努力型选手', '习惯好'], '下甲'],
[['认真努力型选手', '习惯差'], '特乙'],
[['特等努力型选手', '习惯好'], '上甲'],
[['特等努力型选手', '习惯差'], '中甲'],
[['正常型选手', '习惯好'], '中乙'],
[['正常型选手', '习惯差'], '下乙'],
[['正常运动型选手', '习惯好'], '上乙'],
[['正常运动型选手', '习惯差'], '中乙'],
[['贪玩型选手', '习惯好'], '上丙'],
[['贪玩型选手', '习惯差'], '中丙'],
[['特等天赋型选手', '习惯好'], '下丙'],
[['特等天赋型选手', '习惯差'], '特丁'],
]
def run():
print("\n*********************学生学习情况诊断系统*****************************\n")
string = ""
for i in range(0, len(check_init)):
string += (str(i + 1) + "、" + check_init[i] + "\t")
print("请选择程序操作数:\t 1、进行推理 2、退出程序")
while True:
val = input("请输入操作数:\t")
if val == "1":
print("######知识库选项#######")
print("@@@ \t" + string + " \t@@@")
val = input("请输入知识库前面的选项,并用空格隔开(1 2 3),注意: 1和2、3和4必须选一个(且只能同时选一个):")
str_arr = val.split(" ")
flag = True
new_str_arr = []
error_str = ""
for i in range(0, len(str_arr)):
try:
num = int(str_arr[i]) - 1
except Exception as e:
error_str = "输入知识库选项的格式有误"
flag = False
break
flag, error_str = arr_rule(num, new_str_arr)
if num not in new_str_arr:
new_str_arr.append(num)
if flag:
flag, error_str = arr_rule2(new_str_arr)
if flag:
str_arr = new_str_arr
check_state = []
for i in str_arr:
check_state.append(check_init[i])
result = reasoning(check_state)
print("\n" + result)
else:
print("操作有误,请检查是否符合规则后重新输入 \t错误信息: " + error_str)
print("\n\n")
elif val == "2":
print("**********系统退出************")
break
else:
print("操作数有误,请重新输入")
def arr_rule(num, str_arr):
if (num > len(check_init)) or (num < 0):
return False, "输入的选项超出知识库的范围"
if num == 0:
if 1 in str_arr:
return False, ("已选择第" + str(num + 2) + "个选项,不能选第" + str(num + 1) + "个了")
if num == 1:
if 0 in str_arr:
return False, ("已选择第" + str(num + 1) + "个选项,不能选第" + str(num) + "个了")
if num == 2:
if 3 in str_arr:
return False, ("已选择第" + str(num + 2) + "个选项,不能选第" + str(num + 1) + "个了")
if num == 3:
if 2 in str_arr:
return False, ("已选择第" + str(num + 1) + "个选项,不能选第" + str(num) + "个了")
return True, ""
def arr_rule2(str_arr):
if 0 not in str_arr and 1 not in str_arr:
print(str_arr)
return False, "1和2必须选一个(且只能同时选一个)"
if 2 not in str_arr and 3 not in str_arr:
print(str_arr)
return False, "3和4必须选一个(且只能同时选一个)"
return True, ""
def reasoning(check_box):
"""1.推理机 2.解析机构"""
data = check_box # 存放用户选择的多选框
result = None # 存放推理结果
# 用户输入结束,开始推理
result_str = ""
k = 1
if check_box:
# 输出前提条件
result_str += "前提条件为:\t\t"
for i in data:
result_str += str(i + "\t")
result_str += "\n\n"
# 输出推理过程
result_str += "推理过程如下:\n"
Count = 0
for i in range(len(rule)):
flag = True
# 判断用户输入的是否是同一个动物的特征
for j in rule[i][0]:
if j in data:
continue
else:
flag = False
# 若是同一个动物的特征,则判断特征是否完全
if flag:
word = ""
for j in rule[i][0]:
word = word + j + " "
data.remove(j)
data.append(rule[i][1])
Count += 1
word = word[0:-1] # 用于删除最后一个“且”
word = word + " \t\t属于 " + rule[i][1]
result_str += "\n" + str(k) + "、" + word
k += 1
# 动物特征完全,输出结果
if Count == 3:
result = rule[i][1]
result = "该学生学习情况为" + result
result_str += "\n\n" + result
break
# 若特征不是同一个动物的
if result is None:
word = ""
for i in data:
word = word + i + "+"
result_str += "\n\n" + word[0:-1] + "\n此条件在信息库中无匹配规则!"
else:
result_str += "请先进行选择!"
return result_str
if __name__ == "__main__":
run()
三、运行结果