华北电力大学科技学院实验报告实验名称PROLOG语言编程练习及图搜索问题求解课程名称人工智能及应用专业班级:软件12K2学生姓名:学号:成绩:指导教师:刘丽实验日期:2015.5华北电力大学科技学院实验报告第2页共10页一、实验目的及要求实验目的:1.熟悉PROLOG的运行环境,进行PROLOG的基本编程练习。了解PROLOG语言中常量、变量的表示方法。PROLOG的简单程序结构,掌握分析问题、询问解释技巧;进行事实库、规则库的编写,并在此基础上进行简单的询问。具体实验课上相关内容,练习example1到example6的内容。2.图搜索问题求解。实验要求:1.爱因斯坦的超级问题有五个房子,每个房子的颜色不同,里面分别住着不同国家的人,每个人都有自己养的不同的宠物,喜欢喝不同的饮料,抽不同牌子的烟。现在已知以下的一些信息:a)英国人(englishman)住在红色(red)的房子里b)西班牙人(spaniard)养了一条狗(dog)c)挪威人(norwegian)住在左边的第一个房子里d)黄房子(yellow)里的人喜欢抽kools牌的香烟e)抽chesterfields牌香烟的人与养狐狸(fox)的人是邻居f)挪威人(norwegian)住在蓝色(blue)的房子旁边g)抽winston牌香烟的人养了一只蜗牛(Snails)h)抽LuckyStrike牌香烟的人喜欢喝桔子汁(orangejuice)i)乌克兰人(ukrainian)喜欢喝茶(tea)j)日本人(japanese)抽parliaments牌的烟k)抽kools牌的香烟的人与养马(horse)的人是邻居l)喜欢喝咖啡(coffee)的人住在绿(green)房子里m)绿(green)房子在象牙白(ivory)房子的右边(图中的右边)n)中间那个房子里的人喜欢喝牛奶(milk)o)根据以上条件,你能告诉我哪个房子里的人养斑马(zebra),哪个房子里的人喜欢喝水(water)吗?或者你能把所有的东西都对号入座吗?2.传教士与野人问题传教士和食人者问题(TheMissionariesandCannibalsProblem)。在河的左岸有3个传教士、1条船和3个食人者,传教士们想用这条船将所有的成员运过河去,但是受到以下条件的限制:(1)传教士和食人者都会划船,但船一次最多只能装运两个;(2)在任何岸边食人者数目都不得超过传教士,否则传教士就会遭遇危险:被食人者攻击甚至被吃掉。此外,假定食人者会服从任何一种过河安排,试规划出一个确保全部成员安全过河的计划。二、所用仪器、设备PC机和trincprolog编译软件华北电力大学科技学院实验报告第3页共10页三、实验原理PROLOG语言是一种以逻辑推理为基础的逻辑型程序设计语言,是一种陈述性语言而不是过程性语言。PROLOG语言能够自动实现模式匹配和回溯、具备递归技术,而且语法简明,可以简化复杂问题求解。四、实验方法与步骤1.打开trincprolog编译软件2.新建文本并(Flie→New→TextEdit)3.根据实验要求在新建的文本中输入程序代码4.保存(Save)并编译(Compile)华北电力大学科技学院实验报告第4页共10页5.在trincprolog下输入问题显示(Prove)实验要求的结果五、求解的问题与程序1.爱因斯坦的超级问题代码:member(X,[X|Tail]).member(X,[Head|Tail]):-member(X,Tail).%X是表Tail的成员%定义房间各种属性的谓词color(h(C,N,P,Y,D),C).%h(C,N,P,Y,D)的color是Cnation(h(C,N,P,Y,D),N).%h(C,N,P,Y,D)的nation是Npet(h(C,N,P,Y,D),P).%h(C,N,P,Y,D)的pet是Pyan(h(C,N,P,Y,D),Y).%h(C,N,P,Y,D)的yan是Ydrink(h(C,N,P,Y,D),D).%h(C,N,P,Y,D)的drink的是D%定义邻居关系的谓词nextnext(A,B,[A,B,C,D,E]).next(B,A,[A,B,C,D,E]).%A和B在表中是相邻关系next(B,C,[A,B,C,D,E]).next(C,B,[A,B,C,D,E]).%B和C在表中是相邻关系next(C,D,[A,B,C,D,E]).next(D,C,[A,B,C,D,E]).%C和D在表中是相邻关系next(D,E,[A,B,C,D,E]).next(E,D,[A,B,C,D,E]).%D和E在表中是相邻关系华北电力大学科技学院实验报告第5页共10页%定义房子位置的谓词middle(X,[_,_,X,_,_]).%X在表中的中间位置first(A,[A|X]).%A是表X的表头%定义房子右边的关系谓词rightright(A,B,[A,B,C,D,E]).%表中B在A的右边right(B,C,[A,B,C,D,E]).%表中C在B的右边right(C,D,[A,B,C,D,E]).%表中D在C的右边right(D,E,[A,B,C,D,E]).%表中E在D的右边solve(X,TT,TTT):-%把X绑定为房间列表,此时的房间的属性还不能确定,所以都使用变量代表。X=[h(C1,N1,P1,Y1,D1),h(C2,N2,P2,Y2,D2),h(C3,N3,P3,Y3,D3),h(C4,N4,P4,Y4,D4),h(C5,N5,P5,Y5,D5)],%英国人(englishman)住在红色(red)的房子里。member(Z1,X),%从X列表中选择一个房间Z1color(Z1,red),%Z1的颜色是rednation(Z1,englishman),%Z1里住的人是englishman%西班牙人(spaniard)养了一条狗(dog)。member(Z2,X),%从X列表中选择一个房间Z2pet(Z2,dog),%Z2里养的宠物是dognation(Z2,spaniard),%Z2里住的人是spaniard%挪威人(norwegian)住在左边的第一个房子里。first(Z3,X),%X列表中第一个房间Z3nation(Z3,norwegian),%Z3里住的人是norwegian%黄房子(yellow)里的人喜欢抽kools牌的香烟。member(Z4,X),%从X列表中选择一个房间Z4yan(Z4,kools),%Z4里抽的烟是koolscolor(Z4,yellow),%Z4的颜色是yellow%抽chesterfields牌香烟的人与养狐狸(fox)的人是邻居。member(Z5,X),%从X列表中选择一个房间Z5pet(Z5,fox),%Z5里养的宠物是foxnext(Z6,Z5,X),%Z5的邻居是Z6yan(Z6,chesterfields),%Z6里抽的烟是chesterfields华北电力大学科技学院实验报告第6页共10页%挪威人(norwegian)住在蓝色(blue)的房子旁边。member(Z7,X),%从X列表中选择一个房间Z7color(Z7,blue),%Z7的颜色是bluenext(Z8,Z7,X),%Z7的邻居是Z8nation(Z8,norwegian),%Z8里住的人是norwegian%抽winston牌香烟的人养了一只蜗牛(Snails)。member(Z9,X),%从X列表中选择一个房间Z9yan(Z9,winston),%Z9里抽的烟是winstonpet(Z9,snails),%Z9里养的宠物是snails%抽LuckyStrike牌香烟的人喜欢喝桔子汁(orangejuice)。member(Z10,X),%从X列表中选择一个房间Z10drink(Z10,'orangejuice'),%Z10里喝的饮料是orangejuiceyan(Z10,'LuckyStrike'),%Z10里抽的烟是LuckyStrike%乌克兰人(ukrainian)喜欢喝茶(tea)。member(Z11,X),%从X列表中选择一个房间Z11nation(Z11,ukrainian),%Z11里住的人是ukrainiandrink(Z11,tea),%Z11里喝的饮料是tea%日本人(japanese)抽parliaments牌的烟。member(Z12,X),%从X列表中选择一个房间Z12nation(Z12,japanese),%Z12里住的人是japaneseyan(Z12,parliaments),%Z12里抽的烟是parliaments%抽kools牌的香烟的人与养马(horse)的人是邻居member(Z13,X),%从X列表中选择一个房间Z13pet(Z13,horse),%Z13里养的宠物是horsenext(Z14,Z13,X),%Z13的邻居是Z14yan(Z14,kools),%Z14里抽的烟是kools%喜欢喝咖啡(coffee)的人住在绿(green)房子里。member(Z15,X),%从X列表中选择一个房间Z15color(Z15,green),%Z15的颜色是greendrink(Z15,coffee),%Z15里喝的饮料是office华北电力大学科技学院实验报告第7页共10页%绿(green)房子在象牙白(ivory)房子的右边(图中的右边)member(Z16,X),%从X列表中选择一个房间Z16color(Z16,ivory),%Z16的颜色是ivoryright(Z16,Z17,X),%在Z16右边的房子是Z17color(Z17,green),%Z17的颜色是green%中间那个房子里的人喜欢喝牛奶(milk)。middle(Z18,X),%从X列表中选择一个房间Z18drink(Z18,milk),%Z18里喝的饮料是milk%以上是所以的条件,下面开始回答我们的问题%找出宠物为zebra的房间。member(TT,X),%从X列表中选择一个房间TTpet(TT,zebra),%TT里养的宠物是zebra%找出喝水的房间。member(TTT,X),%从X列表中选择一个房间TTTdrink(TTT,water).%TTT里喝的饮料是water2.传教士与野人问题代码:%船上所能够载人的状态就是可能的操作move(1,0).%表示船上有一位传教士,没有野人move(0,1).%表示船上没有传教士,有一位野人move(0,2).%表示船上没有传教士,有两位野人move(2,0).%表示船上有两位传教士,没有野人move(1,1).%表示船上有一位传教士,一个野人%判断两岸的状态是否合法legal((X,Y,_)):-%X为左岸,Y为右岸,_取0左岸或1右岸legal1(X),%判断左岸的状态是否合法legal1(Y).%判断有岸的状态是否合法legal1((X,Y)):-X=:=0,Y=0,!.%传教士人数为0,野人的人数大于0,合法legal1((X,Y)):-Y=:=0,X=0,!.%野人人数为0,传教士的人数大于0,合法legal1((X,Y)):-X=Y,X=0,Y=0.%传教士数大于等于野人数,且都大于0,合法华北电力大学科技学院实验报告第8页共10页%update谓词能够完成把合理的移动作用的某个状态上,从而到达新的状态。update((X,Y,0),Move,Statu1):-%船在左岸将要采取的操作。(A,B)=X,%X储存A,B两个数值(C,D)=Y,%Y储存C,D两个数值(E,F)=Move,%船上Move储存传教士E,野人F两个数值C1isC+E,%用C1记录C+E的结果D1isD+F,%用D1记录D+F的结果A1isA-E,%用A1记录A-E的结果B1isB-F,%用B1记录B-F的结果Statu1=((A1,B1),(C1,D1),1).%船到右岸后左右两岸传教士野人的人数状况update((X,Y,1),Move,Statu1)