人工智能导论实验1——机器人搬盒子&爱因斯坦斑马问题

人工智能导论实验1——机器人搬盒子&爱因斯坦斑马问题

实验目的及要求
理解谓词逻辑知识表示的方法,掌握一阶谓词逻辑知识表示的基本原理,能够利用归结原理求解简单问题。掌握Prolog编程环境,熟悉逻辑推理编写过程。
主要知识点:谓词、原子公式、谓词公式、子句、子句集、空子句、归结原理。
重点:谓词公式、子句集和归结原理的实现。
难点:归结原理的实现。

实验内容:
实验项目1:
机器人搬盒子问题:设在一个房间里,有一个机器人ROBOT ,一个壁橱ALCOVE,一个积木块BOX,两个桌子A和B。开始时,机器人ROBOT在壁橱ALCOVE旁边,且两手空空,桌子A放着积木块BOX,桌子B是空的。机器人可把积木块BOX从一种状态桌子A上变换成另一种状态桌子B上,然后回到壁橱。用归结原理方法求解该问题?

实验要求:
1.用谓词公式表示问题的初始状态、目标状态以及机器人操作;
2.将谓词公式转换为子句集;
3. 利用归结原理对子句集中的子句进行归结。
4. 用Prolog实现机器人搬盒子的谓词逻辑。
5. 用Python或其他编程语言实现该问题的求解。

实验项目2:
爱因斯坦逻辑难题(斑马问题):5个不同国家且工作各不相同的人分别住在一条街上的5所房子里,每所房子的颜色不同,每个人都有自己养的不同宠物,喜欢喝不同的饮料。根据以下信息,你能告诉我哪所房子里的人养斑马,哪所房子里的人喜欢喝矿泉水吗?
6. 英国人住在红色的房子里
7. 西班牙人养了一条狗
8. 日本人是一个油漆工
9. 意大利人喜欢喝茶
10. 挪威人住在左边的第一个房子里
11. 绿房子在白房子的右边
12. 摄影师养了一只蜗牛
13. 外交官住在黄房子里
14. 中间那个房子的人喜欢喝牛奶
15. 喜欢喝咖啡的人住在绿房子里
16. 挪威人住在蓝色的房子旁边
17. 小提琴家喜欢喝橘子汁
18. 养狐狸的人所住的房子与医生的房子相邻
19. 养马的人所住的房子与外交官的房子相邻

实验要求:
20. 用Prolog实现斑马问题的逻辑推理。
21. 在华为云的ModelArts中用Python实现该问题的求解。

思考题:
22. 如何将谓词公式转换为子句集?
23. 谓词公式与子句集等值吗?

实验步骤:

项目试验1:

1.相关谓词定义:

table (x):x 是桌子
empty (y):y 手中是空的
at( y,z): y 在 z 附近
holds (y,w):y 拿着 w
on(w,x):w 在 x 上面

问题初始状态
table (a)
table (b)
empty (robot)
at( robot,alcove)
on(box,a)

问题目标状态
table (a)
table (b)
empty (robot)
at( y,z)
on(box,a)

机器人操作:
goto(x,y):
条件:at( robot,x)
动作:删除:at( robot,x)
增加:at( robot,y)
pickup(x):
条件:on(box,x) ^ table(x) ^ empty(robot)
动作:删除: on(box,x) ^ empty(robot)
增加:hold(robot,box)
setdown(x):
条件:hold(robot,box) ^ table(x)
动作:
删除:hold(robot,box)
增加:empty(robot) ^ on(box,x)

2.将谓词公式转换为子句集

机器人x在c处手里没有盒子,盒子y在a处,那么机器人去a拿起盒子y:
(∀ x) (∀y) empty (x) ⋀ at( x,alcove)⋀ on(y,a)→go(a)⋀ pick(y)
转化为子句集为
{ empty (x,f(x)) ⋀ at( y,g(y)⋀ on(y,g(y) ,go(x,f(x))⋀ pick(y,g(y))

机器人x在a手中有盒子y,那么机器人x走到b放下盒子y:
(∀ x) (∀y) ┐ empty (x) ⋀ at( x,a)⋀ holds (x,y)→go(b)⋀ set-down(y)
转化为子句集为
{┐ empty (x,f(x)) ⋀ at( x,g(x))⋀ holds (x,z(x)),go(y,f(y))⋀ set-down(y,g(y))}

机器人x在b手中没有盒子,盒子y在b处,那么机器人走到c处:
(∀ x) (∀y) empty (x) ⋀ at( x,b)⋀ on(y,b)→go(alcove)
转化为子句集为
{empty (x,f(x)) ⋀ at( x,g(x))⋀ on(y,f(y)),go(x,z(x))}

3.利用归结原理对子句集中的子句进行归结

(1)at(robot,c)
(2)at(box,a)
(3)empty(robot)
(4) at(robot,c) ⋀at(box,a) ⋀empty(robot)
(5) ┐ empty (x) ⋀ at( x,a)⋀ holds (x,y)
(6) go(b)⋀ set-down(y)
(7) empty (x) ⋀ at( x,b)⋀ on(y,c)→go(c)

4.用Prolog实现机器人搬盒子的谓词逻辑
table(a). 
table(b).
empty(robot).
at(robot,c). 
on(box,a).
goto(robot,a):-at(robot,c).

at(robot,a).
pick(a):-empty(robot),on(box,a),table(a).

on(box,robot).
empty(a).
goto(robot,b):-at(robot,a),empty(a),on(box,robot).

at(robot,b).
set-down(b):-table(b),on(box,robot),at(robot,b).

empty(robot).
on(box,b).
at(robot,b).
goto(robot,c):-on(box,b),at(robot,b).

at(robot,c).
empty(robot).
on(box,b).
finish(box):-on(box,b),at(robot,c),empty(robot).
5. C语言实现
#include <stdio.h>
#include <stdlib.h>
/**
* @author 
*/
// 描述系统状态
typedef struct Problem {
   
	char robot_site; // 描述机器人的位置
	char is_robot_block; // 机器人手中是否拿着箱子
	char block_site; // 箱子所在位置
}SProblem;
// 初始化系统初始状态和目标状态
int init_status(SProblem* obj, SProblem* p, int* status_number) {
   
	obj->robot_site = 'c';
	obj->is_robot_block = 'N';
	obj->block_site = 'b';
	p->robot_site = 'c';
	p->is_robot_block = 'N';
	p->block_site = 'a';
	printf(" 状态 %d:\n 机器人当前所在位置 : %c, 机器人是否拿着箱子: %c,箱子所在位置: %c。\n\n", *status_number, p->robot_site, p->is_robot_block, p->block_site);
	*status_number += 1;
}
// 机器人移动
int robot_move(SProblem* p, char robot_object_site, int* status_number) {
   
	char temp_robot_site = p->robot_site;
	p->robot_site = robot_object_site;
	printf(" 状态 %d:\n 机器人从 %c 移动到了 %c。\n\n", *status_number, temp_robot_site,
		p->robot_site);
	*status_number 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来杯橙汁压惊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值