在prolog中实现问题求解
prolog实验报告小结

prolog实验报告小结Prolog实验报告小结在本次实验中,我们使用了Prolog编程语言来解决一系列逻辑推理和知识表示的问题。
Prolog是一种基于逻辑的编程语言,它使用逻辑规则和事实来进行推理和查询。
在本次实验中,我们学习了如何使用Prolog来表示知识,并使用它来解决一些经典的逻辑问题。
首先,我们学习了如何使用Prolog来表示事实和规则。
通过使用事实和规则,我们可以建立一个知识库,其中包含了我们关于世界的知识。
然后,我们可以使用这些知识来进行逻辑推理,找出答案或解决问题。
在实验中,我们还学习了如何使用Prolog来进行逻辑查询。
通过编写查询语句,我们可以向Prolog系统询问特定的问题,然后系统会使用已有的知识库来进行推理,并给出答案。
这种方式非常适合于解决逻辑问题,比如逻辑谜题或者逻辑推理问题。
此外,我们还学习了如何使用Prolog来实现递归。
递归是一种非常重要的编程技术,它可以帮助我们处理一些复杂的问题,比如树形结构或者列表操作。
在本次实验中,我们使用Prolog来实现了一些递归算法,比如计算阶乘或者斐波那契数列。
总的来说,本次实验让我们对Prolog编程语言有了更深入的了解。
通过实际操作,我们学会了如何使用Prolog来表示知识、进行逻辑推理和解决问题。
Prolog是一种非常强大的编程语言,它可以帮助我们解决许多复杂的逻辑问题,而且在人工智能领域也有着广泛的应用。
希望通过本次实验,同学们都能对Prolog有更深入的了解,并能够在以后的学习和工作中运用到这种强大的编程语言中。
逻辑型程序设计语言PROLOG详细教程

逻辑型程序设计语⾔PROLOG详细教程逻辑型程序设计语⾔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程序。
4.prolog 与visual prolog

?_parent(tom,X), ?_parent(X,Y).
jim
以上程序说明的几个重要观点: (1)在Prolog中定义一个关系是容易的,可以通过满足关系的n个对象来表达。 (2)对程序中已定义的关系,用户可以轻而易举地询问Prolog 系统。 (3)关系的对象可以是常量 (如:tom,ann) ,也可以是变量(如:X,Y)。 (4)向系统提出问题,可由一个或多个目标组成。 (5)一个Prolog 程序由一些子句(clauses)组成。每个子句用句号结束。 (6)对一个问题的回答是肯定的或者是否定的,取决于相应的目标是否满足。在肯定 回答的情况下,说相应的目标是可满足的,而且这个目标成功了。否则,说目标不 可满足,目标失败了。
一个Turbo Prolog程序通常包括5个部分。如下:
1.域说明部分,说明谓词对象的数据类型。 /* 注释 */ domains 域说明 database 数据库说明 predicates 谓词说明 goal 目标说明 clauses 子句说明 /* 注释 */ 2.数据库说明部分,包含一些数据库谓词的定义, 是说明用于动态数据库管理的谓词。如果程序不 需要动态数据库,该部分可省略。 3.谓词说明部分,定义程序中除内部谓词以外的 所有谓词。
Prolog 有三种形式的语句: 1. B:- A1,A2,…,An . 含义是 A1 A2... An B ,相当于~A1~A2… ~An B。可视作人工智能 系统中的推理规则。也可将该句看作一个过程,B为过程头,是过程名,而 {A1,A2,…,An }为过程体。 2. A1,A2,…,An . 含义是 A1 A2 ... An F ,相当于~A1~A2… ~An,可视作推理的目 标,或称目标子句。 3. B. 含义是公式B无条件地为真。可视作已知的事实。
prolog语言简介

