实验报告实验名称PROLOG语言编程练习及图搜索问题求解人工智能及应用专业班级:学生姓名:号:成绩:指导教师:实验日期:2014年5月||课程名称学(实验报告如打印,纸张用A4,左装订;页边距:上下2.5cm,左2.9cm,右2.1cm;字体:宋体小四号,1.25倍行距。)验证性、综合性实验报告应含的主要内容:一、实验目的及要求二、所用仪器、设备三、实验原理四、实验方法与步骤五、实验结果与数据处理
六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见)
七、所附实验输出的结果或数据
设计性实验报告应含的主要内容:一、设计要求二、选择的方案三、所用仪器、设备四、实验方法与步骤五、实验结果与数据处理六、结论(依据“设计要求”)七、所附实验输出的结果或数据
华北电力大学实验报告
一、实验目的及要求
1.
熟悉PROLOG的运行环境,进行PROLOG的基本编程练习。
了解PROLOG语言中常量、变量的表示方法。PROLOG的简单程序结构,掌握分析问题、询问解释技巧;进行事实库、规则库的编写,并在此基础上进行简单的询问。
具体实验课上相关内容,练习example1到example6的内容。2.
图搜索问题求解。
任选以下实际应用题目:爱因斯坦的超级问题、字谜问题、汉诺塔问题、八数码问题、八皇后问题、农夫过河问题、传教士野人问题等,选两个。
要求实验报告中包括:程序分析、运行结果、实验收获、难点重点分析等。
二、所用仪器、设备
PC机和trincprolog编译软件。
三、实验原理
PROLOG语言是一种以逻辑推理为基础的逻辑型程序设计语言,是一种陈述性语言而不是过程性语言。PROLOG语言能够自动实现模式匹配和回溯、具备递归技术,而且语法简明,可以简化复杂问题求解。
1、prolog本身自带推理机,其回溯、递归技术和表处理技术可简化复杂问题求解。2、trinicprolog的跟踪、设断点对于调试程序是非常有用的。
四、实验方法与步骤
1、
说明用实例如何观察并理解回溯机制
回溯机制所谓回溯,就是在程序运行期间,当某一个子目标不能满足(即谓词匹配失败)时,控制就返回到前一个已经满足的子目标(如果存在的话),并撤消其有关变量的约束值,然后再使其重新满足。成功后,再继续满足原子目标。如果失败的子目标前再无子目标,则控制就返回到该子目标的上一级目标(即该子目标谓词所在规则的头部)使它重新匹配。回溯是PROLOG的一个重要机制。
例如:农夫过河问题的move(...),其对应有四个子目标。当某个子目标不成立时,就会回溯到前一个子目标,撤销原约束值,然后重新合一。
2、如何用断点、跟踪以及显示调试prolog程序
将鼠标移动至语句之前单击便打入了断点。编译了以后,如果点“Prove”这个按钮,则
第
页共
页
华北电力大学实验报告
程序运行到断处。
点“Traceon”这个按钮便进入单步运行状态,即跟踪状态。点击“Startstep”开始单步运行程序。
知道了如何单步运行与打断点,很容易就可以对prolog程序进行调试。
注:说明实验的操作过程。
五、求解的问题与程序
注:说明所选择实验题目,问题分析过程和程序难点分析等。1.险洞探险问题:Treasure-route代码:
go(Start,Goal):-route(Start,Goal,[Start],VisitedL),reverse(VisitedL,[],RVisitedL),write(\"Onerouteis:\"),write(RVisitedL),nl,nl,fail.go(_,_).
neighbor(X,Y):-gallery(X,Y).neighbor(X,Y):-gallery(Y,X).
gallery(entry,fountain).gallery(entry,monsters).
gallery(monsters,goldtreasure).gallery(goldtreasure,food).gallery(food,fountain).
gallery(goldtreasure,robbers).gallery(goldtreasure,exit).gallery(fountain,mermaid).gallery(fountain,robbers).gallery(mermaid,exit).gallery(hell,fountain).
gallery(mermaid,goldtreasure).avoid([monsters,hell,robbers]).
route(Room,Room,VisitedL,VisitedL):-member(goldtreasure,VisitedL),!.
route(Room,WayOut,VisitedL0,VisitedL):-neighbor(Room,NextRoom),avoid(DangousL),
not(member(NextRoom,DangousL)),not(member(NextRoom,VisitedL0)),
route(NextRoom,WayOut,[NextRoom|VisitedL0],VisitedL).
第
页共
页
华北电力大学实验报告
/*
route(Room,WayOut,VisitedL0,VisitedL):-gallery(NextRoom,Room),avoid(DangousL),
nomember(NextRoom,DangousL),nomember(NextRoom,VisitedL0),
write(\"CurrentRoom:\"),write(NextRoom),nl,
route(NextRoom,WayOut,[NextRoom|VisitedL0],VisitedL).nomember(X,[]).
nomember(X,[X|_]):-!,fail.nomember(X,[_|T]):-nomember(X,T).*/
member(X,[X|_]).member(X,[_|T]):-member(X,T).reverse([],Y,Y).
reverse([H|T],R0,R):-reverse(T,[H|R0],R).
2.农夫过河问题:
move(state(X,X,G,C),state(Y,Y,G,C)):-opp(X,Y),not(unsafe(state(Y,Y,G,C))),writelist(['tryfamerwolf',Y,Y,G,C]).
move(state(X,W,X,C),state(Y,W,Y,C)):-opp(X,Y),not(unsafe(state(Y,W,Y,C))),writelist(['tryfamergoat',Y,W,Y,C]).
move(state(X,W,G,X),state(Y,W,G,Y)):-opp(X,Y),not(unsafe(state(Y,W,G,Y))),writelist(['tryfamercabage',Y,W,G,Y]).
move(state(X,W,G,C),state(Y,W,G,C)):-opp(X,Y),not(unsafe(state(Y,W,G,C))),writelist(['tryfamerhimself',Y,W,G,C]).
move(state(F,W,G,C),state(F,W,G,C)):-writelist(['BACKTRACKFROM',F,W,G,C])/*,fail*/.
takestakestakestakes
path(Goal,Goal,Been_stack):-write('SolutionPathIS'),nl,reverse_print_stack(Been_stack).
path(State,Goal,Been_stack):-move(State,Next_state),not(member_stack(Next_state,Been_stack)),
stack(Next_state,Been_stack,New_been_stack),path(Next_state,Goal,New_been_stack).unsafe(state(X,Y,Y,C)):-opp(X,Y).unsafe(state(X,W,Y,Y)):-opp(X,Y).opp(e,w).opp(w,e).
writelist([]).%writelist([]):-nl.
writelist([H|T]):-write(H),nl,writelist(T).
reverse_writelist([]).
%reverse_writelist([[H|T]]):-reverse_writelist(T),write(H),nl.
第
页共
页
华北电力大学实验报告
reverse_writelist([H|T]):-reverse_writelist(T),write(H),nl.empty_stack([]).
stack(Top,Stack,[Top|Stack]).
reverse_print_stack(Stack):-empty_stack(Stack).
reverse_print_stack(Stack):-stack(E,Rest,Stack),reverse_print_stack(Rest),write(E),nl.member(X,[X|T]).
member(X,[_|T]):-member(X,T).
member_stack(Element,Stack):-member(Element,Stack).
go(Start,Goal):-empty_stack(Empty_been_stack),stack(Start,Empty_been_stack,Goal,Been_stack).
test:-go(state(w,w,w,w),state(e,e,e,e)).
Been_stack),path(Start,
六、讨论与结论
Prlolg的求解过程就是一个不断通过规则进行匹配,最后匹配到事实后回溯得出解的过程。本次实验通过求解险洞探险问题与农夫过河问题,加深了一些对人工智能这门课的理解。实验很成功地完成,收获很大。
七、所附实验输出的结果或数据1.险洞探险问题:
第页共页
华北电力大学实验报告
2.农夫过河问题:
第页共页
华北电力大学实验报告
八、实验问题解答
查询有哪些端口?
一开始使用Call端口进入目标,如果匹配成功就到了exit端口,
如果失败就到了fail端口,如果用户输入回车,则又从redo端口进入目标
每个端口的功能如下:
call开始使用目标搜寻子句;
exit目标匹配成功,在成功的子句上作记号,并绑定变量;
redo试图重新满足目标,首先释放变量,并从上次的记号开始搜索;fail表示再找不到更多的满足目标的子句了。
第页共页
华北电力大学实验报告
第页共页
因篇幅问题不能全部显示,请点此查看更多更全内容