人工智能实验报告1 prolog初步.docx
《人工智能实验报告1 prolog初步.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告1 prolog初步.docx(10页珍藏版)》请在冰点文库上搜索。
![人工智能实验报告1 prolog初步.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/824dd181-b4ad-4160-807e-4595def0e27f/824dd181-b4ad-4160-807e-4595def0e27f1.gif)
人工智能实验报告1prolog初步
数学与软件科学学院实验报告
学期:
2016至2017第1学期
日期:
课程名称:
人工智能概论
专业:
信息与计算机科学
实验编号:
01
实验项目:
Prolog基础
指导教师:
郭远华
学号:
姓名:
实验成绩:
一、目的要求
掌握visualprolog中的基本结构,包括域说明、谓词说明、事实和规则说明、目标说明;
掌握简单查询,变量查询,组合查询,规则查询;
熟悉递归设计,学习prolog语言与C等语言不同的思维方式;
初步掌握prolog中cut(!
)的用法。
2、实验内容
1.阅读下列prolog程序,回答问题。
DOMAINS
para=symbol
PREDICATES
nondetermroom(para)
nondetermlocation(para,para)
nondetermedible(para)
CLAUSES
room(kitchen).
room(office).
room(hall).
room("diningroom").
room(cellar).
location(desk,office).
location(apple,kitchen).
location(flashlight,desk).
location("washingmachine",cellar).
location(nani,"washingmachine").
location(broccoli,kitchen).
location(crackers,kitchen).
location(computer,office).
edible(apple).
edible(crackers).
GOAL
room(office).
(1)程序有几块?
分别是什么作用?
答:
程序中有四块。
分别是:
a.域说明部分(domains),作用是说明谓词对象的数据类型
b.谓词说明部分(predicates),作用是定义程序中除内部谓词以外的所有谓词。
c.子句部分(clauses),作用是列出全部事实和规则,也可看作是程序的静态数据。
d.在目标部分(GOAL),作用是说明程序的目标。
一个程序目标可以由多个字目标复合而成。
(2)程序运行的结果?
将GOAL部分的内容分别替换成room(pen),location(apple,kitchen),location(app,kitchen),location(Apple,kitchen),location(Apple,Kitchen)后,运行结果?
为什么?
答:
运行的结果为:
分别做替换的运行结果及原因如下:
1)room(pen):
结果:
原因:
在数据库中找不到room(pen)这样的事实。
2)location(apple,kitchen):
结果:
原因:
子句中第七句与之匹配成功。
3)location(app,kitchen):
结果:
原因:
没有子句与之匹配。
4)location(Apple,kitchen):
结果:
原因:
Apple作为变量,kitchen作为常量,子句第7、11、12句中第二个参数与kitchen匹配,Apple依次被绑定为apple、broccoli和crackers。
5)location(Apple,Kitchen):
结果:
原因:
Apple和Kitchen都作为变量,所以返回所有匹配结果。
(3)将GOAL部分的内容分别替换成edible(X),location(X,kitchen),运行结果?
并从回溯的角度分析结果产生原因。
1)edible(X)
结果:
原因:
子句中有两个edible事实,分别为apple和crackers
2)location(X,kitchen)
结果:
原因:
X作为变量,kitchen作为常量,子句中第二(location(apple,kitchen))、六(location(broccoli,kitchen))、七(location(crackers,kitchen))句与第二个参数匹配
(4)添加规则
where_food(X,Y):
-location(X,Y),edible(X).
并将GOAL的内容替换为
where_food(X,kitchen).
给出运行结果并分析结果产生原因。
答:
结果如下
原因:
混合查询厨房里能吃的东西,首先找到与location第二个参数匹配的事实(即厨房里的东西)绑定X值,再判断X是否与edible事实匹配,依次重复这两步从而得到以上结果。
(5)写一段prolog代码求解下面的问题
对于所有的X,只要X是一个人,它就属于人类。
苏格拉底(socrates)是一个人,判断苏格拉底是不是属于人类?
(谓词有2个,person(name):
name是人,moral(name):
name是人类)
答:
设计一个person事实和一个moral规则,代码及运行结果如下:
DOMAINS
name=symbol
PREDICATES
nondetermperson(name)
nondetermmoral(name)
CLAUSES
person(socrates).
moral(X):
-person(X).
GOAL
moral(socrates).
结果:
所以苏格拉底是人类。
2.
(1)写prolog程序找出下图中所有的通路?
(图中的点之间的关系要表达为事实,谓词2个,road(a,b)表示a、b连接,并接从a指向b,path(a,b)表示有从a到b的通路;规则两条,path(X,Y):
-road(X,Y).和path(X,Y):
-road(X,Z),path(Z,Y).)
答:
代码如下:
DOMAINS
node=symbol
PREDICATES
nondetermroad(node,node)
nondetermpath(node,node)
CLAUSES
road(a,b).
road(a,c).
road(b,e).
road(b,d).
road(c,d).
road(d,e).
path(X,Y):
-road(X,Y).
path(X,Y):
-road(X,Z),path(Z,Y).
GOAL
path(X,Y).
结果:
原因:
回溯,
(2)将第二条规则改成
path(X,Y):
-road(X,Z),path(Z,Y),!
.
给出运行结果并分析原因。
答:
结果:
原因:
无回溯过程,
3.下面的程序实现了正整数的累加(如3+2+1=6,4+3+2+1=10等):
DOMAINS
para=integer
PREDICATES
add(para,para)
CLAUSES
add(0,0):
-!
.
add(M,N):
-
M1=M-1,
add(M1,N1),
N=N1+M.
GOAL
add(3,X).
参考并写出实现正整数阶乘的程序(如3*2*1=6)。
答:
代码如下:
DOMAINS
para=integer
PREDICATES
mul(para,para)
CLAUSES
mul(1,1):
-!
.
mul(M,N):
-
M1=M-1,
mul(M1,N1),
N=N1*M.
GOAL
mul(3,X).
结果:
替换GOALmul(1,X)结果:
替换GOALmul(4,X)结果: