prolog 逻辑程序设计语言Prolog教程_第1页
prolog 逻辑程序设计语言Prolog教程_第2页
prolog 逻辑程序设计语言Prolog教程_第3页
prolog 逻辑程序设计语言Prolog教程_第4页
prolog 逻辑程序设计语言Prolog教程_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第5章章 逻辑程序设计语言逻辑程序设计语言Prolog Logical Programming Language Prologn为了缩小人类自然语言与计算机程序设计语言之间为了缩小人类自然语言与计算机程序设计语言之间的差距,人们开发了新型程序设计语言,较典型的的差距,人们开发了新型程序设计语言,较典型的有函数程序设计语言、逻辑程序设计语言以及面向有函数程序设计语言、逻辑程序设计语言以及面向对象的程序设计语言。对象的程序设计语言。nProlog语言是一种典型的逻辑程序设计语言。利语言是一种典型的逻辑程序设计语言。利用用Prolog语言进行程序设计只需要程序员写出与语言进行程序设计只需要程序员写

2、出与问题有关的事实、规则以及要求解的具体问题。问题有关的事实、规则以及要求解的具体问题。 5.1 Prolog语言概述语言概述5.1.1 Prolog语言的发展语言的发展 n PROLOG (Programming in Logic)语言是一种以逻辑推语言是一种以逻辑推理为基础的逻辑型程序设计语言。它是陈述性语言而不是过理为基础的逻辑型程序设计语言。它是陈述性语言而不是过程性语言。程性语言。n它的思想最早它的思想最早(20世纪世纪70年代初年代初)在英国爱丁堡大学由在英国爱丁堡大学由R.Kowalski首先提出,并由首先提出,并由M.Van Emden作了模型示范。作了模型示范。n1972年,

3、年,Alain Colmeraner及其研究小组在法国马塞大学及其研究小组在法国马塞大学研制成功了第一个研制成功了第一个Prolog系统。系统。n1977年,英国爱丁堡大学的年,英国爱丁堡大学的D.Warren开发了开发了DEC-10 Prolog语言,使之进一步完善。语言,使之进一步完善。5.1.1 Prolog语言的发展语言的发展n1986年美国的年美国的Borland International公司向个公司向个人计算机软件市场推出了人计算机软件市场推出了Turbo Prolog 软件。软件。n现在,现在,PROLOG语言已广泛应用于符号计算的许语言已广泛应用于符号计算的许多应用场合,其中

4、包括关系数据库、专家系统、多应用场合,其中包括关系数据库、专家系统、数理逻辑、抽象问题求解、定理证明和语义学、数理逻辑、抽象问题求解、定理证明和语义学、自然语言理解、结构设计、位置规划和逻辑学、自然语言理解、结构设计、位置规划和逻辑学、符号方程解决、编译程序编制、生物化学结构、符号方程解决、编译程序编制、生物化学结构、生理学分析和药物设计,涉及了许多人工智能领生理学分析和药物设计,涉及了许多人工智能领域。域。5.1.2 Prolog语言的特点语言的特点The characteristics of Prolog language (1)PROLOG语言是一种抽述性语言,用语言是一种抽述性语言,用

5、PROLOG语言求解问题时,只须程序员描述待解语言求解问题时,只须程序员描述待解问题中的对象及它们之间关系的一些已知事实和问题中的对象及它们之间关系的一些已知事实和规则。它强调描述对象之间的逻辑关系,而不必规则。它强调描述对象之间的逻辑关系,而不必告诉计算机运算执行的先后次序,即告诉计算机告诉计算机运算执行的先后次序,即告诉计算机“做什么做什么”,而不是像普通程序设计语言那样告,而不是像普通程序设计语言那样告诉计算机诉计算机“如何做如何做”。 (2)Prolog语言的数据和程序结构统一,语言的数据和程序结构统一,Prolog语言提供了一种统一的数据结构称为语言提供了一种统一的数据结构称为“项项

6、”。所有的程序和数据均由项构成,并且都。所有的程序和数据均由项构成,并且都是树型结构。是树型结构。 (3)Prolog语言能够自动实现模式匹配和回溯。语言能够自动实现模式匹配和回溯。这些是人工智能系统中常用的基本操作。用户在这些是人工智能系统中常用的基本操作。用户在Prolog语言这一级上不必考虑这个问题。语言这一级上不必考虑这个问题。5.1.2 Prolog语言的特点语言的特点The characteristics of Prolog language (4)递归是)递归是Prolog语言的重要特点之一。由于这语言的重要特点之一。由于这一特点,一个大的数据结构常常能由小的程序来一特点,一个大

7、的数据结构常常能由小的程序来处理。处理。 (5)语法简明。)语法简明。Prolog语言仅有三种句型,语法语言仅有三种句型,语法规则比较简单。规则比较简单。5.1.2 Prolog语言的特点语言的特点The characteristics of Prolog languagen在定义逻辑程序之前在定义逻辑程序之前,首先定义首先定义Horn子句子句,它是逻辑程序的组成要素。它是逻辑程序的组成要素。n定义定义5.1 子句子句 中如果至多只中如果至多只含有一个正文字,那么该子句称为含有一个正文字,那么该子句称为Horn子句子句。nHorn子句子句 通常表示为通常表示为n相当于一条相当于一条IF-THE

