资源描述:
《猴子摘香蕉实验报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验1:猴子摘香蕉问题的VC编程实现一、实验目的 利用一阶谓词逻辑求解猴子摘香蕉问题并通过编程来实现二、编程环境本文主要编译环境是Windows10VisualStudio2015在Ubuntu12.0用gcc编译来演示问题的另外几种状态的解法三、问题描述 房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请定义必要的谓词,列出问题的初始化状态(即下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置b)。四、解决方案1.定义描述环境状态
2、的谓词。AT(x,y):x在y处,个体域:xϵ{monkey,box,banana},yϵ{a,b,c};HAND(s):猴子手中拿着s,个体域:sϵ{box,banana};ONBOX(monkey):猴子在箱子上;2.使用谓词、连结词、量词来表示环境状态。问题的初始状态可表示为:So:AT(monkey,a)˄~HAND(s)˄AT(box,c)˄~ONBOX(monkey)˄AT(banana,b)要达到的目标状态为:Sg:AT(box,b)˄ONBOX(monkey)˄HAND(banana)˄AT(monkey,b)˄
3、AT(banana,b)3.从初始状态到目标状态的转化,猴子需要完成一系列操作,定义操作类谓词表示其动作。go(m,n):猴子从m走到n处,个体域:m,nϵ{a,b,c};movebox(m,n):猴子把箱子从m处移动到n处,个体域:m,nϵ{a,b,c};onbox(m):猴子在m处爬上箱子,个体域:mϵ{a,b,c};catch(banana):猴子摘到香蕉;这3个操作也可分别用条件和动作来表示。条件直接用谓词公式表示,是为完成相应操作所必须具备的条件;当条件中的事实使其均为真时,则可激活操作规则,于是可执行该规则中的动作部
4、分。动作通过前后状态的变化表示,即通过从动作前删除或增加谓词公式来描述动作后的状态。go(m,n):猴子从m走到n处条件:AT(monkey,m)动作:movebox(m,n):猴子把箱子从m处移动到n处条件:AT(monkey,m))˄~HAND(s)˄AT(box,m)动作:onbox(m):猴子在m处爬上箱子条件:AT(monkey,m)˄~HAND(s)˄AT(box,m)˄AT(banana,m)˄~ONBOX(monkey)动作:catch(m):猴子摘到香蕉条件:AT(monkey,m)˄~HAND(s)˄AT(b
5、ox,m)˄AT(banana,m)˄ONBOX(monkey)动作:1.按照行动计划,一步步进行状态替换,直至目标状态。2.AT(monkey,a)˄~HAND(s)˄AT(box,c)˄~ONBOX(monkey)˄AT(banana,b)AT(monkey,c)˄HAND(box)˄AT(box,c)˄~ONBOX(monkey)˄AT(banana,b)AT(monkey,b)˄~HAND(s)˄AT(box,b)˄~ONBOX(monkey)˄AT(banana,b)AT(monkey,b)˄~HAND(s)˄AT(b
6、ox,b)˄ONBOX(monkey)˄AT(banana,b)AT(box,b)˄ONBOX(monkey)˄HAND(banana)˄AT(monkey,b)˄AT(banana,b)(目标得解)猴子行动的规则序列是:go(a,c)→movebox(c,b)→onbox(b)→catch(bananan)四、源代码#define_CRT_SECURE_NO_WARNINGS#includeinti;voidgo(charx,chary){printf("step%d:monkey从%c走到%c",++i
7、,x,y);//x表示猴子的位置,y为箱子的位置}voidmovebox(charx,chary){printf("step%d:monkey把箱子从%c运到%c",++i,x,y);//x表示箱子的位置,y为香蕉的位置}voidonbox(){printf("step%d:monkey爬上箱子",++i);}voidcatch(){printf("step%d:monkey摘到香蕉",++i);}voidmain(){charmonkey,box,banana;printf("请用abc来表示猴子箱子香蕉的位置
8、");printf("monkeytboxtbanana");scanf("%c",&monkey);getchar();printf("t");scanf("%c",&box);getchar();printf("tt");scanf("%c",