一、实验描述
-
实验目的:
(1)熟悉谓词逻辑表示法;
(2)掌握人工智能谓词逻辑中的经典例子——猴子摘香蕉问题的编程实现。 -
实验内容:
房子里有一只猴子(即机器人),位于a处。在c处上方的天花板上有一串蕉,猴子想吃,但摘不到。房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。要求通过python语言编程实现猴子摘香蕉问题的求解过程。
二、涉及知识点
谓词逻辑表示法是一种基于数理逻辑的表示方法。
-
谓词的逻辑学基础
(1)命题(proposition)
命题的定义:
断言:一个陈述句称为一个断言.
命题:具有真假意义的断言称为命题.
(2)命题的真值:
T:表示命题的意义为真
F:表示命题的意义为假
(3)论域:
由所讨论对象的全体构成的集合。亦称为个体域。(类似定义域)。
个体:论域中的元素。
(4)谓词:
在谓词逻辑中命题是用形如 P(x1 ,x2 ,…,xn ) 的谓词来表示,其中:
谓词名:是命题的谓语,表示个体的性质、状态或个体之间的关系
个体:是命题的主语,表示独立存在的事物或概念
(5)函数:
设D是个体域,f:Dn→D是一个映射,其中,则称是Dn ={(x1 ,x2 ,…,xn )∣x1 ,x2 ,…,xn }上的一个n元函数,记作f( x1 ,x2 ,…,xn )。
(6)谓词逻辑组成
谓词符号
变量符号
常量符号
函数符号
其他辅助符号——括号、标点符号等。 -
连接词
(1)合取(与)
符号:∧
定义:A∧B 为真,当且仅当A、B同时为真。
(2)析取(或)
符号:∨
定义:A∨B为假,当且仅当A、B同时为假。
(3)否定(非)
符号:¬、∽
定义:¬A为真,当且仅当A为假。
(4)蕴涵
符号:→,⇒
定义:A→B为假,当且仅当A为真,B为假。
等价式: A∨B
表达语义:如果A,则B。 -
约束量词
(1)全称量词
符号:∀
含义:表达变量x在其论域内的所有可能取值。意思是“所有的”、“任一个”。记为:(∀x)
命题(∀x)P(x)为真,当且仅当对论域中的所有x,都有P(x)为真
命题(∀x)P(x)为假,当且仅当至少存在一个xi∈D,使得P(xi)为假
(2)存在量词
• 符号:∃
• 含义:表达变量x在其论域内,存在着、有一个、或至少有一个取值,使P(x)为真。记为(∃x)
• 命题(∃x)P(x)为真,当且仅当至少存在一个xi∈D ,使得P(xi )为真
• 命题(∃x)P(x)为假,当且仅当对论域中的所有x,都有P(x)为假 -
谓词公式
(1)项(Item)
a. 个体常量、个体变量是项;
b. 若t1,t2 ,…,tn是项,f是n元函数,则f(t1,t2 ,…,tn)是项;
c. 由a,b生成的表达式是项。
通俗地说:个体常量、个体变量和函数统称为项。
(2)原子谓词公式(原子公式)
若 t1,t2 ,…,tn 是项,P是谓词,则称P(t1,t2 ,…,tn )为原子谓词公式。
(3)谓词公式(合式)
a. 原子公式是谓词公式;
b. 若A是谓词公式,则¬A也是谓词公式;
c. 若A,B是谓词公式,则A∨B,A∧B,A→B也都是谓词公式;
d. 若A是谓词公式,x是项,则(∀x)A(x)和(∃x)A(x)都是谓词公式。
e. 按a—d规则构造的表达式是谓词公式。
(4)量词的辖域
量词的约束范围,即指位于量词后面的单个谓词或者用括弧括起来的合式公式。
(5)约束变元:
受到量词约束的变元,即辖域内与量词中同名的变元称为约束变元
(6)自由变元:
不受约束的变元称为自由变元
(7)变元的换名:
谓词公式中的变元可以换名。要保持变量的论域不变。此外还需注意:第一:对约束变元,必须把同名的约束变元都统一换成另外一个相同的名字,且不能与辖域内的自由变元同名。第二:对辖域内的自由变元,不能改成与约束变元相同的名字。存在量词约束的变量换名同上。
(8)谓词公式真值表
取出公式中所有单个谓词,按所有可能的取值组合,再按连接词和量词的定义给出合适公式的真值。 -
谓词公式性质
(1)否定之否定(=肯定)
¬(¬P)⇔P
(2)逆否律
P∨Q⇔¬P→Q
(3)德.摩根定律( De.Morgen’s Law)
¬(P∨Q)⇔¬P∧¬Q
¬(P∧Q)⇔¬P∨¬Q
(4)分配率
P∧(Q∨R)⇔(P∧Q)∨(P∧R)
P∨(Q∧R)⇔(P∨Q)∧(P∨R)
(5)交换率
P∧Q⇔Q∧P
P∨Q⇔Q∨P
(6)结合率
(P∨Q)∨R⇔P∨(Q∨R)
(P∧Q)∧R⇔P∧(Q∧R)
(7)逆否率
P→Q⇔¬Q→¬P
¬P∨Q⇔Q∨¬P
(8)否定移过量词
¬(∀x)P(x)⇔(∃x)[¬P(x)]
¬(∃x)P(x)⇔(∀x)[¬P(x)]
(9)约束量词移进
(∀x)[P(x)∧Q(x)]⇔(∀x)P(x)∧(∀x)Q(x)
(∃x)[P(x)∨Q(x)]⇔(∃x)P(x)∨(∃x)Q(x)
(10)变量换名(论域不变、名字不冲突)
(∀x)P(x)⇔(∀y)P(y)
(∃x)P(x)⇔(∃y)P(y) -
谓词逻辑表示方法
谓词逻辑表示步骤:
(1) 先根据要表示的知识定义谓词
(2) 再用连词、量词把这些谓词连接起来
三、实验步骤
系统给出该实验部分代码,需要用户补全右侧开始至结束之间的代码
用户点击运行,系统返回运行结果给用户,如下: 测试输入:b a c
输出: 请用‘a’、‘b’、‘c’表示猴子香蕉箱子的位置
操作步骤如下:
step: 1 monkey从 b 走到c
step: 2 monkey把箱子从 c 运到a
step: 3 monkey爬上箱子
step: 4 monkey摘到香蕉
四、实验代码
'''
猴子摘香蕉问题的Python编程实现
'''
#全局变量i
i=0
def Monkey_go_box(x,y):
global i
i=i+1
print('step:',i,'monkey从',x,'走到'+y)
def Monkey_move_box(x,y):
global i
i = i + 1
print('step:', i, 'monkey把箱子从', x, '运到' + y)
def Monkey_on_box():
global i
i = i + 1
print('step:', i, 'monkey爬上箱子')
def Monkey_get_banana():
global i
i = i + 1
print('step:', i, 'monkey摘到香蕉')
import sys
print('请用‘a’、‘b’、‘c’表示猴子香蕉箱子的位置')
#读取输入的运行参数
codeIn=sys.stdin.read()
codeInList=codeIn.split()
#将运行参数赋值给monkey、banana、box
monkey=codeInList[0]
banana=codeInList[1]
box=codeInList[2]
print('操作步骤如下:')
#请用最少步骤完成猴子摘香蕉任务
###########开始#############
Monkey_go_box(monkey,box)
Monkey_move_box(box,banana)
Monkey_on_box()
Monkey_get_banana()
###########结束#############