8、N规则规则,由两部分组成由两部分组成:头头部和体。结论部和体。结论部分部分P称为头部称为头部,前提部分称为前提部分称为体。体。5.2 Prolog程序的实现原理程序的实现原理 5.2.0 逻辑程序定义逻辑程序定义 12.nLLL12.mPQQQ12,.,mPQ QQHorn子句在子句在Prolog中有中有3种表示形式。种表示形式。(1) 无条件子句无条件子句(事实事实Fact): A。(2) 条件子句条件子句(规则规则Rule): A:-B1, ,Bn 。(3) 目标子句目标子句(问题问题Problem): ?- B1, ,Bn 。上述上述3种种Horn子句均具有明显的非形式语义。子句均具有明

9、显的非形式语义。 5.2.0 逻辑程序定义逻辑程序定义n(1) 无条件子句无条件子句A: 表示对变量的任何赋值表示对变量的任何赋值,A均为真。均为真。n(2) 条件子句条件子句A:-B1, ,Bn :表示对变量的表示对变量的任何赋值任何赋值,如果如果B1, ,Bn均为真均为真,则则A为真。为真。n(3) 目标子句目标子句?- B1, ,Bn :其逻辑形式为其逻辑形式为:n等价于等价于 它视作推理的目它视作推理的目标。标。5.2.0 逻辑程序定义逻辑程序定义11.(.),nnxxBB11.(.)nnxx BBn例如例如,对于下面两个对于下面两个Horn子句子句: W(X,Y):-P(X), Q(

10、Y). ?-R(X,Y),Q(Y).n在中在中W(X,Y)为头为头,P(X),Q(Y)为体。在为体。在中中R(X,Y),Q(Y)为体为体,头为空子句。事实上头为空子句。事实上,表示一个询问表示一个询问,R(X,Y),Q(Y)是否为真是否为真,或者或者X和和Y取什么值的时候取什么值的时候,R(X,Y),Q(Y)为为真。真。5.2.0 逻辑程序定义逻辑程序定义定义定义5.2 逻辑程序就是由逻辑程序就是由Horn子句构成的程序。在逻辑程序中子句构成的程序。在逻辑程序中,头部具有相同谓词符的那些子句称为该谓词的定义。头部具有相同谓词符的那些子句称为该谓词的定义。n例如例如,下面两个谓词逻辑句子下面两个

11、谓词逻辑句子,每个句子都只有一个头。每个句子都只有一个头。Father(X, Y): -Child (Y, X), Male (X).Son(Y, X): -Child(Y, X), Male(Y).n上述两个子句都是上述两个子句都是Horn子句子句,因此它们构成一个逻辑程序。因此它们构成一个逻辑程序。假设还有下面假设还有下面3个事实子句个事实子句:Child(xiao-li, lao-li).Male(xiao-li).Male(lao-li).5.2.0 逻辑程序定义逻辑程序定义如果把上述规则和事实加入如果把上述规则和事实加入Prolog中中,编译编译执行后执行后,给出下面的查询给出下面的

12、查询,则有则有:(1) 目标目标: ?-Father(X, Y).则会得到则会得到: Father(lao-li, xiao-li).(2) 目标目标:?-Son(Y, X).则会得到则会得到: Son(xiao-li,lao-1i).上面已经完成了对上面已经完成了对Prolog语言简单的描述。语言简单的描述。5.2.1 逻辑程序定义逻辑程序定义u常量常量: 常量是数据结构的基本组成部分,用来对特定对象及关常量是数据结构的基本组成部分,用来对特定对象及关系的命名。系的命名。在在Prolog语言中,合法的常量有:语言中,合法的常量有:(1)整数,一个纯数字串,例整数,一个纯数字串,例182 00

13、0,581 202。(2)原子,分为两种:原子,分为两种:1)标识符标识符:以小写字母开头的,包含字母、数字、下划线的串,:以小写字母开头的,包含字母、数字、下划线的串,例例aBcl2,is_2)符号符号: Prolog语言规定的符号集的非空序列,例语言规定的符号集的非空序列,例?、-、=。若原子用单引号若原子用单引号()括住,则可含有任何字符。括住,则可含有任何字符。(3)字符集字符集: ABZ; abz; 0129;?,“,#,$, ,&,(,),=,_,|, “,”,-,+,;,*,5.2.1 数据结构数据结构 u变量变量 变量是用来表示还无法知道且需要变量是用来表示还无法知道且

14、需要Prolog程序来确程序来确定的客体。变量用变量名表示,变量名与标识符相似,所定的客体。变量用变量名表示,变量名与标识符相似,所不同的是以大写字母或下划线开头。例不同的是以大写字母或下划线开头。例Variable,_ansure。 Prolog语言中有一个特殊的变量,不需要知道它是语言中有一个特殊的变量,不需要知道它是什么以及具体名字,只是表示留出一位置,称为匿名变量。什么以及具体名字,只是表示留出一位置,称为匿名变量。用单一的下划线用单一的下划线( _ )来表示。比如只想知道是否有人喜欢来表示。比如只想知道是否有人喜欢跳舞,但不需知道这个人的名字,这时就可以用匿名变量。跳舞,但不需知道这

