PROLOG语言编程练习及图搜索问题求解
- 格式:pdf
- 大小:193.14 KB
- 文档页数:12
第六章PROLOG语言6.3答:(1)目标不成功(2)目标不成功(3)目标成功,x,y,z被例化为x1,y1,z1(4)目标不成功(5)目标不成功6.4答:poglog规则Is_mother(x):_mother(x,y)Is_father(x):_father(x,y)Is_son(x):_father(y,x),male(x)Grandpa(x,y):_father(x,y1),father(y1,y)Sibling(x,y):_diff(x,y),mother(z1,x),mother(z1,y),father(z2,x), father(z2,y),parent(x,y)6.5答:(1)family1.cl文件头:/*****************************************************************************Copyright (c) Sabu Francis Associates******************************************************************************/ class family1open corepredicatesclassInfo : core::classInfo.% @short Class information predicate.% @detail This predicate represents information predicate of this class.% @endpredicatesrun : core::runnable.end class family1(2)family1.pack文件头:/*****************************************************************************Copyright (c) Sabu Francis Associates******************************************************************************/ #include @"family1.ph"% privately used packages#include @"pfc\filesystem\filesystem.ph"#include @"pfc\application\exe\exe.ph"#include @"pfc\console\console.ph"#include @"pfc\exception\exception.ph"% private interfaces% private classes% implementations#include @"family1.pro"(3)family1.ph文件头:/*****************************************************************************Copyright (c) Sabu Francis Associates******************************************************************************/ #requires @"family1.pack"% publicly used packages#include @"pfc\core.ph"% exported interfaces% exported classes#include @"family1.cl"(4) family1.prj6文件头:/*****************************************************************************Copyright (c) Sabu Francis Associates******************************************************************************/ implement family1open coreconstantsclassName = "family1".classV ersion = "$JustDate: $$Revision: $".clausesclassInfo(className, classVersion).domainsgender = female(); male().class facts - familyDBperson : (string Name, gender Gender).parent : (string Person, string Parent).class predicatesfather : (string Person, string Father) nondeterm anyflow.clausesfather(Person, Father) :-parent(Person, Father),person(Father, male()).class predicatesgrandFather : (string Person, string GrandFather) nondeterm (o,o).clausesgrandFather(Person, GrandFather) :-parent(Persoicates)文件尾:reconsult : (string FileName).clausesreconsult(FileName) :-retractFactDB(familyDB),file::consult(FileName, familyDB).clausesrun():-console::init(),stdIO::write("Load data\n"),reconsult("..\\fa.txt"),stdIO::write("\nfather test\n"),father(X, Y),stdIO::writef("% is the father of %\n", Y, X),fail.run():-stdIO::write("\ngrandFather test\n"),grandFather(X, Y),stdIO::writef("% is the grandfather of %\n", Y, X),fail.run():-stdIO::write("\nancestor of Pam test\n"),X = "Pam",ancestor(X, Y),stdIO::writef("% is the ancestor of %\n", Y, X),fail.run():-stdIO::write("End of test\n").end implement family1goalmainExe::run(family1::run).(5)family1.pro补充习题:1.编写一Prolog程序使得你能和计算机“交谈”(Conversations with a computer)。
华北电力大学实验报告||实验名称PROLOG语言编程练习及图搜索问题求解课程名称人工智能及应用专业班级:学生姓名:学号:成绩:指导教师:实验日期:2014年5月(实验报告如打印,纸张用A4,左装订;页边距:上下2.5cm,左2.9cm, 右2.1cm;字体:宋体小四号,1.25倍行距。
)验证性、综合性实验报告应含的主要内容:一、实验目的及要求二、所用仪器、设备三、实验原理四、实验方法与步骤五、实验结果与数据处理六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见)七、所附实验输出的结果或数据设计性实验报告应含的主要内容:一、设计要求二、选择的方案三、所用仪器、设备四、实验方法与步骤五、实验结果与数据处理六、结论(依据“设计要求”)七、所附实验输出的结果或数据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, Been_stack),path(Start, Goal, Been_stack).test:-go(state(w,w,w,w), state(e,e,e,e)).六、讨论与结论Prlolg的求解过程就是一个不断通过规则进行匹配,最后匹配到事实后回溯得出解的过程。
图搜索问题求解实验⼆图搜索问题求解⼀、实验⽬的加深学⽣对图搜索技术的理解,使学⽣掌握图搜索基本编程⽅法,并能利⽤图搜索技术解决⼀些应⽤问题。
1. 掌握Turbo prolog软件编程⽅法;2. 熟悉状态图搜索的基本算法;3.掌握图搜索问题求解中的问题表⽰、节点表⽰、close表和open表的构造。
⼆、实验环境计算机,Turbo PROLOG教学软件三、预习要求1.预习教材第四章有关状态图问题求解的内容,熟悉状态图求解的过程和⽅法;2.了解Turbo PROLOG程序设计的基本知识。
四、实验内容以求交通图中两地之间的路径和最短路径问题为例,分别⽤状态图搜索和代价树搜索,进⾏问题求解。
问题描述如下:G 为⼀有向图, 其每条边都有⼀个⾮负的权数。
对于图中任意两点间的路径, 定义⼀个路径长度, 其值为该路径所包含的各条边的权数之和。
两点间的路径⼀般不⽌⼀条。
对于给定的任意出发点s和到达点t,⾸先找到所有的从s⾄t的路径,然后从中找出长度最短的路径。
左图是某⼀城市的交通⽹络。
边的⽅向表⽰允许的通⾏⽅向。
边旁的权数表⽰该边的长度。
要求找出点 v1 ⾄ v5 的所有路径,并找出最短路径。
五、实验⽅法和步骤1. 启动prolog编辑环境;2. ⽤图搜索搜索思想编辑路径求解问题的源程序;2. 运⾏程序,分析结果;3. ⽤代价树搜索思想编辑最短路径求解问题的源程序;4.运⾏程序,分析结果。
六、⽰例程序以教材例4.1迷宫图的路径搜索为例,给出迷宫问题的求解程序。
DOMAINSstate=symbolDATABASE-mydatabaseopen(state,integer)closed(integer,state,integer)res(state)open1(state,integer)min(state,integer)mark(state)fail_PREDICATESsolveroad(state,state)search(state,state)resultsearchingstep4(integer,state)step56(integer,state)equal(state,state)repeatresulting(integer)rule(state,state)GOALsolve.CLAUSESsolve:-search(s0,sg),result.search(Begin,End):-retractall(_,mydatabase),assert(closed(0,Begin,0)),assert(open(Begin,0)),assert(mark(End)),repeat,searching,!.result:-not(fail_),retract(closed(0,_,0)),closed(M,_,_),resulting(M),!.result:-beep,write("sorry don't find aroad!"). searching:-open(State,Pointer),retract(open(State,Pointer)),closed(No,_,_),No2=No+1,asserta(closed(No2,State,Pointer)),!,step4(No2,State).searching:-assert(fail_).step4(_,State):-mark(End),equal(State,End).step4(No,State):-step56(No,State),!,fail.step56(No,StateX):-rule(StateX,StateY),not(open(StateY,_)),not(closed(_,StateY,_)),assertz(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):-road(X,Y).road(s0,s4).road(s4,s1).road(s1,s4).road(s1,s2).road(s2,s1).road(s2,s3).road(s3,s2).road(s4,s7).road(s7,s4).road(s4,s5).road(s5,s4).road(s5,s6).road(s6,s5).road(s5,s8).road(s8,s5).road(s8,s9).road(s9,s8).road(s2,s5).road(s5,s2).road(s9,sg).七、实验报告要求1. 实验报告应简单明了,语⾔通顺,结果正确,程序规范。
逻辑型程序设计语言PROLOG教程2.3. 1逻辑型程序设计语言PROLOGPROLOG的语句PROLOG语言只有三种语句,分别称为事实、规则和问题。
1.事实(fact)格式: <谓词名>(<项表>).功能一般表示对象的性质或关系。
其中谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串,项表是以逗号隔开的项序列。
例如:student(john).like( mary ,music).表示“约翰是学生”和“玛丽喜欢音乐”。
2. 规则(rule)格式:<谓词名>(<项表>):-<谓词名>(<项表>){,<谓词名>(<项表>)}.功能: 一般表示对象间的因果关系、蕴含关系或对应关系。
其中“:-”号表示“if”(也可以直接写为if),其左部的谓词是规则的结论(亦称为头),右部的谓词是规则的前提(亦称为体),{}表示零次或多次重复,逗号表示and(逻辑与),即规则的形式是一个逻辑蕴含式。
例如:bird(X):-animal(X),has(X,feather).grandfather(X,Y):-father(X,Z),father(Z,Y).第一条规则表示“如果X是动物,并且X有羽毛,则X是鸟”;第二条规则就表示“X是Y的祖父,如果存在Z,X是Z的父亲并且Z又是Y的父亲”。
3.问题(question)格式: -<谓词名>(<项表>){,<谓词名>(<项表>)}.功能表示用户的询问,它就是程序运行的目标。
例如:-student(john).-like(mary,X).2.3. 2 PROLOG程序PROLOG程序一般由一组事实、规则和问题组成。
问题是程序执行的起点,称为程序的目标。
例如下面就是一个PROLOG程序。
likes(bell,sports).likes(mary,music).likes(mary,sports).likes(jane ,smith).friend(john,X):-likes(X,reading),likes(X,music).friend(john,X):-likes(X,sports),likes(X,music).-friend(john,Y).可以看出,这个程序中有四条事实、两条规则和一个问题。
实验一Visual Prolog运行环境实验(1学时)一、实验目的1、了解PROLOG解释器;2、掌握PROLOG语言中常量、变量的表示方法;3、掌握利用PROLOG进行事实库、规则库的编写方法。
二、实验要求1、熟悉Visual Prolog运行环境,包括硬件与软件环境;2、学习示例程序,分析其功能;3、写出Example 1、Example 2、Example 3示例程序的功能;4、利用PROLOG进行事实库、规则库的编写,并在此基础上进行简单的询问。
三、实验设备计算机,Visual prolog教学软件。
四、实验内容及步骤(一)实验内容:1、熟悉Visual prolog的运行环境,包括所用的机器的硬件与软件环境;2、学习使用Visual prolog,包括进入Prolog主程序、编辑源程序、修改环境目录、退出等基本操作;3、学习Visual prolog的简单程序结构,掌握分析问题、询问解释技巧;4、了解PROLOG语言中常量、变量的表示方法;5、利用PROLOG进行事实库、规则库的编写,并在此基础上进行简单的询问。
(二)实验步骤:1、启动Windows 2000操作环境;2、安装Visual Prolog集成开发环境;3、双击桌面图标或者找到Visual Prolog可执行文件所在目录双击图标,启动Visual prolog集成开发环境;4、打开Project菜单,选择New Project菜单项,将工作目录修改为你要保存到的文件夹,例如,c:\11,给出工程文件名;5、打开Option菜单,选择Project菜单项打开下拉菜单,选择Compiler Options项,按下图中显示进行设置;6、从工程界面中选择“new”按钮或者从file菜单中选择“new”菜单项,弹出一个界面,将所有的复选框都去掉,进入Visual Prolog的程序编辑界面;7、将下面的Example 1编辑到编辑界面里面,Project菜单里面的Test goal菜单项或者直接点击菜单栏中的Test Goal按钮执行程序。
图搜索与问题求解实验报告一实验题目图搜索与问题求解二实验目的1熟悉和掌握启发式搜索/A*搜索的定义、估价函数和算法过程;2 理解和掌握搜索过程,能够用选定的编程语言求解八数码问题,理解求解流程和搜索顺序;3 比较并分析图搜索策略的实质,通过实验理解启发式搜索/A*搜索的意义。
三实验要求1以九宫问题/八数码问题为例,以某种启发式搜索/A*搜索策略编程演示其搜索过程;2 定义启发式函数,能正确求解出从初始状态到目标状态的移动路线;3 对不可达状态能进行正确识别;4对所采用的启发式函数做出性能分析。
四数据结构typedef struct Qnode{ //队列的节点类型定义long a; //将8数码转化为长整型后入队列int dnum; //与目标状态数码不同的位置的个数Qnode *next;}*QueuePtr;typedef struct{QueuePtr front; //队头指针QueuePtr rear; //队尾指针}LinkQueue; //链式队列五实验算法1 说明有解和无解如何判定;int NiXu(int a[][3]) //求出所给状态的逆序数{i nt i,j,k=0,sum=0;i nt b[8];f or(i=0;i<3;i++)for(j=0;j<3;j++)if(a[i][j]) //空格用0代替,逆序不计空格b[k++]=a[i][j];for(i=1;i<8;i++)for(j=0;j<i;j++)if(b[i]<b[j])sum++;return sum;}if(NiXu(start)%2 != NiXu(end)%2)printf("无法到达!\n");e lse{printf("广度优先搜索如下:\n\n");search();}2 说明启发式函数如何设定;int h(long x){i nt sum=0;i nt b[3][3];u_trans(x,b);f or (int i=0;i<3;i++)for (int j=0;j<3;j++)if (end[i][j]!=b[i][j])sum++;r eturn sum;}3说明实验中采用的搜索算法。
人工智能作业题解答第三章图搜索与问题求解1、何为状态图和与或图?图搜索与问题求解有什么关系?解:按连接同一节点的各边间的逻辑关系划分,图可以分为状态图和与或图两大类。
其中状态图是描述问题的有向图。
在状态图中寻找目标或路径的基本方法就是搜索。
2、综述图搜索的方式和策略。
解:图搜索的方式有:树式搜索,线式搜索。
其策略是:盲目搜索,对树式和不回溯的线式是穷举方式,对回溯的线式是随机碰撞式。
启发式搜索,利用“启发性信息”引导的搜索。
3、什么是问题的解?什么是最优解?解:能够解决问题的方法或具体做法成为这个问题的解。
其中最好的解决方法成为最优解。
4、什么是与或树?什么是可解节点?什么是解树?解:与或树:一棵树中的弧线表示所连树枝为“与”关系,不带弧线的树枝为或关系。
这棵树中既有与关系又有或关系,因此被称为与或树。
可解节点:解树实际上是由可解节点形成的一棵子树,这棵子树的根为初始节点,叶为终止节点,且这棵子树一定是与树。
解树:满足下列条件的节点为可解节点。
①终止节点是可解节点;②一个与节点可解,当且仅当其子节点全都可解;③一个或节点可解,只要其子节点至少有一个可解。
5、设有三只琴键开关一字排开,初始状态为“关、开、关”,问连接三次后是否会出现“开、开、开”或“关、关、关”的状态?要求每次必须按下一个开关,而且只能按一个开关。
请画出状态空间图。
注:琴键开关有这样的特点,若第一次按下时它为“开”,则第二次按下时它就变成了“关”。
解:设0为关,1为开6、有一农夫带一只狼、一只羊和一筐菜欲从河的左岸乘船到右岸,但受下列条件限制:1)船太小,农夫每次只能带一样东西过河。
2)如果没农夫看管,则狼要吃羊,羊要吃菜。
请设计一个过桥方案,使得农夫、狼、羊、菜都不受损失地过河。
画出相应状态空间图。
提示:(1)用四元组(农夫、狼、羊、菜)表示状态,其中每个元素都可为0或1,用0表示在左岸,用1表示在右岸。
(2)把每次过河的一次安排作为一个算符,每次过河都必须有农夫,因为只有他可以划船。
用Prolog求解传教士和野人问题实验七用Prolog求解传教士和野人问题 1、实验目的复习经典谓词演算中的归结原理,掌握人工智能程序设计语言Prolog,理解通过搜索求解问题实现人工智能的思想。
2、实验原理谓词演算中的消解法,3、实验内容设有3个传教士和3个野人同在河的左岸,他们都要到对岸去;河里只有一条船,他们都会划船,但每次渡船至多只能乘两人;如果在任何一边河岸上,野人的数量超过传教士,野人就要吃掉传教士,问怎样才能用船将3个传教士和3个野人从左岸都渡到右岸,又不会发生传教士被吃的事件呢,通过Prolog程序,给出乘船过河的动作序列。
4、实验步骤(1) 设计该问题的状态。
例如:((左岸牧师数,左岸野人数),(右岸牧师数,右岸野人数),船的位置)。
(2) 定义目标状态。
这里是:((0,0),(3,3),1)3) 描述可能的动作。
船上所能够载人的状态就是可能的操作。
用谓词(move表示。
(4) 判断合法状态(5) 深度优先搜索三个传教士和三个野人的示例程序如下:move(1,0).move(0,1).move(0,2).move(2,0).move(1,1).legal((X,Y,_)):-legal1(X),legal1(Y). legal1((X,Y)):-X=:=0,Y>=0,!. legal1((X,Y)):-Y=:=0,X>=0,!. legal1((X,Y)):-X>=Y,X>=0,Y>=0.update((X,Y,0),Move,Statu1):-(A,B)=X,(C,D)=Y,(E,F)=Move,C1 is C+E,D1 is D+F,A1 is A-E,B1 is B-F,Statu1=((A1,B1),(C1,D1),1). update((X,Y,1),Move,Statu1):- (A,B)=X, (C,D)=Y,(E,F)=Move,C1 is C-E,D1 is D-F,A1 is A+E,B1 is B+F,Statu1=((A1,B1),(C1,D1),0). connect(Statu,Statu1):- move(X,Y),update(Statu,(X,Y),Statu1), legal(Statu1).findroad(X,X,L,L):-write(L). findroad(X,Y,L,L1):-connect(X,Z),not(member(Z,L)),findroad(Z,Y,[Z|L],L1).传教士和野人问题有三个牧师和三个野人过河,只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于牧师的人数,那么牧师就会有危险。
实验一 PROLOG语言编程练习一.实验目的1、熟悉PROLOG语言编程环境的使用;2、了解PROLOG语言中常量、变量的表示方法;3、了解利用PROLOG进行事实库、规则库的编写方法;二.实验环境计算机,Turbo PROLOG教学软件。
三.实验内容及结果1、启动Windows XP操作环境。
2、打开文件目录,执行prolog应用程序,启动Turbo prolog,并按空格键(SPACE)进入集成开发环境。
3、选择Setup项,打开下拉菜单,选择Directories项,进行工作目录修改,按Esc键退出,选择Save Configuration项,保存修改。
4、选择Files项,打开下拉菜单,选择New file项,进入源程序输入和编辑,或选择Load项,选择要打开的示例程序,再选择Edit项,可以进行编辑源程序。
5、编辑之后,可以选择Run项,执行程序,可以在Dialog窗口进行询问,即外部目标的执行,查看程序运行结果,分析程序之功能。
6、仿前例,可以选择其他程序并运行,分析程序功能。
7、退出,选择Quit项,可以退出Turbo Prolog程序,返回到Windows XP环境。
A一个描述亲属关系的PROLOG程序源代码:domainsname=symbolsex=stringage=integerpredicatesperson(name,sex,age)father(name,name)mother(name,name)elder_brother(name,name)elder_sister(name,name)grandmother(name,name)grandfather(name,name)goalelder_brother(X1,son1),write("son1's elder_brother is ",X1,"\n"),elder_sister(X2,son1),write("son1's elder_sister is ",X2,"\n"),grandmother(Y,son1),write("son1's grandmother is ",Y,"\n"),grandfather(Z,son1),write("son1's grandfather is ",Z,"\n").clausesperson(son1,"male",11).person(son2,"male",14).person(daughter,"female",13).person(f,"male",40).person(m,"female",38).person(gm,"female",65).person(gf,"male",70).father(f,son1).father(f,son2).father(f,daughter).father(gf,f).mother(m,son1).mother(m,son2).mother(m,daughter).mother(gm,f).elder_brother(X1,son1):-father(f,X1),mother(m,X1),person(son1,"male",A0), person(X1,"male",A1),A1>A0.elder_sister(X2,son1):-father(f,X2),mother(m,X2),person(son1,"male",A0), person(X2,"female",A2),A2>A0.grandmother(Y1,Y2):-father(Y3,Y2),mother(Y1,Y3).grandfather(Z1,Z2):-father(Z3,Z2),father(Z1,Z3)描述亲属关系的PROLOG程序实验结果截图B修改教材2.2节例2.9的程序,使其能输出图中所有路径(path)domainsname=symbolsex=stringage=integerpredicatesclausesroad(a,b).road(a,c).road(b,d).road(c,d).road(d,e).road(b,e).path(X,Y):-road(X,Y).path(X,Y):-road(X,Z),path(Z,Y).四.实验中出现问题及解决方法实验中虽然出现点儿问题,但是在老师和同学的帮助下还是搞定了五.实验总结。
Visual Prolog语言简介Prolog语言是人工智能与专家系统领域最著名的逻辑程序设计语言。
Visual Prolog 意指可视化逻辑程序设计语言,是基于Prolog语言的可视化集成开发环境,是Prolog开发中心(PDC)最新推出的基于Windows环境的智能化编程工具,其语言特性符合相应的国际标准ISO/IEC 13211-1:1995。
目前,Visual Prolog在美国、西欧、日本、加拿大、澳大利亚等发达国家和地区十分流行,是国际上研究和开发智能化应用的主流工具之一。
预计短时期内,在国际上已经十分流行的最新版本的可视化逻辑程序设计语言Visual Prolog将会在我国广泛流行开来,并将迅速成为我国研究和开发智能化应用的最重要的工具。
Visual Prolog具有模式匹配、递归、回溯、对象机制、事实数据库和谓词库等强大功能。
它包含构建大型应用程序所需要的一切特性:图形开发环境、编译器、连接器和调试器,支持模块化和面向对象程序设计,支持系统级编程、文件操作、字符串处理、位级运算、算术与逻辑运算,以及与其它编程语言的接口。
Visual Prolog包含一个大型库,捆绑了范围广阔的API函数:包括Windows GUI函数族、ODBC/OCI数据库函数族和Internet函数族(socket、ftp、http、cgi等)。
这个开发环境全部使用Visual Prolog语言写成,而且包含对话框、菜单、工具栏等若干编码专家和图形编辑器。
Visual Prolog支持Windows 3.x/95/98/Me/NT/2000/XP、OS/2和文本方式下的DOS、Linux和SCO UNIX。
Visual Prolog非常适合于专家系统、规划和其它AI相关问题的求解,是智能程序设计语言中具有代表性且应用较多的一种语言。
由于这种语言很适合表达人的思维和推理规则,在自然语言理解、机器定理证明、专家系统等方面得到了广泛的应用。