利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图1所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请定义必要的谓词,列出问题的初始化状态(可变),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置b)。(附加:从初始状态到目标状态的谓词演算过程。)

香蕉位置在B即0

思路:
用数字表示猴子和香蕉的位置,-1为A,0为B,1为C;当猴子站在箱子上用1表示,反之则用-1表示。用一个结构体表示整个场景的状态,
其中包括猴子和箱子的位置以及猴子是否在箱子上,猴子每次进行下一次行为记为下一个状态。所有状态用整个结构体数组存储,每一次猴子行为
用另一字符指针数组存储,最后打印输出猴子摘香蕉过程。
代码:

#include<iostream>
#include <stdio.h>
using namespace std;struct State
{int monkey; int box;int banana;//香蕉在Bint monbox;
};
struct State States[10];
const char* actionsave[10];void monkeygoto(int b, int i)//猴子走向位置
{int a;a = b;if (a == -1){actionsave[i] = "Monkey go to A";States[i + 1] = States[i];States[i + 1].monkey = -1;}else if (a == 0){actionsave[i] = "Monkey go to B";States[i + 1] = States[i];States[i + 1].monkey = 0;}else if (a == 1){actionsave[i] = "Monkey go to C";States[i + 1] = States[i];States[i + 1].monkey = 1;}}void movebox(int a, int i)//猴子推箱子移动位置
{int B;B = a;if (B == -1){actionsave[i] = "monkey move box to A";States[i + 1] = States[i];States[i + 1].monkey = -1;States[i + 1].box = -1;}else if (B == 0){actionsave[i] = "monkey move box to B";States[i + 1] = States[i];States[i + 1].monkey = 0;States[i + 1].box = 0;}else if (B == 1){actionsave[i] = "monkey move box to C";States[i + 1] = States[i];States[i + 1].monkey = 1;States[i + 1].box = 1;}
}void climbonto(int i)//猴子爬上箱子
{actionsave[i] = "Monkey climb onto the box";States[i + 1] = States[i];States[i + 1].monbox = 1;
}void climbdown(int i)//如果初始状态猴子在箱子上,则需要爬下来
{actionsave[i] = "Monkey climb down from the box";States[i + 1] = States[i];States[i + 1].monbox = -1;
}void reach(int i)//猴子拿到香蕉
{actionsave[i] = "Monkey reach the banana";
}void showSolution(int i)//打印猴子过程操作
{int c;cout<<"Result to problem:"<<endl;for (c = 0; c < i + 1; c++){cout<<actionsave[c]<<endl;}cout << endl;
}void nextStep(int i)//猴子下一步动作
{int c;int j;//超过一定步数,判断为有问题if (i >= 10){cout << "steplength reached 10,have problem! " << endl;return;}//成功拿到香蕉if (States[i].monbox == 1 && States[i].monkey == 0 && States[i].banana == 0 && States[i].box == 0){if (i == 0){reach(i);}showSolution(i);return;}j = i + 1;//进行数据更新,用来标记当前是第几个状态if (States[i].monkey == 0)//猴子位置B{if (States[i].box == 0)//箱子位置B{if (States[i].monbox == -1)//猴子没爬上箱子{climbonto(i);reach(i + 1);nextStep(j);}}else if(States[i].box == 1)//箱子位置C{monkeygoto(States[i].box, i);nextStep(j);}else//箱子位置A{monkeygoto(States[i].box, i);nextStep(j);}}if (States[i].monkey == -1)//猴子位置A{if (States[i].box == -1)//同上{if (States[i].monbox == -1){movebox(0, i);nextStep(j);}else{climbdown(i);nextStep(j);}}else if (States[i].box == 0){monkeygoto(0, i);nextStep(j);}else{monkeygoto(1, i);nextStep(j);}}if (States[i].monkey == 1)//猴子位置C{if (States[i].box == 1){if (States[i].monbox == -1){movebox(0, i);nextStep(j);}else{climbdown(i);nextStep(j);}}else if (States[i].box == -1){monkeygoto(-1, i);nextStep(j);}else{monkeygoto(0, i);nextStep(j);}}
}
int main()
{while (1)   //测试{States[0].banana = 0;cout << "请输入初始位置:\n";cout << "monkey(-1 or 0 or 1):";cin >> States[0].monkey;cout << "box(-1 or 0 or 1):";cin >> States[0].box;cout << "monbox(-1 or 1):";cin >> States[0].monbox;   //判断输入是否符合要求,错误则提示并且重新输入if (States[0].monkey == -1 || States[0].monkey == 0 || States[0].monkey== 1){if (States[0].box == -1 || States[0].box == 0 || States[0].box == 1){if (States[0].monbox == -1 || States[0].monbox == 1){if ((States[0].monkey != States[0].box) && States[0].monbox == 1){cout << "input wrong" << endl<<endl;}else  nextStep(0);}else cout << "input wrong!" << endl<<endl;}else cout << "input wrong!" << endl<<endl;}else cout << "input wrong!" << endl<<endl;}
}

运行展示:

初始猴子在C,箱子在B;然后猴子走向B,爬上箱子摘到香蕉。

初始猴子和箱子在C并且在箱子上面,这时猴子需要 箱子上爬下来,然后把箱子推到B,再爬上箱子摘到香蕉。

利用一阶谓词逻辑求解猴子摘香蕉问题相关推荐

  1. 【C++】人工智能实验一 猴子摘香蕉/传教士与野人(含完整代码与状态迁移图)

    文章目录 一.猴子摘香蕉问题 1.问题描述 2.解题思路 3.实验结果及分析 实验结果一 实验结果二 实验结果三 4.实验结果 5.实验代码 二.传教士(牧师)与野人问题 1.问题描述 2.实验步骤 ...

  2. 猴子摘香蕉问题-人工智能模拟

    题目: 利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图1所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上.请定义必要的谓词,列出问题的 ...

  3. 人工智能基础---上机1:猴子摘香蕉

    人工智能基础-上机1:猴子摘香蕉 一.题目 利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图 1 所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再 ...

  4. 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次.docx...

    人工智能课内实验报告(8次)学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏(34) 学 号: 目 录课内实验1:猴子摘香蕉问题的VC编程实现--------1课内实验2:编程实现简单动 ...

  5. Python猴子摘香蕉问题

    Python猴子摘香蕉问题 房子里有一只猴子(即机器人,可在房间里任意活动:到处走动,推移箱子,攀登箱子等),初始位于a处.在b处上方的天花板上有一串香蕉,猴子想吃,但摘不到.房间的c处还有一个箱子, ...

  6. 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次 -...

    人工智能课内实验报告 (8次) 学 院:自动化学院 班 级: 智能1501 姓 名: 刘少鹏(34) 学 号:06153034 目 录 课内实验1:猴子摘香蕉问题的VC编程实现????????1 课内 ...

  7. 实验1:猴子摘香蕉问题的Python编程实现

    实验目的 (1)熟悉谓词逻辑表示法; (2)掌握人工智能谓词逻辑中的经典例子--猴子摘香蕉问题的编程实现. 实验内容 房子里有一只猴子(即机器人),位于a处.b处上方的天花板上有一串香蕉,猴子想吃,但 ...

  8. 【SC应用】【人工智能】Java实现猴子摘香蕉,动画显示

    人工智能课程实验一的任务,写出猴子摘香蕉问题的知识表示,并用代码实现推理过程 问题描述 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一 ...

  9. 用软件构造的思想解决猴子摘香蕉问题

    背景简介/问题描述 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态 ...

  10. 人工智能猴子摘香蕉问题

    猴子摘香蕉问题: 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下 ...

最新文章

  1. iOS7导航栏和状态栏的定制
  2. C++标准库中各种排序归纳
  3. python代码该怎么简化_如何简化这个python代码(从书中分配)?
  4. Java入门(一):Hello World !
  5. ITK:表面提取之前平滑二值图像
  6. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)
  7. 利用CSS边框合并属性打造table细边框
  8. 前端(jQuery)(10)-- jQuery标签切换
  9. iframe 父级元素查找
  10. Ubuntu18.04 orb-slam3编译出现的错误 undefined reference to symbol ‘_ZN3MPI8Datatype4FreeEv‘ libmpi_cxx.so
  11. python实现三个或三个以上列表之间元素相互组合
  12. 删除文档中的中文字符---只保留英文字符
  13. Ubuntu18.04忘记超级用户root密码,重新设置密码
  14. Vue中的自定义指令
  15. Java常用开源框架
  16. [图论]最大流问题(Maximum flow)的定义
  17. 两万用户的项目需要多大服务器,两万左右服务器配置
  18. echarts最新版做中国地图(详细版+避雷版)
  19. RK3288_Android_8.1_定频关机
  20. 数据库的“读写分离”

热门文章

  1. PCBA方案设计——蓝牙脂肪心率秤方案
  2. 如何给文件夹自定义图标?
  3. 【FINAL】NOI
  4. MPU6050 加速计滤波
  5. 【Love2d从青铜到王者】第九篇:Love2d之库(library)
  6. love2d 开发环境
  7. mysql如何进行数据透视_简单谈谈MySQL数据透视表
  8. 记录struts2 和struts1的页面验证码生成
  9. Excel从入门到精通--基础篇
  10. Linux共享后无权限访问,Samba服务无权限访问