15、个人的名字,这时就可以用匿名变量。5.2.1 数据结构数据结构 u结构结构 结构是结构是Prolog语言中的第三类数据结构,用于构造语言中的第三类数据结构,用于构造Prolog数据对象。一个结构是一个单一的客体,它由一个函数据对象。一个结构是一个单一的客体,它由一个函子和一个或多个称为分量的项的序列组成。其书写形式为子和一个或多个称为分量的项的序列组成。其书写形式为 函子函子(分量分量1,分量,分量2,分量,分量n) 其中的分量也可以是结构。其中的分量也可以是结构。例如:例如: person(name(mary), address(street(zhongshan),number(120) 5

16、.2.1 数据结构数据结构 u结构结构 在在Prolog语言中,常用的结构形式有:语言中,常用的结构形式有: (1)函子函子(分量分量1,分量,分量2,分量,分量n)。如上例。如上例Mary的住的住所。所。 (2)表表。表是。表是Prolog语言中最常用的数据结构,它由一些有语言中最常用的数据结构,它由一些有序分量组成,其长度可任意。有序即表示表中的分量次序是序分量组成,其长度可任意。有序即表示表中的分量次序是有意义的。同样,表的分量可以是原子、结构等,当然也可有意义的。同样,表的分量可以是原子、结构等,当然也可以是表。以是表。 例如含有例如含有3个分量个分量a,b,c的表可写成的表可写成 a

17、,b,c如用函如用函数的方式可写成数的方式可写成 (a (b (c )。其中符号。其中符号“”是表的函子也就是说,表是以是表的函子也就是说,表是以“”为函子的特殊结构。为函子的特殊结构。 5.2.1 数据结构数据结构 5.2.1 数据结构数据结构 u结构结构 (3)表达式表达式。PROLOG语言提供了各种运算,如算语言提供了各种运算,如算术运算、比较运算等。术运算、比较运算等。PROLOG语言中的运算可以语言中的运算可以是中缀形式,简明直观,符合人们的习惯。是中缀形式,简明直观,符合人们的习惯。 算术表达式算术表达式X+YZ中,中,“+”、“”便便是运算符,该表达式如用函数结构形式来表示就是是

18、运算符,该表达式如用函数结构形式来表示就是+(X(YZ)。所以,表达式也是一种结构。所以,表达式也是一种结构。 PROLOG语言提供了统一的数据结构语言提供了统一的数据结构项项(term)。在。在PROLOG中,无论是程序还中,无论是程序还是数据,都是由项构成。是数据,都是由项构成。项的定义为项的定义为项:项: 常量常量| 变量变量|结构结构|“(”项项“)” 每一个项书写为一个字符串。每一个项书写为一个字符串。 5.2.1 数据结构数据结构 n一个一个Turbo Prolog程序的结构包括程序的结构包括5个部分,即个部分,即域域说明段说明段、数据库说明段数据库说明段、谓词说明段谓词说明段、目

19、标目标(内部(内部目标)目标)段段和和子句段子句段。每个部分都用一个词。每个部分都用一个词(domain, database, predicates, goal, clauses)标识,标识,并并规定各部分的标识及在程序中的顺序。规定各部分的标识及在程序中的顺序。n一 个 最 简 单 的一 个 最 简 单 的 T u r b o P r o l o g 程 序 由程 序 由 谓 词谓 词(predicates)段段和和子句子句(clauses)段段组成。组成。 5.2.2 程序结构程序结构 1.域说明域说明 在在Prolog语言中语言中,每个谓词的对象都有一每个谓词的对象都有一个域个域(即取值

20、范围即取值范围),如果这个域为标准域类如果这个域为标准域类型型,则不需在域说明段里说明则不需在域说明段里说明;如果这个如果这个域不是标准域类型域不是标准域类型,则需要在域说明段里则需要在域说明段里说明说明。2.谓词说明谓词说明 该段用来说明程序中用到的谓词的名字和该段用来说明程序中用到的谓词的名字和谓词对象的域谓词对象的域,但是但是Turbo Prolog的内部的内部谓词无须在此段中说明。谓词无须在此段中说明。 5.2.2 程序结构程序结构 谓词对象的域一般具有谓词对象的域一般具有4种域形式种域形式:标准域、表标准域、表域、复合对象域和文件域。域、复合对象域和文件域。(1) 标准域标准域 标准

21、域用标准域用integer(整型整型)、real(实数型实数型)、char(字符型字符型)、string(串型串型)、symbol(符号型符号型)来说明谓词的对象领域,是基本的域类型。例如来说明谓词的对象领域,是基本的域类型。例如:predicates likes(symbol,symbol) 如果编程人员希望能够自己定义一些除基本数据如果编程人员希望能够自己定义一些除基本数据类型之外的类型时类型之外的类型时,可以在域说明段内定义。例可以在域说明段内定义。例如如: 5.2.2 程序结构程序结构 domains person, thing = symbol predicates likes(pe

22、rson, thing) 其中其中,person和和thing都是自行定义的类型。这种都是自行定义的类型。这种表示具体、形象,编写出的程序可读性好,也便于表示具体、形象,编写出的程序可读性好,也便于在程序调试中查找错误在程序调试中查找错误 5.2.2 程序结构程序结构 (2)复合对象域复合对象域 复合对象域如复合对象域如collection(linli, book(“微型计算机微型计算机”,”张张三三”,”科技出版社科技出版社”,1987)。domains book_directory =book(title , author, publisher, year) collector, titl

23、e, author, publisher =symbol year=integerpredicates collection(collector, book-directory).clauses collection(linlin, book(微型计算机微型计算机,张三张三,科技出版社科技出版社,1987).5.2.2 程序结构程序结构 (3)表域表域 表 域 是 一 种 特 殊 的 复 合 对 象 ,表 域 是 一 种 特 殊 的 复 合 对 象 ,如如:student(zhangsan,82,75,90,92)就表示就表示某 一 位 学 生 的 某 学 期 的 学 习 成 绩 , 其 中某

24、 一 位 学 生 的 某 学 期 的 学 习 成 绩 , 其 中82,75,90,92就是一个表。就是一个表。 要在要在Turbo Prolog中说明一个表,需在程序的中说明一个表,需在程序的3个部分加以说明个部分加以说明:表的域说明段定义表的域类型表的域说明段定义表的域类型,谓词说明段定义表的谓词谓词说明段定义表的谓词,表本身必须在程序的表本身必须在程序的某个地方某个地方(即子句段即子句段)出现。出现。 表的域说明是通过在表元素的域名后面加上一个表的域说明是通过在表元素的域名后面加上一个星号星号(*)来实现的来实现的,例如例如: 5.2.2 程序结构程序结构 Domains num_list

25、=integer* name=symbol 说明说明num_list为一个整数表为一个整数表,除了整数类除了整数类型元素外型元素外,其他类型的元素不能列入表中。其他类型的元素不能列入表中。其中其中*号是号是Turbo Prolog的标志的标志,表明该领表明该领域具有一张元素类型为整型的表域具有一张元素类型为整型的表,可以把星可以把星号理解为表中有零个或多个元素。号理解为表中有零个或多个元素。 5.2.2 程序结构程序结构 在谓词说明段在谓词说明段,表谓词的说明由请词名后跟用括表谓词的说明由请词名后跟用括号括起来的一组域名组成号括起来的一组域名组成,如如:predicatesstudent(na

26、me, num-list) 在程序子句段在程序子句段,可直接引用在谓词说明段的表谓可直接引用在谓词说明段的表谓词词,如如:student(zhangsan,82,75,90,92). 5.2.2 程序结构程序结构 对于具有不同类型数据元素的表对于具有不同类型数据元素的表,可用以下的方可用以下的方法加以说明法加以说明:domains element=c(char); i(integer); r(real); s(symbol) mixlist=element* 上述说明中的上述说明中的c、i、r或或s是数据类型的名字,在它是数据类型的名字,在它的后面用括弧说明标准类型。下面是应用上述领域的后面用

27、括弧说明标准类型。下面是应用上述领域说明建立的两张表说明建立的两张表: s(li-ming), i(45000), s(liuhai,i(28000), s(li-ning), i(33655)i(9),c(x),r(3.14159),i(14), i(33),s(test) 5.2.2 程序结构程序结构 (4) 文件域文件域当用符号名来指定文件时当用符号名来指定文件时,必须定义文件域。一个程必须定义文件域。一个程序只能有一个这样类型的域序只能有一个这样类型的域,且域名只能用自且域名只能用自file,如如:Domains myfile,dbfile,outfile=file定义了定义了3个符号

28、文件。个符号文件。 5.2.2 程序结构程序结构 3.子句段子句段 子句段是程序的核心子句段是程序的核心,它包含所求问题域它包含所求问题域的全部事实和规则的全部事实和规则,类似一个知识库。在写类似一个知识库。在写子句时必须把相同谓词的子句连续放在一起子句时必须把相同谓词的子句连续放在一起,以便归类和提高效率。系统在试图满足程序以便归类和提高效率。系统在试图满足程序的目标时的目标时,就是对该段中的子句操作。事实就是对该段中的子句操作。事实和规则可以使用用户自定义的谓词和规则可以使用用户自定义的谓词,也可以也可以使用系统提供的大量内部谓词使用系统提供的大量内部谓词。 5.2.2 程序结构程序结构

29、4.目标段目标段 该段放置程序的目标。该段放置程序的目标。Turbo Prolog程序有两程序有两类目标类目标:内部目标和外部目标。当目标子句写在内部目标和外部目标。当目标子句写在目标段时目标段时,该目标是内部目标。若程序没有内部该目标是内部目标。若程序没有内部目标目标,则由用户在程序运行时临时给出的目标为则由用户在程序运行时临时给出的目标为外部目标。外部目标。 5.2.2 程序结构程序结构 例例5.1 一个包含域说明段、谓词说明段和子句段的完一个包含域说明段、谓词说明段和子句段的完整的整的Prolog程序。程序。Domains person, thing=symbolpreicates li

30、kes(person,thing) friends(person,person) clauses friends(liming,X):-likes(liming,Y), likes(X,Y), not(liming=X). 5.2.2 程序结构程序结构 likes(liming, football). likes(liming, tennis). likes(zhangli, tennis). likes(zhaowei, football). goal friends(liming, Who). /*在在clause语句前输入语句前输入friends(liming, Who),write(“

31、Who=”,Who).时的结果为时的结果为什么形式?什么形式?*/5.2.2 程序结构程序结构 意思是询问李明与谁是朋友意思是询问李明与谁是朋友,结果为结果为:Who=zhangliWho=zhaowei如果把目标子句写在程序的目标段,即在如果把目标子句写在程序的目标段,即在clauses段前加入如下语句段前加入如下语句:则不需用户在程序运行时另外输入目标,此时则不需用户在程序运行时另外输入目标,此时程序的运行结果为程序的运行结果为:Who=zhangli 5.2.2 程序结构程序结构 在这里,读者可以看出在这里,读者可以看出Turbo Prolog程程序内部目标和外部目标的区别序内部目标和外

32、部目标的区别:n当问题有多个解时,内部目标仅寻找第一当问题有多个解时,内部目标仅寻找第一个解;并且,若要显示目标中变量个解;并且,若要显示目标中变量(Who)的被实例化的值,必须用输出语句的被实例化的值,必须用输出语句(write)显示。显示。n外部目标则搜索问题所有解,并显示所有外部目标则搜索问题所有解,并显示所有解中变量的被实例化的值。解中变量的被实例化的值。 5.2.2 程序结构程序结构 u内部谓词内部谓词是由是由PROLOG系统预先提供的,而不是由系统预先提供的,而不是由编程者自定义的谓词。他们提供了无法靠程序来定编程者自定义的谓词。他们提供了无法靠程序来定义的功能,为用户提供常用的谓

33、词。内部谓词由系义的功能,为用户提供常用的谓词。内部谓词由系统实现,具有很高的执行效率。统实现,具有很高的执行效率。u常见内部谓词如下:常见内部谓词如下:5.2.3 PROLOG语言的内部谓词语言的内部谓词 1.比较类比较类 比较类谓词是具有两个自变量中缀形式的内部谓词,结果为比较类谓词是具有两个自变量中缀形式的内部谓词,结果为True或或False。比较谓词有:比较谓词有: X=Y 等于等于 X =Y 不等于不等于 X)Y 小于(大于)小于(大于) X=)Y 小于等于(大于等于)小于等于(大于等于) X=Y 强等于强等于 这些谓词的自变量可以是被例化为整数的变量,也可以是这些谓词的自变量可以

34、是被例化为整数的变量,也可以是以常量形式出现的整数。其中以常量形式出现的整数。其中=、 = 和和 = 不仅是对整数不仅是对整数而言,其自变量也可以是任何结构。而言,其自变量也可以是任何结构。5.2.3 PROLOG语言的内部谓词语言的内部谓词 2.表达式类表达式类X is Y Y可被例化为表达式。该谓词首先对可被例化为表达式。该谓词首先对Y求值,得出一整数。求值,得出一整数。如如X未例化,则未例化,则X例化为这一结果,且目标成功;否则,如例化为这一结果,且目标成功;否则,如X已已例化,例化,“is”退化为退化为“=“来判断成功与否。来判断成功与否。X+Y 加法运算。求值时自变量必须例化。加法运

35、算。求值时自变量必须例化。X-Y 减法运算。求值时自变量必须例化。减法运算。求值时自变量必须例化。X*Y 乘法运算。求值时自变量必须例化。乘法运算。求值时自变量必须例化。X/Y 整除法运算。求值时自变量必须例化整除法运算。求值时自变量必须例化X mod Y 取模运算。求值时自变量必须例化。取模运算。求值时自变量必须例化。优先级:优先级:+、- (正负号正负号),mod(取模取模),*、(乘除乘除),+、- (加加减减)。5.2.3 PROLOG语言的内部谓词语言的内部谓词 3.输入输出类输入输出类nPROLOG语言的输入输出类语言的输入输出类(I/O)谓词是系统从输入流输入谓词是系统从输入流输

36、入一个项、一个字符或一个文件,或把一个项、一个字符或一一个项、一个字符或一个文件,或把一个项、一个字符或一个文件输出到输出流。它们仅仅是功能性的,即仅完成一项个文件输出到输出流。它们仅仅是功能性的,即仅完成一项动作。动作。(1)geto(X)。如如X与输入流中的下一个字符匹配,则目标成功。与输入流中的下一个字符匹配,则目标成功。(2)get(X)。如如X与输入流中的下一个打印字符匹配,则目标成与输入流中的下一个打印字符匹配,则目标成功。功。(3)skip(X)。读入并跳过当前输入流中的字符,直到找到一个读入并跳过当前输入流中的字符,直到找到一个可与可与X匹配的字符。匹配的字符。(4)read(

37、X)。读入当前输入流的下一个项,并使之与读入当前输入流的下一个项,并使之与X匹配。匹配。 5.2.3 PROLOG语言的内部谓词语言的内部谓词 3.输入输出类输入输出类n(5)put(X)。把整数把整数X输出到当前输出流输出到当前输出流(X必须例化必须例化)。n(6)nl。对当前输出流输出控制符对当前输出流输出控制符“回车换行回车换行”。n(7)tab(X)。输出输出X个空格符到当前输出流个空格符到当前输出流(X必须例化必须例化)。n(8)write(X)。把项把项X输出到当前输出流。输出到当前输出流。n(9)display(X)。与与write (X)相似,只是它忽略运算符说明,相似,只是它

38、忽略运算符说明,以结构形式输出项。以结构形式输出项。n(10)op(X,Y,Z)。说明名为说明名为Z的运算符,其优先级为的运算符,其优先级为X,结结合规则为合规则为Y。5.2.3 PROLOG语言的内部谓词语言的内部谓词 4.文件操作类文件操作类nPROLOG语言提供的改变当前输入流、输出流的谓语言提供的改变当前输入流、输出流的谓词如下;词如下;n (1)see(x)。打开目标文件打开目标文件x,并以文件并以文件x为当前为当前输入流。如输入流。如x为变量或以为变量或以x为名的文件不存在,则出为名的文件不存在,则出错。错。n (2)seeing(x)。如如x为变量,则为变量,则x被例化为当前输被

39、例化为当前输入流入流n匹配时,目标成功。匹配时,目标成功。n (3)seen关闭当前输入流;置当前输人流为键盘。关闭当前输入流;置当前输人流为键盘。 5.2.3 PROLOG语言的内部谓词语言的内部谓词 n(4)tell(x)。把把x定义为当前输出流,打开定义为当前输出流,打开文件文件x。如如x未例化,则出错。未例化,则出错。n(5)telling(x)。如如x为变量,则为变量,则x被例化为被例化为当前输出流;如当前输出流;如x已例化,则已例化,则X与当前输出与当前输出流匹配成功时,目标成功。流匹配成功时,目标成功。n(6)told。关闭当前输出流,并在文件尾加关闭当前输出流,并在文件尾加上结

40、束标志;置当前输出流为显示器。上结束标志;置当前输出流为显示器。5.2.3 PROLOG语言的内部谓词语言的内部谓词 5.控制谓词类控制谓词类n (1)true。该目标永远成功。该目标永远成功。n (2)fail。(失败自回溯法失败自回溯法)该目标永远失败。该目标永远失败。使用使用fail可以强制回溯,从而得到问题的所有解可以强制回溯,从而得到问题的所有解。 下面的程序用下面的程序用fail谓词控制回溯过程谓词控制回溯过程,强行使程序强行使程序重复查找问题的所有解。重复查找问题的所有解。 例例5.2 管理人员根据工作需要来查询学生登记卡片。管理人员根据工作需要来查询学生登记卡片。学生卡片内容有

41、学生卡片内容有:姓名、身份证、宿舍号、年龄。姓名、身份证、宿舍号、年龄。假设该程序的事实和规则如下假设该程序的事实和规则如下: 5.2.3 PROLOG语言的内部谓词语言的内部谓词 clausesstudent(“王琳王琳”,20). student(“李丽李丽”,21). student(“方芳方芳”,19).get_student_mes:-student (Name ,Age), write(Name, Age), nl, fail.get-student-mes.若目标为若目标为:Goal: get_student_mes. 5.2.3 PROLOG语言的内部谓词语言的内部谓词 (3)

42、repeat (用户定义重复法用户定义重复法) 。repeat是利用一个永远成是利用一个永远成功的规则使回溯总有可能功的规则使回溯总有可能,因而获得无限循环因而获得无限循环。它可用。它可用PROLOG语言来定义如下:语言来定义如下: r repeat.epeat. repeat:-repeat. repeat:-repeat. 其中,第一个其中,第一个repeatrepeat语句只有规则头,没有规则体,这相当于语句只有规则头,没有规则体,这相当于在数据库中存在有在数据库中存在有repeatrepeat这个事实,因此总是成功的。由于存这个事实,因此总是成功的。由于存在此规则的一个变体子句,在第一

43、个在此规则的一个变体子句,在第一个repeatrepeat处留下了回溯标记。处留下了回溯标记。第第2 2个个repeatrepeat是一个调用自身是一个调用自身( (即第即第3 3个个repeat)repeat)的规则的规则,当第当第2 2个个repeatrepeat调用第调用第3 3个个repeatrepeat时,由于存在这个事实时,由于存在这个事实( (即第一个即第一个repeat)repeat)而成功,这就意味着而成功,这就意味着repeatrepeat是一条永远不会失败的规是一条永远不会失败的规则。则。 5.2.3 PROLOG语言的内部谓词语言的内部谓词 n这种方法是通过其他规则引用

44、这种方法是通过其他规则引用repeatrepeat规则而获得循环。规则而获得循环。n例例5.35.3 程序从键盘上接受字符并显示在屏幕上程序从键盘上接受字符并显示在屏幕上,直直到用户输入回车键到用户输入回车键( (ASCIIASCII码值为码值为13)13)为止。为止。 predicates repeat keywrite clauses repeat. repeat:-repeat. keywrite:-repeat,readchar(X),write(X),char_int(X ,13). goal keywrite.5.2.3 PROLOG语言的内部谓词语言的内部谓词 (4)!(!(cu

45、t)。(截断截断失败失败法法)截断谓词!是截断谓词!是PROLOG语言控制搜索过程的一个非常重要的内部语言控制搜索过程的一个非常重要的内部谓词,它允许程序员告诉谓词,它允许程序员告诉PROLOG系统,当对已满系统,当对已满足的目标的链进行回溯时,前面的那些选择不需要足的目标的链进行回溯时,前面的那些选择不需要重新考虑。重新考虑。 1) 1) 截断截断谓词谓词可用于终止在它之前的回溯可用于终止在它之前的回溯,对于那对于那些对解决实际问题些对解决实际问题无无帮助作用的提问帮助作用的提问,不需再花费不需再花费时间去重新考虑以试图得到满足时间去重新考虑以试图得到满足,加快了程序执行加快了程序执行的速度

46、。的速度。 2) 2) 一旦通过了截断谓词一旦通过了截断谓词,在这之前所作的回溯标在这之前所作的回溯标记将被清除记将被清除,因此可以节约存储空间。因此可以节约存储空间。5.2.3 PROLOG语言的内部谓词语言的内部谓词 3) 3) 截断谓词可以用来模拟传统语言的截断谓词可以用来模拟传统语言的if-then-elseif-then-else语句。如传统语言有一条规则为语句。如传统语言有一条规则为:if P then A else Bif P then A else B 用用PrologProlog语言实现如下语言实现如下: if(P,A ,B):if(P,A ,B):- - P, P, !,!

47、, A.A. if(P,A ,B):-B. if(P,A ,B):-B.4) 4) 截断谓词可以和截断谓词可以和failfail联合使用,通过两者的联合联合使用,通过两者的联合使用时,缩短搜索时间,实现所谓的范围截断。使用时,缩短搜索时间,实现所谓的范围截断。5.2.3 PROLOG语言的内部谓词语言的内部谓词 例例5.45.4 编写程序实现阶乘编写程序实现阶乘n!n!。 我们知道我们知道,使用递归定义使用递归定义,可以把可以把n n的阶乘定义如的阶乘定义如下下:1!=1 (1!=1 (停止条件停止条件) )n!=nn!=n(n-1)! (n-1)! (递归定义递归定义) ) 下面是实现阶乘函

48、数功能的下面是实现阶乘函数功能的PrologProlog程序程序,该程序该程序定义了一个求阶乘的谓词定义了一个求阶乘的谓词facfac,有两个对象有两个对象,其中其中第第一一个对象表示乘数个对象表示乘数n n,第第2 2个对象存放个对象存放阶阶乘值乘值( (即即n!n!的结果的结果) )。 5.2.3 PROLOG语言的内部谓词语言的内部谓词 predicatesfac(integer,real)clausesfac(1,1):-!. /* 递归停止条件递归停止条件 */fac(X,FactX):- Y=X-1, /* 初始计算初始计算 */fac(Y,FactY), /* 递归递归谓词谓词

49、*/FactX=X *FactY. /* 最终计算最终计算 */ goal fac(3,X).5.2.3 PROLOG语言的内部谓词语言的内部谓词 u6.复杂目标类复杂目标类 (1)call(X)。x被例化为一个定义为目标的项,如果被例化为一个定义为目标的项,如果x成功,则成功,则call (X)成功;如果成功;如果X失败则失败则call (X)失败。失败。p使用使用call可以在编制程序时,调用还未知的目标函子。可以在编制程序时,调用还未知的目标函子。(2)not(X)。将将X看做一个目标,当看做一个目标,当X失败,失败,not (X)失失败败.p谓词谓词not(X) 可用可用!和和fail

