- 问题描述
一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等)。设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下(设猴子位置为A,香蕉位置在B,箱子位置为C),如何行动可摘取到香蕉。
- 算法介绍——一阶谓词逻辑表示法
分别定义描述状态和动作的谓词。
描述状态的谓词:EMPTY(y):猴子monkey手里是空的;AT(y,z):y在z处;HOLDS(w):猴子monkey拿着w;ONBOX(x):猴子monkey在x上。
变元的个体域:x的个体域为{box},y的个体域是{monkey,box,banana},z的个体域为{a,b,c},w的个体域是{banana,box}。
问题的初始状态为:AT(monkey,a),AT(banana,b),AT(box,c),EMPTY(monkey)。
目标状态为:AT(monkey,b),AT(banana,b),AT(box,b),ONBOX(box),HOLDS(banana)。
猴子行动的目标是把问题的初始状态转换为目标状态。
- 算法实现
猴子行动包括以下操作:
Goto(x,y)
条件:AT(monkey,x)
动作:删除表:AT(monkey,x)
添加表:AT(monkey,y)
MoveBox(x,y)
条件:AT(monkey,x),AT(box,x),EMPTY(monkey)
动作:删除表:AT(monkey,x),AT(box,x)
添加表:AT(monkey,y),AT(box,y)
Climb(x)
条件:AT(monkey,x),AT(box,x),ONBOX(null)
动作:删除表:ONBOX(null)
添加表:ONBOX(box)
Pick(x)
条件:AT(monkey,x),AT(box,x),AT(banana,x),ONBOX(box)
动作:删除表:EMPTY(monkey)
添加表:HOLDS(banana)
则猴子具体行动为:
①初始状态:AT(monkey,a),AT(banana,b),AT(box,c),EMPTY(monkey)
②Goto(a,c):AT(monkey,c),AT(banana,b),AT(box,c),EMPTY(monkey)
③MoveBox(c,b):AT(monkey,b),AT(banana,b),AT(box,b),EMPTY(monkey)
④Climb(b):AT(monkey,b),AT(banana,b),AT(box,b),EMPTY(monkey),ONBOX(box)
⑤Pick(b):AT(monkey,b),AT(banana,b),AT(box,b),HOLDS(banana),ONBOX(box)
实验具体运行结果如下:
图1 程序运行结果
- 讨论及结论
一阶谓词逻辑表示法是一种重要的知识表示方法,它以数理逻辑为基础,是到目前为止能够表达人类思维活动规律的一种最精确的形式语言。
使用一阶谓词逻辑表示法能够有效完整表示变化的过程,利于编程逻辑的实现,在一些复杂问题上能够一定程度上简化问题的复杂程度。