1、学号:姓名:实验成绩:一、目的要求掌握visual prolog中的基本结构,包括域说明、谓词说明、事实和规则说明、目标说明;掌握简单查询,变量查询,组合查询,规则查询;熟悉递归设计,学习prolog语言与C等语言不同的思维方式;初步掌握prolog中cut(!)的用法。2、实验内容1.阅读下列prolog程序,回答问题。DOMAINSpara = symbolPREDICATESnondetermroom(para)nondetermlocation(para,para)nondetermedible(para)CLAUSESroom(kitchen).room(office).room(h
2、all).room(dining room).room(cellar).location(desk, office).location(apple, kitchen).location(flashlight, desk).location(washing machine, cellar).location(nani, location(broccoli, kitchen).location(crackers, kitchen).location(computer, office).edible(apple).edible(crackers).GOAL(1) 程序有几块?分别是什么作用?答:程序
3、中有四块。分别是:a.域说明部分(domains),作用是说明谓词对象的数据类型b.谓词说明部分(predicates),作用是定义程序中除内部谓词以外的所有谓词。c.子句部分(clauses),作用是列出全部事实和规则,也可看作是程序的静态数据。d.在目标部分(GOAL),作用是说明程序的目标。一个程序目标可以由多个字目标复合而成。 (2)程序运行的结果?将GOAL部分的内容分别替换成room(pen),location(apple, kitchen),location(app, kitchen),location(Apple, kitchen),location(Apple, Kitche
4、n)后,运行结果?为什么?运行的结果为:分别做替换的运行结果及原因如下: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和
5、Kitchen都作为变量,所以返回所有匹配结果。 (3)将GOAL部分的内容分别替换成edible(X),location(X, kitchen),运行结果?并从回溯的角度分析结果产生原因。1)edible(X)子句中有两个edible事实,分别为apple和crackers2)location(X, kitchen)结果:X作为变量,kitchen作为常量,子句中第二(location(apple, kitchen)、六(location(broccoli, kitchen)、七(location(crackers, kitchen)句与第二个参数匹配(4)添加规则where_food(X,
6、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是人类)设计一个per
7、son事实和一个moral规则,代码及运行结果如下:name = symbolnondeterm person(name)nondeterm moral(name)person(socrates).moral(X):-person(X).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
8、). )代码如下:node = symbolnondeterm road(node,node)nondeterm path(node,node)road(a,b).road(a,c).road(b,e).road(b,d).road(c,d).road(d,e).path(X,Y):- road(X,Y).- road(X,Z), path(Z,Y).path(X,Y).回溯,(2)将第二条规则改成- road(X,Z), path(Z,Y),!.给出运行结果并分析原因。无回溯过程,3. 下面的程序实现了正整数的累加(如3+2+1=6,4+3+2+1=10等):para = integer add(para,para)add(0,0):-!. add(M,N):-M1=M-1,add(M1,N1),N=N1+M. add(3,X).参考并写出实现正整数阶乘的程序(如3*2*1=6)。 答:mul(para,para)mul(1,1):mul(M,N):mul(M1,N1),N=N1*M. mul(3,X).替换GOALmul(1,X)结果:替换GOALmul(4,X)结果: