逻辑程序设计语言PROLOG课件.ppt

上传人:牧羊曲112 文档编号:3761013 上传时间:2023-03-20 格式:PPT 页数:43 大小:716.50KB
返回 下载 相关 举报
逻辑程序设计语言PROLOG课件.ppt_第1页
第1页 / 共43页
逻辑程序设计语言PROLOG课件.ppt_第2页
第2页 / 共43页
逻辑程序设计语言PROLOG课件.ppt_第3页
第3页 / 共43页
逻辑程序设计语言PROLOG课件.ppt_第4页
第4页 / 共43页
逻辑程序设计语言PROLOG课件.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《逻辑程序设计语言PROLOG课件.ppt》由会员分享,可在线阅读,更多相关《逻辑程序设计语言PROLOG课件.ppt(43页珍藏版)》请在三一办公上搜索。

1、,逻辑程序设计语言PROLOG,2.1 基本PROLOG 2.1.1 PROLOG的语句 1.事实(fact)格式 谓词名(项表).student(john).like(mary,music).abc.repeat.功能 一般表示对象的性质或关系。,3.回溯 所谓回溯,就是在程序运行期间,当某一个子目标不能满足(即谓词匹配失败)时,控制就返回到前一个已经满足的子目标(如果存在的话),并撤消其有关变量的约束值,然后再使其重新满足。成功后,再继续满足原子目标。如果失败的子目标前再无子目标,则控制就返回到该子目标的上一级目标(即该子目标谓词所在规则的头部)使它重新匹配。回溯也是PROLOG的一个重要

2、机制。,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).则求解目标为 friend(john,Y).新目标 likes(X,reading),likes(X,music).,2.2 Turbo PROLOG程序设计2.2.1 程序结构/*注 释*/编译指令 constants

3、 常量说明 domains 域说明 database 数据库说明 predicates 谓词说明 goal 目标语句 clauses 子句集,例 如果把上节的例子程序作为Turbo PROLOG程序,则应改写为:DOMAINS name=symbol PREDICATES likes(name,name).friend(name,name)GOAL friend(john,Y),write(Y=,Y).CLAUSES likes(bell,sports).likes(mary,music).likes(mary,sports).likes(jane,smith).friend(john,X):

4、-likes(X,sports),likes(X,music).friend(john,X):-likes(X,reading),likes(X,music).,领域段该段说明程序谓词中所有参量项所属的领域。Turbo PROLOG的标准领域包括整数、实数、符号、串和符号等,其具体说明如下表所示。,谓词段 该段说明程序中用到的谓词的名和参量项的名(但Turbo PROLOG 的内部谓词无须说明)子句段 该段是Turbo PROLOG程序的核心,程序中的所有事实和规则就放在这里,系统在试图满足程序的目标时就对它们进行操作。目标段 该段是放置程序目标的地方。目标段可以只有一个目标谓词,例如上面的例

