问题描述:
房子里有一只猴子,位于a处。在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如下图所示,对于上述问题,可以通过谓词逻辑表示法来描述知识,实现猴子摘香蕉问题的求解过程。
解题思路:
根据题意设置谓词逻辑如下:
Monkey_GoTo_Box(x,y):猴子从x处走到y处
Monkey_Move_Box(x,y):猴子将箱子从x处运到y处
由于猴子摘到香蕉的最后两步必然是猴子爬上箱子和猴子摘到香蕉,故最后两步无需考虑其他情况。而对于爬上箱子之前的动作,则由初始的猴子香蕉箱子三者的相对位置决定。这里设置两条基本规则:
规则一:若猴子与箱子不在同一位置则猴子需走到箱子处。
规则二:若箱子与香蕉不在同一位置则将箱子运到香蕉处。
Python源代码:
# 猴子摘香蕉问题
i = 0 # 用于记录步骤数,为全局变量
def Monkey_GoTo_Box(x, y): # 猴子从x处走到y处
global i
i = i+1
print('步骤', i, ':猴子从', x, '走到' + y)
def Monkey_Move_Box(x, y): # 猴子将箱子从x处运到y处
global i
i = i + 1
print('步骤', i, ':猴子把箱子从', x, '运到' + y)
def Monkey_On_Box(): # 猴子爬上箱子
global i
i = i + 1
print('步骤', i, ':猴子爬上箱子')
def Monkey_Get_Banana(): # 猴子摘到香蕉
global i
i = i + 1
print('步骤', i, ':猴子摘到香蕉')
# 求解开始
print("请分别输入猴子、箱子、香蕉的位置:")
monkey, box, banana = input().split()
if monkey != box: # 若猴子与箱子不在同一位置则猴子需走到箱子处
Monkey_GoTo_Box(monkey, box)
if box != banana: # 若箱子与香蕉不在同一位置则将箱子运到香蕉处
Monkey_Move_Box(box, banana)
Monkey_On_Box()
Monkey_Get_Banana()
问题描述:
建立一个动物识别系统的规则库,用以识别虎、豹、斑马、长颈鹿、企鹅、鸵鸟、信天翁等7种动物。为了识别这些动物,可以根据动物识别的特征,建立包含下述规则库:
R1:if 动物有毛发 then 动物是哺乳动物
R2:if 动物有奶 then 动物是哺乳动物
R3:if 动物有羽毛 then 动物是鸟
R4:if 动物会飞 and 会生蛋 then 动物是鸟
R5:if 动物吃肉 then 动物是食肉动物
R6:if 动物有犀利牙齿 and 有爪 and 眼向前方 then 动物是食肉动物
R7:if 动物是哺乳动物and有蹄then动物是有蹄类动物
R8:if 动物是哺乳动物and反刍then动物是有蹄类动物
R9:if 动物是哺乳动物and是食肉动物and有黄褐色 and 有暗斑点 then 动物是豹
R10:if 动物是哺乳动物 and是食肉动物and有黄褐色 and有黑色条纹 then 动物是虎
R11:if动物是有蹄类动物 and 有长脖子and有长腿and有暗斑点 then 动物是长颈鹿
R12:if 动物是有蹄类动物 and有黑色条纹 then 动物是斑马
R13:if 动物是鸟and不会飞 and有长脖子and有长腿 and有黑白二色 then 动物是鸵鸟
R14:if 动物是鸟 and不会飞 and会游泳 and有黑白二色 then 动物是企鹅
R15:if 动物是鸟 and善飞 then 动物是信天翁
解题思路:
设置Features数组,用于表示动物的各种特征,所有特征按照顺序依次编号为,特征编号按顺序分别为1-20,动物类型为21-24,动物名称为25-31。
根据题中给出的动物识别规则建立各个规则的特征数组rule。
确定动物的具体种类的先行工作是识别动物的类别,本题中动物的类别有哺乳动物、鸟类、食肉动物、蹄类动物四大类。
在知晓动物类别的基础上再根据具体细化特征即可判断得出动物的具体种类。
Python源代码:
# 动物种类识别
import sys
print("【动物分类AI系统v1.0】")
# 动物特征库,特征编号按顺序分别为1~24,动物名称为25~31
Features = ["", "有奶", "有毛发", "有羽毛", "会飞", "会下蛋", "吃肉", "有锋利牙齿", "有爪", "眼向前方", "有蹄",
"反刍", "黄褐色", "暗斑点", "黑色条纹", "长脖子", "长腿", "不会飞", "会游泳", "有黑白二色", "善飞",
"哺乳动物", "鸟", "食肉动物", "蹄类动物", "豹", "虎", "长颈鹿", "斑马", "鸵鸟", "企鹅", "信天翁"]
i = 1 # 仅显示动物特征编号
while i < 21:
print('%d' % i + '.' + Features[i] + ' ', end='')
i = i + 1
if i % 10 == 1:
print()
# 用户输入
answer = input("\n请选择动物拥有的特征编号(用空格分隔):")
try:
answer = list(answer.split(' '))
new_answer = [int(x) for x in answer]
except Exception:
print("输入错误,请重新运行输入!")
sys.exit()
# 规则库
rule1 = [2] # if 动物有毛发 then 动物是哺乳动物
rule2 = [1] # if 动物有奶 then 动物是哺乳动物
rule3 = [3] # if 动物有羽毛 then 动物是鸟
rule4 = [4, 5] # if 动物会飞 and 会生蛋 then 动物是鸟
rule5 = [6] # if 动物吃肉 then 动物是食肉动物
rule6 = [7, 8, 9] # if 动物有犀利牙齿 and 有爪 and 眼向前方 then 动物是食肉动物
rule7 = [21, 10] # if 动物是哺乳动物 and 有蹄 then 动物是有蹄类动物
rule8 = [21, 11] # if 动物是哺乳动物 and 反刍 then 动物是有蹄类动物
rule9 = [21, 23, 12, 13] # if 动物是哺乳动物 and 是食肉动物 and 有黄褐色 and 有暗斑点 then 动物是豹
rule10 = [21, 23, 12, 14] # if 动物是哺乳动物 and 是食肉动物 and 有黄褐色 and 有黑色条纹 then 动物是虎
rule11 = [24, 15, 16, 13] # if 动物是有蹄类动物 and 有长脖子 and 有长腿 and 有暗斑点 then 动物是长颈鹿
rule12 = [24, 14] # if 动物是有蹄类动物 and有黑色条纹 then 动物是斑马
rule13 = [22, 17, 16, 15, 19] # if 动物是鸟 and 不会飞 and 有长脖子 and 有长腿 and 有黑白二色 then 动物是鸵鸟
rule14 = [22, 17, 18, 19] # if 动物是鸟 and 不会飞 and 会游泳 and 有黑白二色 then 动物是企鹅
rule15 = [22, 4] # if 动物是鸟 and 善飞 then 动物是信天翁
# 开始逻辑推理,确定动物种类
if set(rule1) < set(new_answer): # if 动物有毛发 then 动物是哺乳动物
print("有毛发的动物是哺乳动物")
new_answer.append(21)
if set(rule2) < set(new_answer): # if 动物有奶 then 动物是哺乳动物
print("有奶的动物是哺乳动物")
new_answer.append(21)
if set(rule3) < set(new_answer):
print("有羽毛的动物是鸟类")
new_answer.append(22)
if set(rule4) < set(new_answer):
print("会飞且会下蛋的动物是鸟类")
new_answer.append(22)
if set(rule5) < set(new_answer):
print("吃肉的动物是食肉动物")
new_answer.append(23)
if set(rule6) < set(new_answer):
print("有爪、有锋利牙齿且眼向前方的动物是食肉动物")
new_answer.append(23)
if set(rule7) < set(new_answer):
print("有蹄的哺乳动物是蹄类动物")
new_answer.append(24)
if set(rule8) < set(new_answer):
print("反刍的哺乳动物是蹄类动物")
new_answer.append(24)
# 得出最终结论
if set(rule9) < set(new_answer):
print("有黄褐色、有暗斑点的食肉哺乳动物是豹")
print("\n识别出来的动物是:" + Features[25])
elif set(rule10) < set(new_answer):
print("有黄褐色、有黑色条纹的食肉哺乳动物是虎")
print("\n识别出来的动物是:" + Features[26])
elif set(rule11) < set(new_answer):
print("有长脖子、有长腿、有暗斑点的蹄类动物是长颈鹿")
print("\n识别出来的动物是:" + Features[27])
elif set(rule12) < set(new_answer):
print("有黑色条纹的蹄类动物是斑马")
print("\n识别出来的动物是:" + Features[28])
elif set(rule13) < set(new_answer):
print("有长脖子、有长腿、有黑白二色的不会飞的鸟类是鸵鸟")
print("\n识别出来的动物是:" + Features[29])
elif set(rule14) < set(new_answer):
print("有黑白二色的不会飞的会游泳的鸟类是企鹅")
print("\n识别出来的动物是:" + Features[30])
elif set(rule15) < set(new_answer):
print("善飞的鸟类是信天翁")
print("\n识别出来的动物是:" + Features[31])
else:
print('\n对不起!识别失败!')
输入猴子、香蕉、箱子的初始位置分别为a、b、c,运行结果如下所示:
上述结果是猴子、香蕉、箱子三者初始位置不同的输出情况。而对于三者中有两者位置相同以及三者位置均相同的情况,运行结果如下所示: