"""
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选手','习惯差'],'下甲'],[['正常努力型选手','习惯好'],'下乙'],[['正常努力型选手','习惯差'],'特丙'],[['适度努力运动型选手','习惯好'],'上乙'],[['适度努力运动型选手','习惯差'],'中乙'],[['认真努力型选手','习惯好'],'下甲'],[['认真努力型选手','习惯差'],'特乙'],[['特等努力型选手','习惯好'],'上甲'],[['特等努力型选手','习惯差'],'中甲'],[['正常型选手','习惯好'],'中乙'],[['正常型选手','习惯差'],'下乙'],[['正常运动型选手','习惯好'],'上乙'],[['正常运动型选手','习惯差'],'中乙'],[['贪玩型选手','习惯好'],'上丙'],[['贪玩型选手','习惯差'],'中丙'],[['特等天赋型选手','习惯好'],'下丙'],[['特等天赋型选手','习惯差'],'特丁'],]defrun():print("\n*********************学生学习情况诊断系统*****************************\n")
string =""for i inrange(0,len(check_init)):
string +=(str(i +1)+"、"+ check_init[i]+"\t")print("请选择程序操作数:\t 1、进行推理 2、退出程序")whileTrue:
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 inrange(0,len(str_arr)):try:
num =int(str_arr[i])-1except Exception as e:
error_str ="输入知识库选项的格式有误"
flag =Falsebreak
flag, error_str = arr_rule(num, new_str_arr)if num notin 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("**********系统退出************")breakelse:print("操作数有误,请重新输入")defarr_rule(num, str_arr):if(num >len(check_init))or(num <0):returnFalse,"输入的选项超出知识库的范围"if num ==0:if1in str_arr:returnFalse,("已选择第"+str(num +2)+"个选项,不能选第"+str(num +1)+"个了")if num ==1:if0in str_arr:returnFalse,("已选择第"+str(num +1)+"个选项,不能选第"+str(num)+"个了")if num ==2:if3in str_arr:returnFalse,("已选择第"+str(num +2)+"个选项,不能选第"+str(num +1)+"个了")if num ==3:if2in str_arr:returnFalse,("已选择第"+str(num +1)+"个选项,不能选第"+str(num)+"个了")returnTrue,""defarr_rule2(str_arr):if0notin str_arr and1notin str_arr:print(str_arr)returnFalse,"1和2必须选一个(且只能同时选一个)"if2notin str_arr and3notin str_arr:print(str_arr)returnFalse,"3和4必须选一个(且只能同时选一个)"returnTrue,""defreasoning(check_box):"""1.推理机 2.解析机构"""
data = check_box # 存放用户选择的多选框
result =None# 存放推理结果# 用户输入结束,开始推理
result_str =""
k =1if check_box:# 输出前提条件
result_str +="前提条件为:\t\t"for i in data:
result_str +=str(i +"\t")
result_str +="\n\n"# 输出推理过程
result_str +="推理过程如下:\n"
Count =0for i inrange(len(rule)):
flag =True# 判断用户输入的是否是同一个动物的特征for j in rule[i][0]:if j in data:continueelse:
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 isNone:
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()