50、来定义:来定义:pnot (X):-call (x),!,failpnot (X) 5.2.3 PROLOG语言的内部谓词语言的内部谓词 u6.复杂目标类复杂目标类(3)X,Y。谓词中谓词中“ , ”是是“并且并且”的意义。设的意义。设X,Y均为目标,均为目标,当当X和和Y都成功,则谓词都成功,则谓词X,Y才成功;如才成功;如X成功,成功,Y失败,则失败,则回溯,试图重新满足回溯,试图重新满足X,若若X又失败,则整个目标谓词又失败,则整个目标谓词X,Y失败。失败。(4)X;Y。谓词中谓词中“;”是是“或或”的意义。设的意义。设X,Y均为目标,当均为目标,当X或或Y成功,则谓词成功,则谓词X;Y

51、成功;当成功;当X和和Y均失败时,谓词均失败时,谓词X;Y才才失败。失败。5.2.3 PROLOG语言的内部谓词语言的内部谓词 u7.项类项类p(1)var(x)。当当x为一未例化的变量,为一未例化的变量,var(x)为为true。p(2)nonvar(x)。当当x不是未例化变量时,不是未例化变量时,nonvar(x)为为False。p(3)atom(x)。当当x 为原子时为原子时 ,目标,目标 atom (x) 成成功。功。p(4)integer(x)。当当x代表一个整数,则目标成功。代表一个整数,则目标成功。p(5)atomic(x)。当当x为一个原子或一个整数时,则为一个原子或一个整数时

