prolog 逻辑程序设计语言Prolog教程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章 逻辑程序设计语言Prolog Logical Programming Language Prolog
为了缩小人类自然语言与计算机程序设计语言之间
的差距,人们开发了新型程序设计语言,较典型的
有函数程序设计语言、逻辑程序设计语言以及面向
对象的程序设计语言。
Prolog语言是一种典型的逻辑程序设计语言。利 用Prolog语言进行程序设计只需要程序员写出与 问题有关的事实、规则以及要求解的具体问题。
5.2.0 逻辑程序定义
例如,对于下面两个Horn子句: ① W(X,Y):-P(X), Q(Y). ② ?-R(X,Y),Q(Y). 在①中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.1 数据结构
结构 在Prolog语言中,常用的结构形式有: (1)函子(分量1,分量2,……,分量n)。如上例Mary的住 所。 (2)表。表是Prolog语言中最常用的数据结构,它由一些有 序分量组成,其长度可任意。有序即表示表中的分量次序是 有意义的。同样,表的分量可以是原子、结构等,当然也可 以是表。 例如含有3个分量[a,b,c]的表可写成 [a,b,c]如用函 数的方式可写成 · · (a (b · (c[ ])))。其中符号“· ” 是表的函子.也就是说,表是以“· ”为函子的特殊结构。
“做什么”,而不是像普通程序设计语言那样告 诉计算机“如何做”。
5.1.2 Prolog语言的特点 The characteristics of Prolog language
(2)Prolog语言的数据和程序结构统一,
Prolog语言提供了一种统一的数据结构称为
“项”。所有的程序和数据均由项构成,并且都
5.1 Prolog语言概述
5.1.1 Prolog语言的发展
PROLOG (Programming in Logic)语言是一种以逻辑推 理为基础的逻辑型程序设计语言。它是陈述性语言而不是过 程性语言。
它的思想最早(20世纪70年代初)在英国爱丁堡大学由 R.Kowalski首先提出,并由M.Van Emden作了模型示范。
(5)语法简明。Prolog语言仅有三种句型,语法
规则比较简单。
5.2 Prolog程序的实现原理
5.2.0 逻辑程序定义
在定义逻辑程序之前,首先定义Horn子句, 它是逻辑程序的组成要素。 定义5.1 子句 L1 L2 ... Ln 中如果至多只 含有一个正文字,那么该子句称为Horn子句。 Horn子句P ~ Q1 ~ Q2 ... ~ Qm 通常表示为
5.1.2 Prolog语言的特点 The characteristics of Prolog language
(1)PROLOG语言是一种抽述性语言,用 PROLOG语言求解问题时,只须程序员描述待解 问题中的对象及它们之间关系的一些已知事实和 规则。它强调描述对象之间的逻辑关系,而不必
告诉计算机运算执行的先后次序,即告诉计算机
5.2.2 程序结构
1.域说明 在Prolog语言中,每个谓词的对象都有一 个域(即取值范围),如果这个域为标准域类 型,则不需在域说明段里说明;如果这个 域不是标准域类型,则需要在域说明段里 说明。 2.谓词说明 该段用来说明程序中用到的谓词的名字和 谓词对象的域,但是Turbo Prolog的内部 谓词无须在此段中说明。
复合对象域如collection(linli, book(―微型计算机”,”张 三”,”科技出版社”,1987))。 domains book_directory =book(title , author, publisher, year) collector, title, author, publisher =symbol year=integer predicates collection(collector, book-directory). clauses collection(linlin, book("微型计算机","张三","科技出版社 ",1987)).
是树型结构。 (3)Prolog语言能够自动实现模式匹配和回溯。 这些是人工智能系统中常用的基本操作。用户在 Prolog语言这一级上不必考虑这个问题。
5.1.2 Prolog语言的特点 The characteristics of Prolog language
(4)递归是Prolog语言的重要特点之一。由于这 一特点,一个大的数据结构常常能由小的程序来 处理。
5.2.1 数据结构
变量 变量是用来表示还无法知道且需要Prolog程序来确 定的客体。变量用变量名表示,变量名与标识符相似,所 不同的是以大写字母或下划线开头。例Variable, _ansure。 Prolog语言中有一个特殊的变量,不需要知道它是 什么以及具体名字,只是表示留出一位置,称为匿名变量。 用单一的下划线( _ )来表示。比如只想知道是否有人喜欢 跳舞,但不需知道这个人的名字,这时就可以用匿名变量。
(3) 目标子句(问题Problem): ?- B1, … ,Bn 。
上述3种Horn子句均具有明显的非形式语义。
5.2.0 逻辑程序定义
(1) 无条件子句A: 表示对变量的任何赋值,A 均为真。 (2) 条件子句A:-B1, … ,Bn :表示对变量的 任何赋值,如果B1, … ,Bn均为真,则A为真。 (3) 目标子句?- B1, … ,Bn :其逻辑形式为: 等价于 x1...xn (~ B1 ... ~ Bn ), 它视作推理的目 ~ x1...xn ( B1 ... Bn ) 标。
5.2.1 数据结构
PROLOG语言提供了统一的数据结构—— 项(term)。在PROLOG中,无论是程序还 是数据,都是由项构成。 项的定义为 <项>::= <常量>| <变量>|<结构> |“(”<项>“)” 每一个项书写为一个字符串。
5.2.2 程序结构
一个Turbo Prolog程序的结构包括5个部分,即域 说明段、数据库说明段、谓词说明段、目标(内部 目标)段和子句段。每个部分都用一个词(domain, database, predicates, goal, clauses)标识,并 规定各部分的标识及在程序中的顺序。 一 个 最 简 单 的 Turbo Prolog 程 序 由 谓 词 (predicates)段和子句(clauses)段组成。
上述两个子句都是Horn子句,因此它们构成一个逻辑程序。
假设还有下面3个事实子句:
Child(xiao-li, lao-li). Male(xiao-li).
Male(lao-li).
5.2.1 逻辑程序定义 如果把上述规则和事实加入Prolog中,编译 执行后,给出下面的查询,则有: (1) 目标: ?-Father(X, Y). 则会得到: Father(lao-li, xiao-li). (2) 目标:?-Son(Y, X). 则会得到: Son(xiao-li,lao-1i). 上面已经完成了对Prolog语言简单的描述。
5.2.2 程序结构
domains person, thing = symbol predicates likes(person, thing) 其中,person和thing都是自行定义的类型。这种 表示具体、形象,编写出的程序可读性好,也便于 在程序调试中查找错误
5.2.2 程序结构
(2)复合对象域
5.2.2 程序结构
Domains num_list=integer* name=symbol 说明num_list为一个整数表,除了整数类 型元素外,其他类型的元素不能列入表中。 其中*号是Turbo Prolog的标志,表明该领 域具有一张元素类型为整型的表,可以把星 号理解为表中有零个或多个元素。
1972年,Alain Colmeraner及其研究小组在法国马塞大学 研制成功了第一个Prolog系统。 1977年,英国爱丁堡大学的D.Warren开发了DEC-10 Prolog语言,使之进一步完善。
5.1.1 Prolog语言的发展
1986年美国的Borland International公司向个 人计算机软件市场推出了Turbo Prolog 软件。 现在,PROLOG语言已广泛应用于符号计算的许 多应用场合,其中包括关系数据库、专家系统、 数理逻辑、抽象问题求解、定理证明和语义学、 自然语言理解、结构设计、位置规划和逻辑学、 符号方程解决、编译程序编制、生物化学结构、 生理学分析和药物设计,涉及了许多人工智能领 域。
5.2.1 数据结构
结构
结构是Prolog语言中的第三类数据结构,用于构造 Prolog数据对象。一个结构是一个单一的客体,它由一个函 子和一个或多个称为分量的项的序列组成。其书写形式为 函子(分量1,分量2,……,分量n) 其中的分量也可以是结构。 例如: person(name(mary), address(street(zhongshan),number(120)))
P Q1 , Q2 ,..., Qm
相当于一条IF-THEN规则,由两部分组成:头 部和体。结论部分P称为头部,前提部分称为 体。
5.2.0 逻辑程序定义
Horn子句在Prolog中有3种表示形式。
(1) 无条件子句(事实Fact): A。
(2) 条件子句(规则Rule): A:-B1, … ,Bn 。
5.2.0 逻辑程序定义
定义5.2 逻辑程序就是由Horn子句构成的程序。在逻辑程序中, 头部具有相同谓词符的那些子句称为该谓词的定义。
例如,下面两个谓词逻辑句子,每个句子都只有一个头。
Father(X, Y): -Child (Y, X), Male (X).
Son(Y, X): -Child(Y, X), Male(Y).
5.2.1 数据结构
结构 (3)表达式。PROLOG语言提供了各种运算,如算 术运算、比较运算等。PROLOG语言中的运算可以 是中缀形式,简明直观,符合人们的习惯。 算术表达式X+Y&Z中,“+”、“&”便 是运算符,该表达式如用函数结构形式来表示就是 +(X&(YZ))。所以,表达式也是一种结构。
5.2.1 数据结构
常量: 常量是数据结构的基本组成部分,用来对特定对象及关
系的命名。
在Prolog语言中,合法的常量有: (1)整数,一个纯数字串,例182 000,581 202。 (2)原子,分为两种: 1)标识符:以小写字母开头的,包含字母、数字、下划线的串, 例aBcl2,is_ 2)符号: Prolog语言规定的符号集的非空序列,例?、-、=。 若原子用单引号(‘’)括住,则可含有任何字符。 (3)字符集: AB…Z; ab…z; 012…9; ?,―,#,$,,&,’,(,),=,_,~,^,\,|,[,], ―,‖,-,@,+,;,*,<,>
5.2.2 程序结构
谓词对象的域一般具有4种域形式:标准域、表 域、复合对象域和文件域。 (1) 标准域 标 准 域 用 integer( 整 型 ) 、 real( 实 数 型 ) 、 char(字符型)、string(串型)、symbol(符号型) 来说明谓词的对象领域,是基本的域类型。例如: predicates likes(symbol,symbol) 如果编程人员希望能够自己定义一些除基本数据 类型之外的类型时,可以在域说明段内定义。例 如:
5.2.2 程序结构
(3)表域 表 域 是 一 种 特 殊 的 复 合 对 象 , 如 : student(zhangsan,[82,75,90,92]) 就 表 示 某一位学生的某学期的学习成绩,其中 [82,75,90,92]就是一个表。 要在Turbo Prolog中说明一个表,需在程序的3 个部分加以说明:表的域说明段定义表的域类型, 谓词说明段定义表的谓词,表本身必须在程序的 某个地方(即子句段)出现。 表的域说明是通过在表元素的域名后面加上一个 星号(*)来实现的,例如:
为了缩小人类自然语言与计算机程序设计语言之间
的差距,人们开发了新型程序设计语言,较典型的
有函数程序设计语言、逻辑程序设计语言以及面向
对象的程序设计语言。
Prolog语言是一种典型的逻辑程序设计语言。利 用Prolog语言进行程序设计只需要程序员写出与 问题有关的事实、规则以及要求解的具体问题。
5.2.0 逻辑程序定义
例如,对于下面两个Horn子句: ① W(X,Y):-P(X), Q(Y). ② ?-R(X,Y),Q(Y). 在①中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.1 数据结构
结构 在Prolog语言中,常用的结构形式有: (1)函子(分量1,分量2,……,分量n)。如上例Mary的住 所。 (2)表。表是Prolog语言中最常用的数据结构,它由一些有 序分量组成,其长度可任意。有序即表示表中的分量次序是 有意义的。同样,表的分量可以是原子、结构等,当然也可 以是表。 例如含有3个分量[a,b,c]的表可写成 [a,b,c]如用函 数的方式可写成 · · (a (b · (c[ ])))。其中符号“· ” 是表的函子.也就是说,表是以“· ”为函子的特殊结构。
“做什么”,而不是像普通程序设计语言那样告 诉计算机“如何做”。
5.1.2 Prolog语言的特点 The characteristics of Prolog language
(2)Prolog语言的数据和程序结构统一,
Prolog语言提供了一种统一的数据结构称为
“项”。所有的程序和数据均由项构成,并且都
5.1 Prolog语言概述
5.1.1 Prolog语言的发展
PROLOG (Programming in Logic)语言是一种以逻辑推 理为基础的逻辑型程序设计语言。它是陈述性语言而不是过 程性语言。
它的思想最早(20世纪70年代初)在英国爱丁堡大学由 R.Kowalski首先提出,并由M.Van Emden作了模型示范。
(5)语法简明。Prolog语言仅有三种句型,语法
规则比较简单。
5.2 Prolog程序的实现原理
5.2.0 逻辑程序定义
在定义逻辑程序之前,首先定义Horn子句, 它是逻辑程序的组成要素。 定义5.1 子句 L1 L2 ... Ln 中如果至多只 含有一个正文字,那么该子句称为Horn子句。 Horn子句P ~ Q1 ~ Q2 ... ~ Qm 通常表示为
5.1.2 Prolog语言的特点 The characteristics of Prolog language
(1)PROLOG语言是一种抽述性语言,用 PROLOG语言求解问题时,只须程序员描述待解 问题中的对象及它们之间关系的一些已知事实和 规则。它强调描述对象之间的逻辑关系,而不必
告诉计算机运算执行的先后次序,即告诉计算机
5.2.2 程序结构
1.域说明 在Prolog语言中,每个谓词的对象都有一 个域(即取值范围),如果这个域为标准域类 型,则不需在域说明段里说明;如果这个 域不是标准域类型,则需要在域说明段里 说明。 2.谓词说明 该段用来说明程序中用到的谓词的名字和 谓词对象的域,但是Turbo Prolog的内部 谓词无须在此段中说明。
复合对象域如collection(linli, book(―微型计算机”,”张 三”,”科技出版社”,1987))。 domains book_directory =book(title , author, publisher, year) collector, title, author, publisher =symbol year=integer predicates collection(collector, book-directory). clauses collection(linlin, book("微型计算机","张三","科技出版社 ",1987)).
是树型结构。 (3)Prolog语言能够自动实现模式匹配和回溯。 这些是人工智能系统中常用的基本操作。用户在 Prolog语言这一级上不必考虑这个问题。
5.1.2 Prolog语言的特点 The characteristics of Prolog language
(4)递归是Prolog语言的重要特点之一。由于这 一特点,一个大的数据结构常常能由小的程序来 处理。
5.2.1 数据结构
变量 变量是用来表示还无法知道且需要Prolog程序来确 定的客体。变量用变量名表示,变量名与标识符相似,所 不同的是以大写字母或下划线开头。例Variable, _ansure。 Prolog语言中有一个特殊的变量,不需要知道它是 什么以及具体名字,只是表示留出一位置,称为匿名变量。 用单一的下划线( _ )来表示。比如只想知道是否有人喜欢 跳舞,但不需知道这个人的名字,这时就可以用匿名变量。
(3) 目标子句(问题Problem): ?- B1, … ,Bn 。
上述3种Horn子句均具有明显的非形式语义。
5.2.0 逻辑程序定义
(1) 无条件子句A: 表示对变量的任何赋值,A 均为真。 (2) 条件子句A:-B1, … ,Bn :表示对变量的 任何赋值,如果B1, … ,Bn均为真,则A为真。 (3) 目标子句?- B1, … ,Bn :其逻辑形式为: 等价于 x1...xn (~ B1 ... ~ Bn ), 它视作推理的目 ~ x1...xn ( B1 ... Bn ) 标。
5.2.1 数据结构
PROLOG语言提供了统一的数据结构—— 项(term)。在PROLOG中,无论是程序还 是数据,都是由项构成。 项的定义为 <项>::= <常量>| <变量>|<结构> |“(”<项>“)” 每一个项书写为一个字符串。
5.2.2 程序结构
一个Turbo Prolog程序的结构包括5个部分,即域 说明段、数据库说明段、谓词说明段、目标(内部 目标)段和子句段。每个部分都用一个词(domain, database, predicates, goal, clauses)标识,并 规定各部分的标识及在程序中的顺序。 一 个 最 简 单 的 Turbo Prolog 程 序 由 谓 词 (predicates)段和子句(clauses)段组成。
上述两个子句都是Horn子句,因此它们构成一个逻辑程序。
假设还有下面3个事实子句:
Child(xiao-li, lao-li). Male(xiao-li).
Male(lao-li).
5.2.1 逻辑程序定义 如果把上述规则和事实加入Prolog中,编译 执行后,给出下面的查询,则有: (1) 目标: ?-Father(X, Y). 则会得到: Father(lao-li, xiao-li). (2) 目标:?-Son(Y, X). 则会得到: Son(xiao-li,lao-1i). 上面已经完成了对Prolog语言简单的描述。
5.2.2 程序结构
domains person, thing = symbol predicates likes(person, thing) 其中,person和thing都是自行定义的类型。这种 表示具体、形象,编写出的程序可读性好,也便于 在程序调试中查找错误
5.2.2 程序结构
(2)复合对象域
5.2.2 程序结构
Domains num_list=integer* name=symbol 说明num_list为一个整数表,除了整数类 型元素外,其他类型的元素不能列入表中。 其中*号是Turbo Prolog的标志,表明该领 域具有一张元素类型为整型的表,可以把星 号理解为表中有零个或多个元素。
1972年,Alain Colmeraner及其研究小组在法国马塞大学 研制成功了第一个Prolog系统。 1977年,英国爱丁堡大学的D.Warren开发了DEC-10 Prolog语言,使之进一步完善。
5.1.1 Prolog语言的发展
1986年美国的Borland International公司向个 人计算机软件市场推出了Turbo Prolog 软件。 现在,PROLOG语言已广泛应用于符号计算的许 多应用场合,其中包括关系数据库、专家系统、 数理逻辑、抽象问题求解、定理证明和语义学、 自然语言理解、结构设计、位置规划和逻辑学、 符号方程解决、编译程序编制、生物化学结构、 生理学分析和药物设计,涉及了许多人工智能领 域。
5.2.1 数据结构
结构
结构是Prolog语言中的第三类数据结构,用于构造 Prolog数据对象。一个结构是一个单一的客体,它由一个函 子和一个或多个称为分量的项的序列组成。其书写形式为 函子(分量1,分量2,……,分量n) 其中的分量也可以是结构。 例如: person(name(mary), address(street(zhongshan),number(120)))
P Q1 , Q2 ,..., Qm
相当于一条IF-THEN规则,由两部分组成:头 部和体。结论部分P称为头部,前提部分称为 体。
5.2.0 逻辑程序定义
Horn子句在Prolog中有3种表示形式。
(1) 无条件子句(事实Fact): A。
(2) 条件子句(规则Rule): A:-B1, … ,Bn 。
5.2.0 逻辑程序定义
定义5.2 逻辑程序就是由Horn子句构成的程序。在逻辑程序中, 头部具有相同谓词符的那些子句称为该谓词的定义。
例如,下面两个谓词逻辑句子,每个句子都只有一个头。
Father(X, Y): -Child (Y, X), Male (X).
Son(Y, X): -Child(Y, X), Male(Y).
5.2.1 数据结构
结构 (3)表达式。PROLOG语言提供了各种运算,如算 术运算、比较运算等。PROLOG语言中的运算可以 是中缀形式,简明直观,符合人们的习惯。 算术表达式X+Y&Z中,“+”、“&”便 是运算符,该表达式如用函数结构形式来表示就是 +(X&(YZ))。所以,表达式也是一种结构。
5.2.1 数据结构
常量: 常量是数据结构的基本组成部分,用来对特定对象及关
系的命名。
在Prolog语言中,合法的常量有: (1)整数,一个纯数字串,例182 000,581 202。 (2)原子,分为两种: 1)标识符:以小写字母开头的,包含字母、数字、下划线的串, 例aBcl2,is_ 2)符号: Prolog语言规定的符号集的非空序列,例?、-、=。 若原子用单引号(‘’)括住,则可含有任何字符。 (3)字符集: AB…Z; ab…z; 012…9; ?,―,#,$,,&,’,(,),=,_,~,^,\,|,[,], ―,‖,-,@,+,;,*,<,>
5.2.2 程序结构
谓词对象的域一般具有4种域形式:标准域、表 域、复合对象域和文件域。 (1) 标准域 标 准 域 用 integer( 整 型 ) 、 real( 实 数 型 ) 、 char(字符型)、string(串型)、symbol(符号型) 来说明谓词的对象领域,是基本的域类型。例如: predicates likes(symbol,symbol) 如果编程人员希望能够自己定义一些除基本数据 类型之外的类型时,可以在域说明段内定义。例 如:
5.2.2 程序结构
(3)表域 表 域 是 一 种 特 殊 的 复 合 对 象 , 如 : student(zhangsan,[82,75,90,92]) 就 表 示 某一位学生的某学期的学习成绩,其中 [82,75,90,92]就是一个表。 要在Turbo Prolog中说明一个表,需在程序的3 个部分加以说明:表的域说明段定义表的域类型, 谓词说明段定义表的谓词,表本身必须在程序的 某个地方(即子句段)出现。 表的域说明是通过在表元素的域名后面加上一个 星号(*)来实现的,例如: