数学与软件科学学院实验报告学期:2015至2016第1学期2015年10月12日课程名称:人工智能概论专业:信息与计算科学实验编号:01实验项目:prolog基础指导教师:郭远华2012级5班学号:2012060503姓名:龚浪实验成绩:一、目的要求掌握visualprolog中的基本结构,包括域说明、谓词说明、事实和规则说明、目标说明;掌握简单查询,变量查询,组合查询,规则查询;熟悉递归设计,学习prolog语言与C等语言不同的思维方式;初步掌握prolog中cut(!)的用法。二、实验内容1.阅读下列prolog程序,回答问题。DOMAINSpara=symbolPREDICATESnondetermroom(para)nondetermlocation(para,para)nondetermedible(para)CLAUSESroom(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).GOALroom(office).(1)程序有几块?分别是什么作用?答:程序有四块,分别为域说明部分(DOMAINS),说明了谓词对象的数据类型;谓词说明部分(PREDICATES),定义程序中除内部谓词以外的所有谓词;子句部分(CLAUSES),列出全部事实和规则,也可看作是程序的静态数据;目标部分(GOAL),说明程序最后目标。(2)程序运行的结果?将GOAL部分的内容分别替换成room(pen),location(apple,kitchen),location(app,kitchen),location(Apple,kitchen),location(Apple,Kitchen)后,运行结果?为什么?答:程序运行结果为:yes。room(pen)的运行结果为:no。在数据库中没有事实与room(pen)匹配,查询失败。location(apple,kitchen)的运行结果为:yes。在数据库中找到与location(apple,kitchen)匹配的事实,查询成功。location(app,kitchen)的运行结果为:no。在数据库中没有事实与location(app,kitchen)匹配,查询失败。location(Apple,kitchen)的运行结果为:no。在数据库中没有事实与location(Apple,kitchen)匹配,查询失败。location(Apple,Kitchen)的运行结果为:Apple=desk,Kitchen=officeApple=apple,Kitchen=kitchenApple=flashlight,Kitchen=deskApple=washingmachine,Kitchen=cellarApple=nani,Kitchen=washingmachineApple=broccoli,Kitchen=kitchenApple=crackers,Kitchen=kitchenApple=computer,Kitchen=office8Solutions这里Apple和Kitchen作为变量,将数据库中每一条事实都显示出来。(3)将GOAL部分的内容分别替换成edible(X),location(X,kitchen),运行结果?并从回溯的角度分析结果产生原因。答:edible(X)的运行结果为:X=appleX=crackers2Solutions目标为edible(X),Prolog找到数据库中的第一条edible子句,并与目标进行比较:edible(X)子句#1edible(apple).匹配成功,因为这里的X是作为变量,而变量的值就被绑定成apple,解释器就会显示:X=apple。数据库中还有未搜索的子句,Prolog就继续寻找其他的答案,首先它会释放变量X的值,然后从上一次成功的位置的下一条子句开始继续搜索,即从子句edible(apple)开始往下搜索,然后找到第二条edible子句,并与目标进行比较:edible(X)子句#12edible(crackers).同样匹配成功,原理如上。所以解释器在搜索完毕后将显示:X=appleX=crackers2Solutions(4)说明prolog中的规则的语法,添加规则where_food(X,Y):-location(X,Y),edible(X).并将GOAL的内容替换为where_food(X,kitchen).给出运行结果并分析结果产生原因。答:规则的语法如下:head:-body其中,(1)head是谓词的定义部分,与事实一样,也包括谓词名和谓词的参数说明。(2):-连接符,一般可以读作‘如果’。(3)body一个或多个目标,与查询相同。在PREDICATES中添加nondetermwhere_food(para,para)后,运行结果为:X=appleX=crackers2Solutions在数据库中满足事实where_food(X,kitchen)的只有apple和crackers。因为要同时满足X在kitchen房间中,并且X可食。(5)写一段prolog代码求解下面的问题对于所有的X,只要X是一个人,它就属于人类。苏格拉底(socrates)是一个人,判断苏格拉底是不是属于人类?(谓词有2个,person(name):name是人,moral(name):name是人类)答:DOMAINSname=symbolPREDICATESperson(name)moral(name)CLAUSESperson(socrates).moral(X):-person(X).GOALmoral(X).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).)答:PREDICATESnondetermroad(symbol,symbol)nondetermpath(symbol,symbol)CLAUSESroad(a,c).road(a,b).road(b,d).road(c,d).road(d,e).road(c,e).path(a,c).path(a,b).path(b,d).path(c,d).path(d,e).path(c,e).path(X,Y):-road(X,Y).path(X,Y):-road(X,Z),path(Z,Y).GOALroad(X,Y).(2)将第二条规则改成path(X,Y):-road(X,Z),path(Z,Y),!.给出运行结果并分析原因。运行结果为:X=a,Y=cX=a,Y=bX=b,Y=dX=c,Y=dX=d,Y=eX=c,Y=e6Solutions3.下面的程序实现了正整数的累加(如3+2+1=6,4+3+2+1=10等):DOMAINSpara=integerPREDICATESadd(para,para)CLAUSESadd(0,0):-!.add(M,N):-M1=M-1,abcdeadd(M1,N1),N=N1+M.GOALadd(3,X).参考并写出实现正整数阶乘的程序(如3*2*1=6)。答:DOMAINSpara=integerPREDICATESadd(para,para)CLAUSESadd(1,1):-!.add(M,N):-M1=M-1,add(M1,N1),N=N1*M.GOALadd(4,X).运行结果为:X=241Solution