猴子摘香蕉实验报告

时间:2023-01-01 10:24:24 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。


1VC 一、实验目的

利用一阶谓词逻辑求解猴子摘香蕉问题并通过编程来实现

二、编程环境

本文主要编译环境是Windows10VisualStudio2015Ubuntu12.0gcc编译来演示问题的另外几种状态的解法

三、问题描述

房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请定义必要的谓词,列出问题的初始化状态(即下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置b)。



四、解决方案

1.

定义描述环境状态的谓词。

AT(x,y)xy处,个体域:x?{monkey,box,banana}y?{a,b,c} HAND(s):猴子手中拿着s,个体域:s?{box,banana} ONBOX(monkey):猴子在箱子上; 2.

使用谓词、连结词、量词来表示环境状态。 问题的初始状态可表示为:

SoAT(monkey,a)?~HAND(s)?AT(box,c)?~ONBOX(monkey)?AT(banana,b) 要达到的目标状态为:

SgAT(box,b)?ONBOX(monkey)?HAND(banana)?AT(monkey,b)?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个操作也可分别用条件和动作来表示。条件直接用谓词公式表示,是为完成相应操作所必须具备的条件;当条件中的事实使其均为真时,则可激活操作规则,于是可执行该规则中的动作部分。动作通过前后状态的变化表示,即通过从动作前删除或增加谓词公式来描述动作后的状态。

go(m,n):猴子从m走到n 条件:AT(monkey,m)

删除:AT(monkey,m)动作:

增加:AT(monkey,n)

movebox(m,n):猴子把箱子从m处移动到n 条件:AT(monkey,m))?~HAND(s)?AT(box,m)






动作:

删除:~HAND(s)AT(box,m)

增加:HAND(s)AT(box,n)AT(monkey,n)



onbox(m):猴子在m处爬上箱子

条件:AT(monkey,m)?~HAND(s)?AT(box,m)?AT(banana,m)?~ONBOX(monkey) 动作:

删除:~ONBOX(monkey)增加:ONBOX(monkey)



catch(m):猴子摘到香蕉

条件:AT(monkey,m)?~HAND(s)?AT(box,m)?AT(banana,m)?ONBOX(monkey) 动作:4. 5.

删除:~HAND(s) 增加:HAND(banana)



按照行动计划,一步步进行状态替换,直至目标状态。

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(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 #include inti;

voidgo(charx,chary) {

printf("step%d:monkey%c走到%c\n",++i,x,y);//x表示猴子的位置,y为箱子的位置 }

voidmovebox(charx,chary) {

printf("step%d:monkey把箱子从%c运到%c\n",++i,x,y);//x表示箱子的位置,y为香蕉的位置 }

voidonbox() {

printf("step%d:monkey爬上箱子\n",++i); }

voidcatch() {

printf("step%d:monkey摘到香蕉\n",++i); }




本文来源:https://www.wddqw.com/doc/f1b6d16cb8d528ea81c758f5f61fb7360a4c2bb4.html