例:
自动实现的搜索算法之二——回溯 回溯
clauses likes(tom,talk). /*1*/ likes(bill,swim). /*2*/ likes(bill,talk). /*3*/ friend(john,X):-likes(X,talk),likes(X,swim) /*4*/ 设Goal:friend(john,Who)
可以回溯 如果加入 cut p:- q1,q2,!,r1,r2. p:- s1,s2. 逻辑关系变为 P1 if (if q1∧ q2 then r1 ∧r2 else s1 ∧s2 ) then p q1 q2 ! r1 回溯
P P2 P r2 s1 s2
截断 回溯
影响回溯的手段之二——cut 影响回溯的手段之二
影响回溯的手段之二——cut (截 影响回溯的手段之二
断)
cut—无条件成功,并截断回溯
(也可以用! 表示)
影响回溯的手段之二——cut 影响回溯的手段之二
例:p:- q1,q2,r1,r2. p:- s1,s2. 逻辑关系是 if q1∧ q2∧r1 ∧r2 or s1 ∧s2 P P1 then p q1 q2 r1 r2 s1 s2 P2 P
影响回溯的手段之二——cut 影响回溯的手段之二
应改为 legal(X):- super_speed(X),!,fail. legal(X):- drunk_drive(X),!,fail. legal(X).
常识:“外Goal” 和“程序内goal” 有“勤” “懒” 之分
显然,此结果不完备
Press the SPACE bar
影响回溯的手段之一——fail 影响回溯的手段之一
fail—无条件失败,引起回溯
人工智能 用PROLOG语言完成8数码问题的程序

数学与软件科学学院实验报告学期:至第学期年月日课程名称:_人工智能及其应用专业:班级:级班实验编号:实验项目:用Prolog语言完成8数码问题的程序指导教师:姓名:学号:实验成绩:实验四用Prolog语言完成8数码问题的程序实验目的:在实验三的基础上,进一步熟悉运用Prolog语言进行问题描述的编程方法。
实验内容:进一步熟悉Prolog的基本技术;编写并实现8数码问题的程序描述。
实验准备:熟悉已使用过的Prolog技术;编写8数码问题的Prolog程序。
实验步骤:(1)熟悉8数码问题的目标及Prolog中要用到的相关技术;(2)编写完整的Prolog程序代码;程序:DOMAINSlist=integer*number=integerPREDICATESrule(list,list),!,member(number,list).empty_stack(list).stack(number,number,list).member_stack(number,number).reverse_print_stack(number).path(number,number,number).CLAUSESrule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X2,X1,X0,X3,X4,X5,X6,X7,X8]):-X0=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X4,X1,X2,X3,X0,X5,X6,X7,X8]):-X0=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X6,X1,X2,X3,X4,X5,X0,X7,X8]):-X0=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X8,X1,X2,X3,X4,X5,X6,X7,X0]):-X0=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X2,X1,X3,X4,X5,X6,X7,X8]):-X1=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X8,X2,X3,X4,X5,X6,X7,X1]):-X1=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X2,X1,X3,X4,X5,X6,X7,X8]):-X2=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X3,X2,X4,X5,X6,X7,X8]):-X2=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X2,X1,X0,X3,X4,X5,X6,X7,X8]):-X2=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X3,X2,X4,X5,X6,X7,X8]):-X3=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X4,X3,X5,X6,X7,X8]):-X3=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X4,X3,X5,X6,X7,X8]):-X4=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X4,X1,X2,X3,X0,X5,X6,X7,X8]):-X4=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X3,X5,X4,X6,X7,X8]):-X4=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X3,X5,X4,X6,X7,X8]):-X5=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X3,X4,X6,X5,X7,X8]):-X5=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X6,X1,X2,X3,X4,X5,X0,X7,X8]):-X6=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X3,X4,X6,X5,X7,X8]):-X6=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X3,X4,X5,X7,X6,X8]):-X6=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X3,X4,X5,X7,X6,X8]):-X7=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X3,X4,X5,X6,X8,X7]):-X7=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X8,X2,X3,X4,X5,X6,X7,X1]):-X8=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X8,X1,X2,X3,X4,X5,X6,X7,X0]):-X8=0.rule([X0,X1,X2,X3,X4,X5,X6,X7,X8],[X0,X1,X2,X3,X4,X5,X6,X8,X7]):-X8=0.member(X,[X|T]).member(X,[H|T]):-member(X,T).empty_stack([]).stack(Top,Stack,[Top|Stack]).member_stack(Element,Stack):-member(Element,Stack).reverse_print_stack(Stack):-empty_stack(Stack).reverse_print_stack(Stack):-stack(E,Rest,Stack),reverse_print_sta ck(Rest),write(E),nl.path(Goal,Goal,Been_stack):-write('Solutionis'),nl,reverse_print_stack(Been_stack).path(State,Goal,Been_stack):-rule(State,Next_state),not(member_st ack(Next_state,Been_stack)),stack(Next_state,Been_stack,New_been_stac k),path(Next_state,Goal,New_been_stack);GOALgo([0,1,2,3,4,5,6,7,8],[2,0,1,3,4,5,6,7,8]).(3)输入并跟踪调试该程序;(4)书写实验报告(附实验结果及分析)。
第六章 PROLOG语言习题解答

