单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,逻辑程序设计语言PROLOG,逻辑程序设计语言PROLOG,2.1,基本,PROLOG,2.1.1 PROLOG,的语句,1.,事实,(fact),格式,谓词名,(,项表,).,student(john).,like(mary,music).,abc.,repeat.,功能,一般表示对象的性质或关系。,2.1 基本PROLOG,2,最新逻辑程序设计语言PROLOG课件,3,最新逻辑程序设计语言PROLOG课件,4,最新逻辑程序设计语言PROLOG课件,5,最新逻辑程序设计语言PROLOG课件,6,最新逻辑程序设计语言PROLOG课件,7,最新逻辑程序设计语言PROLOG课件,8,3.,回溯,所谓回溯,就是在程序运行期间,当某一个子目标不能满足,(,即谓词匹配失败,),时,控制就返回到前一个已经满足的子目标,(,如果存在的话,),并撤消其有关变量的约束值,然后再使其重新满足。成功后,再继续满足原子目标。如果失败的子目标前再无子目标,则控制就返回到该子目标的上一级目标,(,即该子目标谓词所在规则的头部,),使它重新匹配。回溯也是,PROLOG,的一个重要机制。,3.回溯,9,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).,likes(bell,sports).,10,最新逻辑程序设计语言PROLOG课件,11,2.2 Turbo PROLOG,程序设计,2.2.1,程序结构,/*,注 释,*/,编译指令,constants,常量说明,domains,域说明,database,数据库说明,predicates,谓词说明,goal,目标语句,clauses,子句集,2.2 Turbo PROLOG程序设计,12,例,如果把上节的例子程序作为,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):-likes(X,sports),likes(X,music).,friend(john,X):-likes(X,reading),likes(X,music).,例 如果把上节的例子程序作为Turbo PROLOG程序,13,领域段,该段说明程序谓词中所有参量项所属的领域。,Turbo PROLOG,的标准领域包括整数、实数、符号、串和符号等,其具体说明如下表所示。,领域段该段说明程序谓词中所有参量项所属的领域。Tu,14,谓词段,该段说明程序中用到的谓词的名和参量项的名,(,但,Turbo PROLOG,的内部谓词无须说明,),子句段,该段是,Turbo PROLOG,程序的核心,程序中的所有事实和规则就放在这里,系统在试图满足程序的目标时就对它们进行操作。,目标段,该段是放置程序目标的地方。目标段可以只有一个目标谓词,例如上面的例子中就只有一个目标谓词;也可以含有多个目标谓词,如,goal,readint(X),Y=X+3,write(Y=,Y).,就有三个目标谓词。这种目标称为复合目标。,谓词段 该段说明程序中用到的谓词的名和参量项的名(但Turb,15,2.2.2,数据与表达式,1.,领域,1),标准领域,整数、实数、字符、串和符号,2),结构,结构也称复合对象,一般形式为,函子,(,参量表,),likes(Tom,sports(football,basketball,table_tennis),).,reading(,王宏,book(,人工智能技术导论,西安电子科技大学出版社,),).,friend(,father(Li),father(Zhao),).,2.2.2 数据与表达式,16,复合对象在程序中的说明,需分层进行。例如,对于上面的谓词,likes(Tom,sports(football,basketball,table_tennis).,在程序中可说明如下:,domains,name=symbol,sy=symbol,sp=sports(sy,sy,sy),predicates,likes(name,sp),复合对象在程序中的说明,需分层进行。例如,对于上面的谓,17,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),age(20),sex(male),addr(xian),3)表,18,表的说明方法是在其组成元素的说明符后加一个星号*。如:,domains,lists=string*,predicates,pl(lists),例如,谓词,p(,name(Liming),age(20),),则需这样说明,:,domains,rec=seg*,seg=name(string);age(integer),predicates,p(rec),表的说明方法是在其组成元素的说明符后加一个星号*。如:,19,2.,常量与变量,Turbo PROLOG,的常量有整数、实数、字符、串、符号、结构、表和文件这八种数据类型。同理,Turbo PROLOG,的变量也就有这八种取值。另外,变量名要求必须是以大写字母或下划线开头的字母、数字和下划线序列,或者只有一个下划线。这后一种变量称为无名变量。,2.常量与变量,20,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,3.算术表达式,21,4.,关系表达式,Turbo PROLOG,提供了六种常用的关系运算,即小于、小于或等于、等于、大于、大于或等于和不等于,其运算符依次为,=,数学中的关系式,Turbo PROLOG,中的关系式,X+1Y,X+1=Y,XY,XY,4.关系表达式,22,brother(Name1,Name2):-,person(Name1,man,Age1),person(Name2,man,Age2),mother(Z,Name1),mother(Z,Name2),Age1Age2.,brother(Name1,Name2):-,23,“,=,”,的用法,:,比较符,和,约束符,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,的结果。,“=”的用法:比较符和约束符,24,2.2.3,输入与输出,(1)readln(X),(2)readint(X),(3)readreal(X),(4)readchar(X),(5)write(X1,X2,Xn),(6)nl,2.2.3 输入与输出,25,例,用输入输出谓词编写一个简单的成绩 数据库查询程序。,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,write(Name,的成绩是,Score).,grade:-write(,对不起,找不到这个学生,!).,例 用输入输出谓词编写一个简单的成绩 数据库查询程序。,26,2.2.4,分支与循环,1.,分支,将,IF x0 THEN x:=1,ELSE x:=0,用,PROLOG,实现则可以是,br:-x0,x=1.,br:-x=0.,2.2.4 分支与循环,27,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.循环,28,程序,2,:,student(1,张三,90.2).,student(2,李四,95.5).,student(3,王五,96.4).,print:-student(Number,Name,Score),write(Number,Name,Score),nl,fail.,print:-.,程序2:,29,2.2.5,动态数据库,动态数据库操作谓词,:,asserta(fact).,assertz(fact).,retract(fact).,例,asserta(student(20,李明,90.5).,retract(student(20,_,_).,2.2.5 动态数据库,30,2.2.6,表处理与递归,1.,表头与表尾,表头是表中的第一个元素;表尾,是表中除第一个元素外的其余元素按原来顺序组成的表。,表头与表尾示例,表 表头 表尾,1,2,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.2.6 表处理与递归,31,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,2.表的匹配合一,32,例,设计一个能判断对象,X,是表,L,的成员的程序。,分析:,(1),如果,X,与表,L,中的第一个元素,(,即表头,),是同一个对象,则,X,就是,L,的成员。,(2),如果,X,是,L,的尾部的成员,则,X,也就是,L,的成员。,程序:,member(X,X|_,).,member(X,_|Tail,):-member(X,Tail).,Goal:member(a,a,b,c,d,).,yes,Goal:me