
逻辑程序设计语言PROLOG.ppt
42页第2章 逻辑程序设计语言PROLOG2.1 基本PROLOG2.2 Turbo PROLOG程序设计 2.1 基本PROLOG 2.1.1 PROLOG的语句 1. 事实(fact) 格式 〈谓词名〉(〈项表〉).student(john). like(mary,music).abc. repeat.功能 一般表示对象的性质或关系 2. 规则(rule)格式 〈谓词名〉(〈项表〉):-〈谓词名〉(〈项表〉){,〈 谓词名〉(〈项表〉)}. bird(X):-animal(X),has(X,feather). grandfather(X,Y):- father(X,Z),father(Z,Y).run:-start,step1(X),step2(X),end. 功能 一般表示对象间的因果关系、蕴含关系或对应 关系 3. 问题(question)格式 ?-〈谓词名〉(〈项表〉){,〈谓词名〉(〈 项表〉)}. ? -student(john). ? -like(mary,X). 功能 问题表示用户的询问, 它就是程序运行的 目标。
2.1.2 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). ?-likes(mary,X). 或 ?-likes(mary,music). 或 ?-friend(X,Y). 或 ?-likes(bell,sports), likes(mary,music), friend(john,X).2.1.3 PROLOG程序的运行机理1. 自由变量与约束变量2. 匹配合一两个谓词可匹配合一, 是指两个谓词的名相同 , 参量项的个数相同, 参量类型对应相同, 并且对 应参量项还满足下列条件之一: (1) 如果两个都是常量, 则必须完全相同。
(2) 如果两个都是约束变量, 则两个约束值必 须相同 (3) 如果其中一个是常量, 一个是约束变量, 则约束值与常量必须相同 (4) 至少有一个是自由变量考虑下面的各组谓词是否可匹配合一? pre1(″ob1″,″ob2″,Z) pre1(″ob1″, ″ob3″,Y)pre1(″ob1″,″ob2″,Z) pre1(″ob1″,X, ″ob3″)pre1(″ob1″,″ob2″,Z) pre1(″ob1″,X,Y)3. 回溯所谓回溯, 就是在程序运行期间, 当某一个子 目标不能满足(即谓词匹配失败)时,控制就返回到 前一个已经满足的子目标(如果存在的话), 并撤消 其有关变量的约束值, 然后再使其重新满足 成 功后, 再继续满足原子目标如果失败的子目标前 再无子目标, 则控制就返回到该子目标的上一级目 标(即该子目标谓词所在规则的头部)使它重新匹配 回溯也是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).则求解目标为friend(john,Y). 新目标 likes(X,reading),likes(X,music). 2.2 Turbo PROLOG程序设计 2.2.1 程序结构/* 〈 注 释〉 */〈编译指令〉constants〈常量说明〉domains〈域说明〉database〈数据库说明〉predicates〈谓词说明〉goal〈目标语句〉clauses〈子句集〉 例 如果把上节的例子程序作为Turbo PROLOG程序, 则应改 写为: DOMAINSname=symbolPREDICATESlikes(name,name).friend(name,name)GOALfriend(john,Y), write(″Y=″, Y).CLAUSESlikes(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的标准领域包括整数、实数、符号、串和符 号等, 其具体说明如下表所示谓词段 该段说明程序中用到的谓词的名和参量项的名(但 Turbo PROLOG 的内部谓词无须说明)子句段 该段是Turbo PROLOG程序的核心, 程序中的所有事 实和规则就放在这里, 系统在试图满足程序的目标时就 对它们进行操作 目标段 该段是放置程序目标的地方 目标段可以只有一 个目标谓词, 例如上面的例子中就只有一个目标谓词; 也可以含有多个目标谓词, 如 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″)). 复合对象在程序中的说明, 需分层进行。
例如, 对于上面的谓词 likes(″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″), age(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的变量也就有这八种取值 另外, 变量名要求必须是以大写字母或下划线开 头的字母、数字和下划线序列, 或者只有一个下划线 这后一种变量称为无名变量 3. 算术表达式Turbo PROLOG提供了五种最基本的算术运算:加、减、 乘、除和取模, 相应运算符号为+、 -、*、 /、 mod 这五种运算的顺序为: *、/、 mod优先于+、 -数学中的算术表达式 PROLOG中的算术表达式 x+yz X+Y*Zab-c/d A*B-C/Du mod v U mod V Y=X+5 √X=X+1 ×4.关系表达式Turbo PROLOG提供了六种常用的关系运算, 即小于、 小于或等于、等于、大于、大于或等于和不等于, 其运 算符依次为, >=, =YX≠Y XAge2. ◆ “=”的用法 :比较符和约束符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的结果 2.2.3 输入与输出(1) readln (X) (2) readint (X)(3) readreal (X) (4) readchar (X)(5) write (X1, X2, …,Xn) (6) nl 例 用输入输出谓词编写一个简单的成绩 数据库查询程序 PREDICATESstudent(integer, string, real)gradeGOALgrade.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(″对不起, 找不到这个学生!″).2.2.4 分支与循环1. 分支将 IF x>0 THEN x:=1 ELSE x:=0 用PROLOG实现则可以是 br:-x>0, 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, ″李四″, 95.5).student(3, ″王五″, 96.4).print:-student(Number, Name, Score), write(Num。