第六章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程序设计

适合的领域 专家系统、规划和其他AI相关问题的求解, AI相关问题的求解 专家系统、规划和其他AI相关问题的求解, 是智能程序设计语言中具有代表性且应用较多 的一种语言。 的一种语言。 自然语言理解、机器定理证明等方面。 自然语言理解、机器定理证明等方面。 和其它语言一样, 和其它语言一样,可以轻松地开发出各种 应用,包括数据库和WEB应用。 应用,包括数据库和WEB应用。 WEB应用
2、规则:从给出的事件推断出的凭据
规则由几个互相有依赖性的简单句(谓词)组成, 规则由几个互相有依赖性的简单句(谓词)组成, 用来描述事实之间的依赖关系。从形式上看, 用来描述事实之间的依赖关系。从形式上看,规则 由左边表示结论的后件谓词和右边表示条件的前提 谓词组成。 谓词组成。 例如,规则 例如, bird(X):bird(X):-animal(X),has(X,feather). 表示凡是动物并且有羽毛,那么它就是鸟。 表示凡是动物并且有羽毛,那么它就是鸟。 travels(liying,X):travels(liying,X):- travels(zhangming,X). 表示张明到哪里旅行,李英就到那里旅行。 表示张明到哪里旅行,李英就到那里旅行。
prolog实验报告

华北电力大学实验报告||实验名称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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在prolog中实现问题求解
prolog是把逻辑思维用文字描述出来的计算机语言
完整的prolog程序是有事实和规则组成的。
事实用来储存一些数据,而规则用来储存某种可以推理出来的关系。
找物品的prolog程序(我自己编写)如下:
Predicates /定义谓词/
in(string,string) /定义事实语句/
ques(string,string) /定义规则语句/
Clauses /prolog专属子句/
in(desk,office). /陈述书桌在办公室里/
in(bag,desk). /陈述书包在书桌里/
in(pencil_box,bag). /陈述文具盒在书包里/
in(pencil, pencil_box). /陈述铅笔在文具盒里/
ques(X,Y):-in(X,Y) /如果X在Y里,那么问题即是真/
ques(X,Y):-in(X,Z),ques(Z,Y) /如果X在Z里,Z在Y里,那么问题即是真/
/一定要注意X、Y、Z是大写,表示是变量/
——因为此问题我足足在电脑前调试程序一小时才运行成功
如果把上面的程序在prolog编译环境中运行,只需要在goal:输入问题即可,
(本想将运行窗口贴在此,但是没找到)
例如
goal:ques(pencil,bag)系统给出答案yes
goal:ques(bag,office)系统给出答案yes
goal:ques(basketball,office)系统给出答案no
运送物资与上述程序段及其类似;
汉诺塔问题(网上搜索得到的程序段)
hanoi(N):-move(N,left,centre,right) move(0,_,_,_,):-! .
move(N,A,B,C):- M is N-1, move(M,A,C,B),inform(A,B),move(M,C,B,A) inform(X,Y):-write([move,a,disc,from,the,X, pole,to,the,Y,pole]),n1.。