1目录实验一PROLOG语言编程练习·································2实验二图搜索问题求解······································4实验三小型专家系统(原型)设计······························7实验一PROLOG语言编程练习一、实验目的加深学生对逻辑程序运行机理的理解,使学生掌握PROLOG语言的特点、熟悉其编程环境,同时为后面的人工智能程序设计做好准备。1、熟悉PROLOG语言编程环境的使用;2、了解PROLOG语言中常量、变量的表示方法;3、了解利用PROLOG进行事实库、规则库的编写方法;二、实验环境计算机,TurboPROLOG教学软件。三、预习要求实验前应阅读实验指导书,了解实验目的、预习PROLOG语言的相关知识。四、实验内容1、学习使用TurboPROLOG,包括进入PROLOG主程序、编辑源程序、修改环境目录、退出等基本操作。2、在Turboprolog集成环境下调试运行简单的TurboPROLOG程序。3、编写一个描述亲属关系的PROLOG程序,然后再给出一些事实数据,建立一个小型演绎数据库。可以以父亲和母亲为基本关系(作为基本谓词),再由此来描述祖父、祖母、兄弟、姐妹以及其他亲属关系。4、修改教材2.2节例2.9的程序,使其能输出图中所有路径(path)。五、实验方法和步骤1、启动WindowsXP操作环境。2、打开文件目录,执行prolog应用程序,启动Turboprolog,并按空格键(SPACE)进入集成开发环境。3、选择Setup项,打开下拉菜单,选择Directories项,进行工作目录修改,按Esc键退出,选择SaveConfiguration项,保存修改。4、选择Files项,打开下拉菜单,选择Newfile项,进入源程序输入和编辑,或选择Load项,选择要打开的示例程序,再选择Edit项,可以进行编辑源程序。5、编辑之后,可以选择Run项,执行程序,可以在Dialog窗口进行询问,即外部目标2的执行,查看程序运行结果,分析程序之功能。6、仿前例,可以选择其他程序并运行,分析程序功能。7、退出,选择Quit项,可以退出TurboProlog程序,返回到WindowsXP环境。六、示例程序一个简单的学生成绩数据库查询程序。predicatesstudent(integer,string,real)gradegoalgrade.clausesstudent(1,zhang,90.2).student(2,li,95.5).student(3,wang,96.4).grade:-write(pleaseinputthename:),readln(Name),student(_,Name,Score),nl,write(Name,scoreis:,Score).grade:-write(Sorry,can'tfindthestudent!).七、实验报告要求实验报告应简单明了,语言通顺,结果正确,程序规范。实验报告的重点是实验结果的正确性与分析。包括:实验题目、要求、实验环境、实验内容与实验结果(要求附上运行的源程序)、实验中出现的问题、对问题的解决方案、实验总结等。3实验二图搜索问题求解一、实验目的加深学生对图搜索技术的理解,使学生掌握图搜索基本编程方法,并能利用图搜索技术解决一些应用问题。1.掌握Turboprolog软件编程方法;2.熟悉状态图和与或图搜索的基本算法;3.掌握图搜索问题求解中的问题表示、节点表示、close表和open表的构造。二、实验环境计算机,TurboPROLOG教学软件三、预习要求1.预习教材中有关状态图和与或图问题求解的内容,熟悉状态图和与或图求解的过程和方法;2.了解TurboPROLOG程序设计的基本知识。四、实验内容走迷宫是人们熟悉的一种游戏,如图1就是一个迷宫。如果我们把该迷宫的每一个格子以及入口和出口都作为节点,把通道作为边,则该迷宫可以由一个有向图表示。那么,走迷宫其实就是从该有向图的初始节点(入口)出发,寻找目标节点(出口)的问题,或者是寻找通向目标节点(出口)的路径的问题。用状态图搜索或与或图搜索方法,求出迷宫图中路径。图中S0为入口,Sg为出口。图1迷宫图4五、实验方法和步骤1.启动prolog编辑环境;2.用状态图搜索思想编辑迷宫问题求解的源程序;3.运行程序,分析结果;4.用与或图搜索思想编辑迷宫问题求解的源程序;5.运行程序,分析结果。六、示例程序下面是一个通用的状态图搜索程序。对于求解的具体问题,只需将其状态图的程序表示并入该程序即可。/*状态图搜索通用程序*/DOMAINSstate=领域说明%例如:state=symbolDATABASE-mydatabaseopen(state,integer)%用动态数据库实现OPEN表closed(integer,state,integer)%和CLOSED表res(state)open1(state,integer)min(state,integer)mark(state)fail—PREDICATESsolvesearch(state,state)resultsearchingstep4(integer,state)step56(integer,state)equal(state,state)repeatresulting(integer)rule(state,state)GOALsolve.CLAUSESsolve:-search(初始状态,目标状态),result./*例如solve:-search(st(0,1,2,3,4,5,6,7,8),st(0,2,8,3,4,5,6,7,1)),result.*/search(Begin,End):-%retractall(_,mydatabase),assert(closed(0,Begin,0)),5assert(open(Begin,0)),%步1将初始节点放入OPENassert(mark(End)),repeat,searching,!.result:-%not(fail_),retract(closed(0,_,0)),closed(M,_,_),resulting(M),!.result:-beep,write(″sorrydon'tfindaroad!″).searching:-open(State,Pointer),%步2若OPEN表空,则失败,retract(open(State,Pointer)),%步3取出OPEN表中第一个节点,closed(No,_,_),No2=No+1,%编号asserta(closed(No2,State,Pointer)),%放入CLOSED表!,step4(No2,State).searching:-assert(fail_).%步4若当前节点为目标节点,则成功step4(_,State):-mark(End),equal(State,End).%转步2step4(No,State):-step56(No,State),!,fail.step56(No,StateX):-%步5若当前节点不可扩展,转步2rule(StateX,StateY),%步6扩展当前节点X得Ynot(open(StateY,_)),%考察Y是否已在OPENnot(closed(_,StateY,_)),%考察Y是否已在CLOSEDassertz(open(StateY,No)),%fail.step56(_,_):-!.equal(X,X).repeat.repeat:-repeat.resulting(N):-closed(N,X,M),asserta(res(X)),resulting(M).resulting(_):-res(X),write(X),nl,fail.resulting(_):-!.rule(X,Y):-问题中的状态转换规则.%例如:rule(X,Y):-road(X,Y).七、实验报告要求1.实验报告应简单明了,语言通顺,结果正确,程序规范。实验报告的重点是实验结果的正确性与分析。包括:实验题目、要求、实验环境、实验内容与实验结果(要求附上运行的源程序)、实验中出现的问题、对问题的解决方案、实验总结等;2.迷宫问题求解的搜索结果及分析;3.比较状态图搜索和与或图搜索的特点。6实验三小型专家系统(原型)设计一、实验目的加深学生对专家系统原理的理解,使学生初步掌握专家系统的设计和实现方法。二、实验环境计算机,TurboPROLOG教学软件或VC++等三、预习要求1.了解专家系统设计与实现的一般方法;2.熟悉和掌握产生式系统的运行机制、产生式规则的程序语言实现;四、实验原理产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。五、实验内容综合利用人工智能的产生式系统、图搜索算法以及专家系统的框架,建造一个小型的医疗诊断专家系统,要求系统具有知识库、推理机和动态数据库三部分。编程语言不限。六、示例程序考虑到本实验有一定难度,下面给出一个示例程序,以供参考。例小型动物分类专家系统/*AnAnimalClassifyingExpertSystem*/databasexpositive(symbol,symbol)xnegative(symbol,symbol)predicatesrunanimal_is(symbol)it_is(symbol)7positive(symbol,symbol)negative(symbol,symbol)clear_factsremember(symbol,symbol,symbol)ask(symbol,symbol)goalrun.clausesrun:-animal_is(X),!write(\nYouranimalmaybea(n),X),n1,n1,clear_facts.run:-write(\Unbaletodeterminewhat),write(youranimalis.\n\n),clear_facts.positive(X,Y):-xpositive(X,Y),!.positive(X,Y):-not(xnegative(X,Y)),ask(X,Y).negative(X,Y):-xnegative(X,Y),!.negative(X,Y):-not(xnegative(X,Y)),ask(X,Y).ask(X,Y):-write(X,it,Y,\n),readln(Reply),remember(X,Y,Reply).remember(X,Y,y):-asserta(xpositive(X,Y)).remember(X,Y,n):-asserta(xnegative(X,Y)),fail.clear_facts:-retract(xpositive(_,_)),fail.clear_facts:-retract(xnegative(_,_)),fail.clear_facts:-write(\n\nPleasepressthespacebartoExit),readchar(_).animal_is(cheetah):-it_is(mammal),it_is(carnivore)),positive(has,tawny_color),positive(has,black_spots).animal_is(tiger):-it_is(mammal),it_is(carnivore),positive(has,tawny_color),positive(has,black_stripes).animal_is(giraffe):-it_is(ungulate),positive(has,lon