- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
猴子摘香蕉实验报告
实验1:猴子摘香蕉问题的VC编程实现
一、实验目的 利用一阶谓词逻辑求解猴子摘香蕉问题并通过编程来实现
二、编程环境
本文主要编译环境是Windows 10 Visual Studio 2015 在Ubuntu 12.0 用gcc编译来演示问题的另外几种状态的解法
三、问题描述 房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请定义必要的谓词,列出问题的初始化状态(即下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置b)。
四、解决方案
定义描述环境状态的谓词。
AT(x,y):x在y处,个体域:x?{monkey, box,banana },y?{a,b,c};
HAND(s):猴子手中拿着s,个体域:s?{box,banana};
ONBOX(monkey):猴子在箱子上;
使用谓词、连结词、量词来表示环境状态。
问题的初始状态可表示为:
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) ?AT(banana,b)
从初始状态到目标状态的转化, 猴子需要完成一系列操作, 定义操作类谓词表示其动作。
go?{a,b,c};
movebox(m,n):猴子把箱子从m处移动到n处,个体域:m,n?{a,b,c};
onbox(m):猴子在m处爬上箱子,个体域:m?{a,b,c};
catch(banana):猴子摘到香蕉;
这3个操作也可分别用条件和动作来表示。条件直接用谓词公式表示是为完成相应操作所必须具备的条件当条件中的事实使其均为真时则可激活操作规则于是可执行该规则中的动作部分。动作通过前后状态的变化表示即通过从动作前删除或增加谓词公式来描述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(box,m) ? AT(banana,m) ? ONBOX(monkey)
动作:
按照行动计划, 一步步进行状态替换, 直至目标状态。
? ~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(box,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
#includestdio.h
int i;
void go(char x, char y)
{
printf(step %d:monkey从%c走到%c\n, ++i, x, y);//x表示猴子的位置,y为箱子的位置
}
void movebox(char x, char y)
{
printf(step %d:monkey把箱子从%c运到%c\n, ++i, x, y);//x表示箱子的位置,y为香蕉的位置
}
void onbox()
{
printf(step %d:monkey爬上箱子\n, ++i);
}
void catch()
{
printf(step %d:monkey摘到香蕉\n, ++i);
}
void main()
{
char monkey, box, banana;
printf(请用a b c来表示猴子箱子香蕉的位置\n);
printf(monkey\tbox\tbanana\n);
scanf(%c, monkey);
getchar();
文档评论(0)