52、,则目标成功。目标成功。5.2.3 PROLOG语言的内部谓词语言的内部谓词 u8.结构分量类结构分量类p(1)functor(T,F,N)。该谓词表示该谓词表示T是一个以是一个以F为为函子、有函子、有N个分量的结构。个分量的结构。Eg. functor(T,likes,2). T=likes(_23,_24)p(2)arg(N,T,A)。如果如果T的第的第N个分量是个分量是A,则目则目标成功。使用时,标成功。使用时,N和和T必须为已例化变量。必须为已例化变量。p(3)x L。该谓词表示该谓词表示L是由结构是由结构x的因子及分的因子及分量构成的表。量构成的表。p(4)name(A,L)。该谓词

53、表示该谓词表示L由组成由组成A的字符的字符(ASCII码表示码表示)构成构成。5.2.3 PROLOG语言的内部谓词语言的内部谓词 5.2.3 PROLOG语言的内部谓词语言的内部谓词 u9.项维护类项维护类p(1)consult(x)p(2)reconsult(x)p(3)asserta(x)p(4)assertz(x)p(5)retract(x)p(6)retractall(x)p(7)listing(x)p(8)clause(x,y)nPrologProlog语言中最重要的结构就是表。因此语言中最重要的结构就是表。因此,表处理技术是表处理技术是PrologProlog程序设计的基础。程序

