研究生( 人工智能 )报告
题目:人工智能实验报告
     
                     
       
                     
       
  电磁场与微波技术   
                     
院(系、所)
                     
华中科技大学研究生院制


1 问题二
利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请定义必要的谓词,列出问题的初始化状态(即下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置b)。
猴子香蕉问题
解:
定义描述环境状态的谓词
AT(x,w)xt处,个体域:xϵ{monkey}wϵ{a,b,c,box}
HOLD(x,t)x手中拿着t,个体域:tϵ{box,banana}
EMPTY(x)x手中是空的;
ON(t,y)ty处,个体域:yϵ{b,c,ceiling}
CLEAR(y)y上是空的;
BOX(u)u是箱子,个体域:uϵ{box}
BANANA(v)v是香蕉,个体域:vϵ{banana}
使用谓词、连结词、量词来表示环境状态。
问题的初始状态可表示为:
SoAT(monkey,a)˄EMPTY(monkey)˄ON(box,c)˄ON(banana,ceiling)˄CLEAR(b)˄BOX(box)˄
BANANA(banana)
要达到的目标状态为:
SgAT(monkey,box)˄HOLD(monkey,banana)˄ON(box,b)˄CLEAR(ceiling)˄CLEAR(c)˄
BOX(box)˄BANANA(banana)
从初始状态到目标状态的转化, 猴子需要完成一系列操作, 定义操作类谓词表示其动作。
WALK(m,n):猴子从m走到n处,个体域:m,nϵ{a,b,c}
CARRY(s,r):猴子在r处拿到s,个体域:rϵ{c,ceiling}sϵ{box,banana}
CLIMB(u,b):猴子在b处爬上u
3个操作也可分别用条件和动作来表示。条件直接用谓词公式表示,是为完成相应操作所必须具备的条件;当条件中的事实使其均为真时,则可激活操作规则,于是可执行该规则中的动作部分。动作通过前后状态的变化表示,即通过从动作前删除或增加谓词公式来描述动作后的状态。
WALK(m,n):猴子从m走到n
条件:AT(monkey,m)
动作:
CARRY(s,r):猴子在r处拿到s
条件:AT(monkey,r)˄EMPTY(monkey)˄ON(s,r)˄BOX(box)˄BANANA(banana)
动作:
CLIMB(u,b):猴子在b处爬上u
条件:AT(monkey,b)˄HOLD(monkey,u)˄CLEAR(b)˄BOX(box)˄BANANA(banana)
动作:
按照行动计划, 一步步进行状态替换, 直至目标状态。
AT(monkey,a)˄EMPTY(monkey)˄ON(box,c)˄ON(banana,ceiling)˄CLEAR(b)˄BOX(box)˄
BANANA(banana)
AT(monkey,c)˄EMPTY(monkey)˄ON(box,c)˄ON(banana,ceiling)˄CLEAR(b)˄BOX(box)˄
BANANA(banana)
AT(monkey,c)˄HOLD(monkey,box)˄ON(banana,ceiling)˄CLEAR(b)˄CLEAR(c)˄BOX(box)˄
BANANA(banana)
AT(monkey,b)˄HOLD(monkey,box)˄ON(banana,ceiling)˄CLEAR(b)˄CLEAR(c)˄BOX(box)˄
BANANA(banana)
AT(monkey,box)˄EMPTY(monkey)˄ON(box,b)˄ON(banana,ceiling)˄CLEAR(c)˄BOX(box)˄
BANANA(banana)
AT(monkey,box)˄HOLD(monkey,banana)˄ON(box,b)˄CLEAR(ceiling)˄CLEAR(c)˄BOX(box)˄
BANANA(banana)(目标得解)
猴子行动的规则序列是:WALK(a,c)→CARRY(c,box)→WALK(c,b)→CLIMB(box,b)→
CARRY(banana,ceiling)
当猴子执行某一个操作之前,需要检查当前状态是否可使所要求的条件得到满足,即证明当前状态是否蕴涵操作所要求的状态的过程。在行动过程中, 检查条件的满足性后才进行变量
的代换。代入新条件后的新状态如果是目标状态,则问题解决;否则看是否满足下面的操作,如果不满足或即使满足却又回到了原来的状态,那么代入无效。

#include <stdio.h>
struct State
{
    int monkey; /*-1:Monkey at A;0: Monkey at B;1:Monkey at C;*/
    int box; /*-1:box at A;0:box at B;1:box at C;*/
    int banana; /*Banana at B,Banana=0*/
    int monbox; /*-1: monkey on the box;1: monkey  the box;*/
};
struct State States [150];
char* routesave[150];
/*function monkeygoto,it makes the monkey goto the other place*/
void monkeygoto(int b,int i)
    int a;
    a=b;
    if (a==-1)
    {
        routesave[i]="Monkey go to A";
        States[i+1]=States[i];
printf输出格式matlab
        States[i+1].monkey=-1;
    }
    else if(a==0)
    {
        routesave[i]="Monkey go to B";
        States[i+1]=States[i];
        States[i+1].monkey=0;
    }
    else if(a==1)
    {
        routesave[i]="Monkey go to C";
        States[i+1]=States[i];
        States[i+1].monkey=1;
    }
    else
    {
        printf("parameter is wrong");
    }
}
/*end function monkeyygoto*/
/*function movebox,the monkey move the box to the other place*/
void movebox(int a,int i)