5、子中就只有一个目标谓词;也可以含有多个目标谓词,如 goal readint(X),Y=X+3,write(Y=,Y).就有三个目标谓词。这种目标称为复合目标。,2.2.2 数据与表达式1.领域 1)标准领域 整数、实数、字符、串和符号 2)结构 结构也称复合对象,一般形式为 函子(参量表)likes(Tom,sports(football,basketball,table_tennis).reading(王宏,book(人工智能技术导论,西安电子科技大学出版社).friend(father(Li),father(Zhao).,复合对象在程序中的说明,需分层进行。例如,对于上面的谓词 like

6、s(Tom,sports(football,basketball,table_tennis).在程序中可说明如下:domains name=symbol sy=symbol sp=sports(sy,sy,sy)predicates likes(name,sp),3)表 表的一般形式 x1,x2,xn 其中xi(i=1,2,n)为PROLOG的项,一般要求同一个表的元素必须属于同一领域。不含任何元素的表称为空表,记为。1,2,3 apple,orange,banana,grape,cane PROLOG,PROGRAMMING,in logic a,b,c,d,e name(LiMing),a

7、ge(20),sex(male),addr(xian),表的说明方法是在其组成元素的说明符后加一个星号*。如:domains lists=string*predicates pl(lists)例如,谓词 p(name(Liming),age(20)则需这样说明:domains rec=seg*seg=name(string);age(integer)predicates p(rec),2.常量与变量 Turbo PROLOG的常量有整数、实数、字符、串、符号、结构、表和文件这八种数据类型。同理,Turbo PROLOG的变量也就有这八种取值。另外,变量名要求必须是以大写字母或下划线开头的字母、

8、数字和下划线序列,或者只有一个下划线。这后一种变量称为无名变量。,3.算术表达式 Turbo PROLOG提供了五种最基本的算术运算:加、减、乘、除和取模,相应运算符号为+、-、*、/、mod。这五种运算的顺序为:*、/、mod优先于+、-。数学中的算术表达式 PROLOG中的算术表达式 x+yz X+Y*Z ab-c/d A*B-C/D u mod v U mod V Y=X+5 X=X+1,4.关系表达式 Turbo PROLOG提供了六种常用的关系运算,即小于、小于或等于、等于、大于、大于或等于和不等于,其运算符依次为,=,数学中的关系式 Turbo PROLOG中的关系式 X+1Y X

9、+1=Y XY XY,brother(Name1,Name2):-person(Name1,man,Age1),person(Name2,man,Age2),mother(Z,Name1),mother(Z,Name2),Age1Age2.,“=”的用法:比较符和约束符 p(X,Y,Z):-Z=X+Y.当变量X、Y、Z全部被实例化时,“=”就是比较符。如:对于问题 Goal:p(3,5,8).机器回答:yes。而对于 Goal:p(3,5,7).机器回答:no。但当X,Y被实例化,而Z未被实例化时,“=”号就是约束符。如:Goal:p(3,5,Z).机器回答:Z=8这时,机器使Z实例化为X+Y

10、的结果。,2.2.3 输入与输出(1)readln(X)(2)readint(X)(3)readreal(X)(4)readchar(X)(5)write(X1,X2,Xn)(6)nl,例 用输入输出谓词编写一个简单的成绩 数据库查询程序。PREDICATES student(integer,string,real)grade GOAL grade.CLAUSES student(1,张三,90.2).student(2,李四,95.5).student(3,王五,96.4).grade:-write(请输入姓名:),readln(Name),student(_,Name,Score),nl,

11、write(Name,的成绩是,Score).grade:-write(对不起,找不到这个学生!).,2.2.4 分支与循环1.分支 将 IF x0 THEN x:=1 ELSE x:=0用PROLOG实现则可以是 br:-x0,x=1.br:-x=0.,2.循环 程序1:student(1,张三,90.2).student(2,李四,95.5).student(3,王五,96.4).print:-student(Number,Name,Score),write(Number,Name,Score),nl,Number=3.,程序2:student(1,张三,90.2).student(2,李

12、四,95.5).student(3,王五,96.4).print:-student(Number,Name,Score),write(Number,Name,Score),nl,fail.print:-.,2.2.5 动态数据库 动态数据库操作谓词:asserta(fact).assertz(fact).retract(fact).例 asserta(student(20,李明,90.5).retract(student(20,_,_).,2.2.6 表处理与递归 1.表头与表尾 表头是表中的第一个元素;表尾是表中除第一个元素外的其余元素按原来顺序组成的表。表头与表尾示例,表 表头 表尾1,2

13、,3,4,5 1 2,3,4,5 apple,orange,banana apple orange,banana a,b,c,d,e a,b c,d,e PROLOG PROLOG 无定义 无定义,2.表的匹配合一 表的匹配合一示例,表1 表2 合一后的变量值 XY a,b,c X=a,Y=b,c XY a X=a,Y=a Y X,b X=a,Y=b X,Y,Z a,b,c X=a,Y=b,Z=c a,Y Z X,b,c X=a,Y=b,Z=c,例 设计一个能判断对象X是表L的成员的程序。分析:(1)如果X与表L中的第一个元素(即表头)是同一个对象,则X就是L的成员。(2)如果X是L的尾部的成

14、员,则X也就是L的成员。程序:member(X,X|_).member(X,_|Tail):-member(X,Tail).Goal:member(a,a,b,c,d).yes Goal:member(e,a,b,c,d).no Goal:member(X,a,b,c,d).X=a,例 表的拼接程序,即把两个表连接成一个表。append(,L,L).append(H|T,L2,H|Tn):-append(T,L2,Tn).Goal:append(1,2,3,4,5,L).L=1,2,3,4,5 Goal:append(1,2,3,4,5,1,2,3,4,5).yes Goal:append(1

15、,2,3,4,5,1,2,3,4,5,6).no,Goal:append(1,2,3,Y,1,2,3,4,5).Y=4,5 Goal:append(X,4,5,1,2,3,4,5).X=1,2,3 Goal:append(X,Y,1,2,3,4,5).X=,Y=1,2,3,4,5 X=1,Y=2,3,4,5 X=1,2,Y=3,4,5 X=1,2,3,Y=4,5,例 表的输出。print().print(H|T):-write(H),print(T).例 表的倒置,即求一个表的逆序表。reverse(,).reverse(H|T,L):-reverse(T,L1),append(L1,H,L)

16、.,2.2.7 回溯控制 截断谓词“!”的语义:(1)若将“!”插在子句体内作为一个子目标,它总是立即成功。(2)若“!”位于子句体的最后,则它就阻止对它所在子句的头谓词的所有子句的回溯访问,而让回溯跳过该头谓词(子目标),去访问前一个子目标(如果有的话)。(3)若“!”位于其他位置,则当其后发生回溯且回溯到“!”处时,就在此处失败,并且“!”还使它所在子句的头谓词(子目标)整个失败(即阻止再去访问头谓词的其余子句(如果有的话),即迫使系统直接回溯到该头谓词(子目标)的前一个子目标(如果有的话)。,例 考虑下面的程序:p(a).(2-1)p(b).(2-2)q(b).(2-3)r(X):-p(

17、X),q(X).(2-4)r(c).对于目标:r(Y).可有一个解 Y=b 但当把式(2-4)改为 r(X):-p(X),!,q(X).(2-4)时,却无解。为什么呢?,例 设有程序:g0:-g11,g12,g13.(2-5)g0:-g14.(2-6)g12:-g21,!,g23.(2-7)g12:-g24,g25.(2-8)给出目标:g0.把子句(2-7)改为 g12:-g21,g23,!.(2-9),2.2.8 程序举例例 一个简单的路径查询程序。predicates road(symbol,symbol)path(symbol,symbol)clauses road(a,b).road(

18、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).,Goal:path(a,e).yesGoal:path(e,a).noGoal:run.run:-path(a,X),write(X=,X),nl,fail.run.X=b X=c X=d X=e X=d X=e X=e,例 下面是一个求阶乘程序,程序中使用了递归。domains n,f=integer predicates factorial(n,f)goal readint(I),factorial(I,F),write(I,!=,F).clauses factorial(1,1).factorial(N,Res):-N0,N1=N-1,factorial(N1,FacN1),Res=N*FacN1.,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号