54、设计的基础。 nProlog采用下面的记号表示表采用下面的记号表示表:5.2.3 表处理表处理 或或nil 空表空表 a cons(a, nil)a, b cons(a,cons(b,nil)a,b,c cons(a,cons(b,cons(c,nil)X|Y cons(X,Y)a,b|c cons(a, cons(b,c)n根据表可递归定义的性质根据表可递归定义的性质,任何用来完成表处理任何用来完成表处理的规则都是其自身的递归。表处理的基本思想是的规则都是其自身的递归。表处理的基本思想是:先对先对表头表头完成必要的处理完成必要的处理,然后利用然后利用规则自身的规则自身的递归性质递归性质处理处

55、理表尾表尾。采用递归规则的循环方式将。采用递归规则的循环方式将表不断分离表不断分离,直到表尾为直到表尾为 为止。用为止。用PrologProlog描描述的表处理规则一般具有以下形式述的表处理规则一般具有以下形式:manipulate(manipulate( ).). / /* *停止条件停止条件* */ /manipulate(Hmanipulate(H| |T):-process(HT):-process(H),), / /* *先处理表头元素先处理表头元素* */ / manipulate(Tmanipulate(T).). / /* *递归处理表尾递归处理表尾* */ / 5.2.3 表

56、处理表处理 n例例5 5.6 .6 统计表的长度。统计表的长度。n表的长度即表中元素的个数,下面的程序定义了表的长度即表中元素的个数,下面的程序定义了一个谓词一个谓词lengthlength用于求表的长度,这个谓词的第用于求表的长度,这个谓词的第一个对象表示表,第一个对象表示表,第2 2个对象表示所求得的表的个对象表示所求得的表的长度。长度。domainsdomainse element=c(char);i(integer);r(real);s(symbol)lement=c(char);i(integer);r(real);s(symbol)mixlistmixlist=element=el

57、ement* * / /* * 这是一个混合表这是一个混合表 * */ /predicates predicates length(mixlistlength(mixlist, integer)., integer). 5.2.3 表处理表处理 clausesclauses length( ,0). length( ,0). / /* *递归停止条件递归停止条件:空表长度为空表长度为0 0* */ / length(_|Tlength(_|T, L):- 1ength(T, , L):- 1ength(T, LlLl), ), / /* *递归处理表尾递归处理表尾* */ / L=Ll+1.

58、L=Ll+1. / /* *表的长度等于表尾长度加表的长度等于表尾长度加1 1* */ / 5.2.3 表处理表处理 n表在构造知识库表在构造知识库( (数据库数据库) )、专家系统、符号词、专家系统、符号词典时非常有用。表处理技术常见的有查找表元典时非常有用。表处理技术常见的有查找表元素、表的拼接素、表的拼接、表的分离、表的分离、表的翻转、向表中表的翻转、向表中插入元素、从表中删除元素和求表的最大(最插入元素、从表中删除元素和求表的最大(最小)元素等小)元素等等等。下面介绍常见的表处理操作等等。下面介绍常见的表处理操作的程序设计技术。的程序设计技术。5.2.3 表处理表处理 1. 1. 查找

59、表元素查找表元素n表元素的查找是经常要做的事情表元素的查找是经常要做的事情,必须在数据项必须在数据项( (搜索对象搜索对象) )和目标表中的元素之间进行匹配。如果和目标表中的元素之间进行匹配。如果匹配成功匹配成功,则搜索成功则搜索成功,否则否则,搜索失败。下面给搜索失败。下面给出的出的membermember规则规则,不断比较搜索对象和当前表的表不断比较搜索对象和当前表的表头头,直到表头的元素与搜索对象匹配为止。直到表头的元素与搜索对象匹配为止。member(H,Hmember(H,H|_|_).).member(H,member(H,_ _|T):-member(H,T).|T):-memb

60、er(H,T). 5.2.3 表处理表处理 2. 2. 表的拼接表的拼接问题:问题:将表将表X X和和Y Y合并成一个更大的表是表合并成一个更大的表是表Z Z。例如,将表例如,将表 a,a, b,b, cc和和 d,d, ee合并起来,得到表:合并起来,得到表: a,a, b,b, c,c, d,d, ee。问题分析:问题分析:根据表根据表X X是否为空表是否为空表 有如下两种情况:有如下两种情况:(1) X= (1) X= 。空。空表表 与任意一个表与任意一个表Y Y合并起来的结果都合并起来的结果都为为Y Y。( (2) 2) X=X1|RestX=X1|Rest,即,即X X是至少含有一个元素是至

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论