第4卷第2期 智能系统学报 Vol 4 Ng 2 2009年4月 CAA I Transactions on Intelligent System s Apr 2009 逻辑程序设计语言Gode1与Prolg的比较 昌杰,赵致琢,李慧琪,高伟 (厦门大学计算机科学系,福建厦门361005) 摘要:在多态多类的一阶逻辑基础之上,围绕类型系统、模块系统、控制机制、元程序设计和输入输出部分对 Godeli语言功能进行分析.重点比较了逻辑程序设计语言Godel与Pobg的联系与区别,通过比较分析,表明由于摒 弃了Pobg语言中的非逻辑成分,引入了多种新的语言成分,Gode语言具有更好的说明性语义和执行效率 关键词:Godeli语言;Pobg语言:模块系统;类型系统;控制机制;元程序设计 中图分类号:TP311文献标识码:A文章编号:16734785(2009)02016306 A com parison between the logic programm ng languages Godel and Prolog CHANG Jie,ZHAO Zhi-zhuo,L IHui-qi,GAO Wei (Deparment of Computer Science,Xiamen University,Xiamen 361005,China) Abstract:We analyzed the functions of the Godel language on the bassis of the first-order logic with polymorphis and multi types The focus was on its types,module system,control mechanisns,metaprogramm ing,and input/ output Emphasiswas on comparisons of relationships and disparities in Prolg and Godel The comparisons showed that the Godel language ismore declarative and efficient because it elm inates the non-lgical parts of Prolog and in- troduces many kinds of new language elements Keywords:Godel Prolg modular system;type system;control mechanis;metaprogramm ing PDog是当代最有影响的人工智能语言之一, 成了它们的程序主体.另外,在执行机理上,合一算 由于该语言很适合表达人的思维和推理过程,分别法和D反驳一消解法为结果的正确性提供了有 在机器定理证明、自动推理、专家系统、智能规划等 效的保证.Godell同时也借鉴了Poog和程序设计领 许多方面得到了广泛的应用,成为人工智能应用领 域的最新成果,引入类型系统、延迟计算和剪枝操作 域的开发工具.但是,P®og在使用中也暴露了该语等诸多新的语言成分,将语言的理论基础扩展到多 言存在的不足:缺乏类型系统、基于Hom子句的语 态多类的一阶逻辑,试图解决Pobg中程序的效率 句形式限制了语言的可表达性能力、控制机制中的 问题和因cut的出现而带来的有争议的语义问题, 非逻辑成份易于导致语义问题等.于是,发展新型逻 Godel是Poog的进一步发展,其主要内容包括类型 辑程序设计语言成为一种选择 系统、控制机制、模块系统、元程序设计和输入输出 Godeli语言是继Pobg之后出现的一个新型说 等部分.本文从这几个方面对Godeli语言进行功能 明性通用逻辑程序设计语言,由以英国Bristol大学 分析,重点讨论了Godel与Pobg的区别,从中可以 的Loyd和Leeds:大学的Hil为代表的研究小组在 看到Godell的一些好的设计思想和理念,有助于新 20世纪90年代中期设计开发.由于Godeli语言是从 型程序语言的研究、设计和开发山 Pbg发展而来,两者之间不可避免地存在一些联 1类型系统的分析与比较 系和相似之处.比如,在语法结构上使用了项、原子 和子句,其中,无条件子句、条件子句和目标子句构 在程序设计语言中,引入类型系统是非常有必 要的.引入类型系统给所有的常数、变量、函数等对 收稿日期:2008-12-16 象加上类型信息,规定对象的取值范围和允许施加 通信作者:昌杰.Emaik changjie2003@163cm 在其上的运算操作,这不仅便于知识表示,提高程序 1994-2009 China Academic Journal Electronie Publishing House.All rights reserved.http://www.cnki.net
第 4卷第 2期 智 能 系 统 学 报 Vol. 4 №. 2 2009年 4月 CAA I Transactions on Intelligent System s Ap r. 2009 逻辑程序设计语言 Go¨del与 Prolog的比较 昌 杰 ,赵致琢 ,李慧琪 ,高 伟 (厦门大学 计算机科学系 ,福建 厦门 361005) 摘 要 :在多态多类的一阶逻辑基础之上 ,围绕类型系统、模块系统、控制机制、元程序设计和输入 /输出部分对 Go¨del语言功能进行分析. 重点比较了逻辑程序设计语言 Go¨del与 Prolog的联系与区别 ,通过比较分析 ,表明由于摒 弃了 Prolog语言中的非逻辑成分 ,引入了多种新的语言成分 , Go¨del语言具有更好的说明性语义和执行效率. 关键词 : Go¨del语言 ; Prolog语言 ;模块系统 ;类型系统 ;控制机制 ;元程序设计 中图分类号 : TP311 文献标识码 : A 文章编号 : 167324785 (2009) 0220163206 A compar ison between the logic programm ing languages Go¨del and Prolog CHANG Jie, ZHAO Zhi2zhuo, L I Hui2qi, GAO W ei (Department of Computer Science, Xiamen University, Xiamen 361005, China) Abstract:We analyzed the functions of the Go¨del language on the bassis of the first2order logic with polymorphism and multi types. The focus was on its types, module system, control mechanism s, meta2p rogramm ing, and input/ output. Emphasiswas on comparisons of relationship s and disparities in Prolog and Go¨del. The comparisons showed that the Go¨del language ismore declarative and efficient because it elim inates the non2logical parts of Prolog and in2 troduces many kinds of new language elements. Keywords: Go¨del; Prolog; modular system; type system; control mechanism; meta2p rogramm ing 收稿日期 : 2008212216. 通信作者 :昌 杰. E2mail: changjie_2003@163. com. Prolog是当代最有影响的人工智能语言之一 , 由于该语言很适合表达人的思维和推理过程 ,分别 在机器定理证明、自动推理、专家系统、智能规划等 许多方面得到了广泛的应用 ,成为人工智能应用领 域的开发工具. 但是 , Prolog在使用中也暴露了该语 言存在的不足 :缺乏类型系统、基于 Horn子句的语 句形式限制了语言的可表达性能力、控制机制中的 非逻辑成份易于导致语义问题等. 于是 ,发展新型逻 辑程序设计语言成为一种选择 [ 1 ] . Go¨del语言是继 Prolog之后出现的一个新型说 明性通用逻辑程序设计语言 ,由以英国 Bristol大学 的 Lloyd和 Leeds大学的 H ill为代表的研究小组在 20世纪 90年代中期设计开发. 由于 Go¨del语言是从 Prolog发展而来 ,两者之间不可避免地存在一些联 系和相似之处. 比如 ,在语法结构上使用了项、原子 和子句 ,其中 ,无条件子句、条件子句和目标子句构 成了它们的程序主体. 另外 ,在执行机理上 ,合一算 法和 SLD 反驳 —消解法为结果的正确性提供了有 效的保证. Go¨del同时也借鉴了 Prolog和程序设计领 域的最新成果 ,引入类型系统、延迟计算和剪枝操作 等诸多新的语言成分 ,将语言的理论基础扩展到多 态多类的一阶逻辑 ,试图解决 Prolog中程序的效率 问题和因 cut的出现而带来的有争议的语义问题. Go¨del是 Prolog的进一步发展 ,其主要内容包括类型 系统、控制机制、模块系统、元程序设计和输入 /输出 等部分. 本文从这几个方面对 Go¨del语言进行功能 分析 ,重点讨论了 Go¨del与 Prolog的区别 ,从中可以 看到 Go¨del的一些好的设计思想和理念 ,有助于新 型程序语言的研究、设计和开发 [ 1 ] . 1 类型系统的分析与比较 在程序设计语言中 ,引入类型系统是非常有必 要的. 引入类型系统给所有的常数、变量、函数等对 象加上类型信息 ,规定对象的取值范围和允许施加 在其上的运算操作. 这不仅便于知识表示 ,提高程序
164 智能系统学报 第4卷 的可读性,便于程序员设计程序与开展合作交流;而 个构造子被说明了,则类型的集合将把基类视为 且编译器也可根据类型系统说明的信息产生效率更 “常量”,把构造子视为“函数”来构造获得函数类 高的代码,同时有助于捕获程序设计中的错误,大大 型,这样就可以构造诸如List(Day)、 增加了程序设计的正确性四 List(List(Day))等可数无限的类型的集合 Pobg以Hom子句逻辑为基础,是一种无类型 例中,a是一个类型变量,允许反映Godeli语言 程序设计语言.这种特点虽然简化了它的语言、编译 的参数多态性,它可以替换任意一个可以构造的类 和执行过程,但却大大降低了可表达性能力,使程序 型.一个类型是一个项,它可以如下构造:将基类视 员设计的程序不易阅读和理解.在Godeli语言中,由 为常量”,类型参数(选取子)视为变量”,构造子 于引入了类型,通常语言说明以关键字BASE、CON- 视为“函数”例如,对上述说明来说,所有类型的集 STRUCTOR,CONSTANT、FUNCTON、PROPOSITDN 合将是Day,Person、List(Day)、List(List(Day)、a、 等开头,这些说明定义了程序中出现的各种数据类 List(a)等等.基于参数多态性,这里的谓词Append 型和符号,有助于程序的阅读和理解 能够对任何类型列表进行追加 例1 Godeli语言的类型说明示例 Godeli语言的类型系统是一个强类型系统,程 BASE Day,Person %基类说明 序中的每个项和它的类型必须进行语言说明.尽管 CONSIRUCIR List/1 %类型构造算子 变量的类型说明不做强制要求,但为了保证其类型 CONSTANT Nit List(a). %常量说明 可由上下文推测出来,约定程序中有足够的信息可 Monday,Tuesday:Day 被编译程序和推理机用于判定类型并保证程序的安 Fred,Bilt Person 全执行,而不需要显式地给出变量的类型说明) FNCTON Cons a*List(a)-List(a). %函数说明 Godeli语言在引入类型后,显然大大提高了语 PRED CATE Append:L(a)·Lis(a)·List(a).%谓词说明 言的可表达性能力,使其程序拥有更好的说明性语 如例1所示,程序中的语言说明可以由以下几 义.并且类型系统的引入给Godel语言的编译带来 部分组成: 了方便,提高了执行效率,也更容易实现程序的并行 1)以关键字BASE开头的语言说明给出了多态 执行) 多类语言程序的基本类型,称为基类 2控制机制的区别 2)CONSTRUCTOR说明了用户命名的含有n元 类型参数的结构类型称为构造子).可以从一些类 控制机制主要针对语言的过程性语义.在Po 型构造产生新的类型 bg语言中,针对其Hom子句,采用9D反驳一消解 3)CONSTANT说明定义了常量 法来推导出最后的结果.这种方法无论从实际的操 4)FUNCTON和PRED CATE分别说明了函数 作过程还是从理论的推导上都是严谨正确的,它也 和谓词类型,对应Godel语言中的项和原子.Godel 是PDbg语言说明性语义和过程性语义的桥梁。 语言的函数和谓词都是基于类型的,函数和谓词的 例2设有Pobg程序片段 每一个参数都需要进行类型说明 1)Reverse([]]) 在上面的示例中,Day和Person是基类,CON- 2)Reverse ([HI T/,Rev)+Reverse T. STANT说明Nil是List(a)类型的一个常量,Mon- TR)AAppend(TR.[HJ.Rev). day Tuesday分别是Day类型的常量,Fred、Bil分别 这里,Append(X,y,Z)谓词将列表X和按顺 是Person类型的常量.UNCTDN说明了Cons是一 序合并成新表Z.如该程序目标子句为Append([l, 个二元函数,它把二元组(第1个参数是a类型,第 2],【3,41,Z),则Z的输出结果为[1,2,3,41Re 2个参数是List(a)类型)映射到一个List(a)类 verse(X,)谓词是将X列表逆转得到新表Y.如果 型的元素.PRED CATE说明了Append是一个三元 目标子句为Reverse([2,4,3],),容易得到Y= 谓词,每个参数都是List(ad类型 [3,4,21但对于目标子句Reverse(y,[2,4,3]), 一元构造子Lst本身不是一个类型,但程序中 系统会因为回溯的无法停止而陷入无限循环 出现的所有基类和构造子都必须说明.没有构造子, Poog引入了附加的控制语句cut(I)以及重新 则所有类型的集合只是所有基类的集合.如果有一 调整定义子句和子目标的次序等方法来试图解决此 1994-2009 China Academic Journal Electronie Publishing House.All rights reserved.http://www.cnki.net
的可读性 ,便于程序员设计程序与开展合作交流 ;而 且编译器也可根据类型系统说明的信息产生效率更 高的代码 ,同时有助于捕获程序设计中的错误 ,大大 增加了程序设计的正确性 [ 2 ] . Prolog以 Horn子句逻辑为基础 ,是一种无类型 程序设计语言. 这种特点虽然简化了它的语言、编译 和执行过程 ,但却大大降低了可表达性能力 ,使程序 员设计的程序不易阅读和理解. 在 Go¨del语言中 ,由 于引入了类型 ,通常语言说明以关键字 BASE、CON2 STRUCTOR、CONSTANT、FUNCTION、PROPOSITION 等开头 ,这些说明定义了程序中出现的各种数据类 型和符号 ,有助于程序的阅读和理解. 例 1 Go¨del语言的类型说明示例 BASE Day, Person. % 基类说明 CONSTRUCTOR L ist/1. % 类型构造算子 CONSTANT N il: L ist( a ). Monday, Tuesday: Day. Fred,B ill: Person. % 常量说明 FUNCTION Cons: a 3 L ist( a ) →L ist( a ). % 函数说明 PRED ICATE Append: List( a ) 3 List( a ) 3 List( a ). % 谓词说明 如例 1所示 ,程序中的语言说明可以由以下几 部分组成 : 1)以关键字 BASE开头的语言说明给出了多态 多类语言程序的基本类型 ,称为基类. 2) CONSTRUCTOR说明了用户命名的含有 n元 类型参数的结构类型 (称为构造子 ) ,可以从一些类 型构造产生新的类型. 3) CONSTANT说明定义了常量. 4) FUNCTION和 PRED ICATE分别说明了函数 和谓词类型 ,对应 Go¨del语言中的项和原子. Go¨del 语言的函数和谓词都是基于类型的 ,函数和谓词的 每一个参数都需要进行类型说明. 在上面的示例中 , Day和 Person是基类 , CON2 STANT说明 N il是 L ist( a )类型的一个常量 ,Mon2 day、Tuesday分别是 Day类型的常量 , Fred、B ill分别 是 Person类型的常量. FUNCTION说明了 Cons是一 个二元函数 ,它把二元组 (第 1个参数是 a类型 ,第 2个参数是 L ist( a )类型 )映射到一个 List ( a )类 型的元素. PRED ICATE说明了 Append是一个三元 谓词 ,每个参数都是 List ( a) 类型. 一元构造子 L ist本身不是一个类型 ,但程序中 出现的所有基类和构造子都必须说明. 没有构造子 , 则所有类型的集合只是所有基类的集合. 如果有一 个构造子被说明了 ,则类型的集合将把基类视为 “常量 ”,把构造子视为“函数 ”来构造获得函数类 型 , 这 样 就 可 以 构 造 诸 如 List ( Day )、 List(L ist(Day) )等可数无限的类型的集合. 例中 , a是一个类型变量 ,允许反映 Go¨del语言 的参数多态性 ,它可以替换任意一个可以构造的类 型. 一个类型是一个项 ,它可以如下构造 :将基类视 为“常量 ”,类型参数 (选取子 )视为“变量 ”,构造子 视为“函数 ”. 例如 ,对上述说明来说 ,所有类型的集 合将是 Day、Person、List(Day)、List(L ist(Day) )、a 、 List( a )等等. 基于参数多态性 ,这里的谓词 Append 能够对任何类型列表进行追加. Go¨del语言的类型系统是一个强类型系统 ,程 序中的每个项和它的类型必须进行语言说明. 尽管 变量的类型说明不做强制要求 ,但为了保证其类型 可由上下文推测出来 ,约定程序中有足够的信息可 被编译程序和推理机用于判定类型并保证程序的安 全执行 ,而不需要显式地给出变量的类型说明 [ 2 ] . Go¨del语言在引入类型后 ,显然大大提高了语 言的可表达性能力 ,使其程序拥有更好的说明性语 义. 并且类型系统的引入给 Go¨del语言的编译带来 了方便 ,提高了执行效率 ,也更容易实现程序的并行 执行 [ 3 ] . 2 控制机制的区别 控制机制主要针对语言的过程性语义. 在 Pro2 log语言中 ,针对其 Horn子句 ,采用 SLD反驳 —消解 法来推导出最后的结果. 这种方法无论从实际的操 作过程还是从理论的推导上都是严谨正确的 ,它也 是 Prolog语言说明性语义和过程性语义的桥梁. 例 2 设有 Prolog程序片段 1) Reverse ( [ ], [ ]). 2) Reverse ( [ H | T ] , Rev) ← Reverse ( T, TR ) ∧Append ( TR, [H ], Rev). 这里 ,Append ( X, Y, Z ) 谓词将列表 X和 Y按顺 序合并成新表 Z . 如该程序目标子句为 Append ( [ 1, 2 ], [ 3, 4 ], Z ) ,则 Z 的输出结果为 [ 1, 2, 3, 4 ]. Re2 verse ( X, Y) 谓词是将 X列表逆转得到新表 Y. 如果 目标子句为 Reverse ( [ 2, 4, 3 ], Y) , 容易得到 Y = [ 3, 4, 2 ]. 但对于目标子句 Reverse ( Y , [ 2, 4, 3 ]) , 系统会因为回溯的无法停止而陷入无限循环. Prolog引入了附加的控制语句 cut(! )以及重新 调整定义子句和子目标的次序等方法来试图解决此 ·164· 智 能 系 统 学 报 第 4卷
第2期 昌杰,等:逻辑程序设计语言Godel与Pobg的比较 ·165· 类问题.其中cut最重要的作用是,丢掉在它所出现 其执行唤醒,对Reverse(T,[2,4])进行操作.如此 的规则中从头部开始直到“!”之间所有子目标由于成 循环操作直到所有合一操作结束,将得Y值为[3 功而在数据库中作出的标记.使这些目标的再满足无 4.21. 法进行,从而防止回溯.它可以解决一些由于Poog 从例子可以看出,延迟不仅解决了因Poog控 最左文字优先规则而引起的的无限循环,例如: 制机制带来的无限制循环问题,而且还引入了并发 例3设有Probg程序片段 执行,可提高系统执行的效率 1)member(X,XlTJ)←4 Godelf的剪枝操作comm it类似于Probg中的 2)member(X.(Y T])--member(X.T). cut机制,但它是建立在并发语言的comm it机制之 m em ber(XY)谓词判断X是否为列表Y中的 上,具有更好的说明性语义.然而,Goàel的剪枝操 元素.在没有加“!”之前,执行目标子句member(X,作也会带来和pobg中cut一样的问题,如剪去了 1,2,3)时,X将在分别输出1,2,3后陷入死循环. 有效答案所在的分支等,但Godel语言通过增强对 引入“!”以后,X将在输出1以后停止执行.但是, 谓词的D可AY说明就能够很好地解决这个问题 若要求输出所有解,“!”在任何位置的引入都无法 对于上述程序,若没有对其增加D日AY说明, 解决此问题,即使改变子句和子目标的次序也无济 当执行目标语句member(X,[1,2,3])∧X=2 于事,同时该方法缺乏通用性」 时,第1个子目标在与子句1合一后得到X=1结 针对Polg语言控制机制存在的问题,Godeli语 束回溯,这个结果与子目标2相矛盾,从而无法得出 言对其控制机制进行了改进,引入DEAY延迟控 正确的结果.当对其增加如下说明: 制剪枝操作.程序员可以通过适当的DEAY延迟 DELAY member(X,/Y ]UNTL NON- 保证一个调用在被足够实例化后再推进,这样就避 VAR(X)ANONVAR(Y). 免了无法预料的失败,同时有助于程序员控制程序 对该目标子句,第1个子目标由于不满足条件 运行2) 而被挂起,直到第2个子目标执行将X实例化为2, 例4对应于同样的问题,Godeli语言采用的源 立即将子目标1唤醒.得到判断结果TRUE,表示X 程序如下: 是列表中元素. PRED CATE Reverse:List(a)*List(a ) 尽管剪枝会破坏程序的可读性和正确性,但合 DELAY Reverse(X.Y)UNTL 理的剪枝可以大大提高程序执行的效率,因此,剪枝 NONVAR(X)VNONVAR(Y). 在逻辑程序设计语言中仍具有重要意义.在Godel 1)Reverse([]]) 语言中,如果配合以强DHAY说明,更将大大减少 2)Reverse([HI TJ,Rev)+Reverse T.TR) 剪枝带来的负面作用,从而得到更加广泛的应用 AAppend(TR,[H J.Rev). 3模块化程序设计的作用 其中,DHAY延迟的语法形式为DELAY A tom UNTL Cond,.Aom为原子,Cond为条件集.这里, 模块化程序设计是大型软件系统开发的有效方 Cond为NONVAR(X)ANONVAR(Y).程序表示 法和技术之一.Po0g的设计没有引入模块化的设 在操作中只有当Reverse()内X、Y中任意一项被实 计方案,语言本身过于简单也使得它并不适用于大 例化,才能对Reverse()所对应的子句进行处理,否 型软件的设计与开发.随着计算机应用领域的不断 则,延迟将挂起对谓词Reverse()的调用,直到条件 深化,对软件的效率、可靠性、易维护的要求越来越 被满足 高,非模块化设计功能的Pobg很明显不符合现代 所以,当例2中同样的目标子句Reverse(Y, 软件工程的基本要求」 [2,4,3])被执行时,首先,目标子句满足D日AY条 Godeli语言的定位考虑了大型智能软件的开 件,在与子句1匹配失败后,与子句二合一,生成2发,引入了模块系统.每个模块相当于一个构件,程 个子目标Reverse(I,TR)和Append(TR,[HI,序员将各个不同的构件进行组装设计可形成更大的 Rv).由于子目标1不满足延迟条件被挂起,子目程序,而每个构件尽量保持各自的独立性.模块的执 标2被执行,Append()谓词将TR和H分别实例化 行细节封装在模块内部,对其他构件保持透明 为[2,4和3此时,子日标1延迟条件满足,立刻将 这样的设计使Godeli语言融合了现代软件工程的思 1994-2009 China Academic Journal Electronic Publishing House.All rights reserved.http://www.cnki.net
类问题. 其中 cut最重要的作用是 ,丢掉在它所出现 的规则中从头部开始直到“!”之间所有子目标由于成 功而在数据库中作出的标记. 使这些目标的再满足无 法进行 ,从而防止回溯. 它可以解决一些由于 Prolog 最左文字优先规则而引起的的无限循环. 例如 : 例 3 设有 Prolog程序片段 1) member( X, [X | T ]) ← !. 2) member( X, [ Y | T ] ) ← member( X, T) . member( X, Y) 谓词判断 X 是否为列表 Y中的 元素. 在没有加“! ”之前 ,执行目标子句 member( X, [1, 2, 3 ]) 时 , X将在分别输出 1, 2, 3后陷入死循环. 引入“! ”以后 , X 将在输出 1以后停止执行. 但是 , 若要求输出所有解 ,“! ”在任何位置的引入都无法 解决此问题 ,即使改变子句和子目标的次序也无济 于事 ,同时该方法缺乏通用性. 针对 Prolog语言控制机制存在的问题 , Go¨del语 言对其控制机制进行了改进 ,引入 DELAY延迟控 制剪枝操作. 程序员可以通过适当的 DELAY延迟 保证一个调用在被足够实例化后再推进 ,这样就避 免了无法预料的失败 ,同时有助于程序员控制程序 运行 [ 2 ] . 例 4 对应于同样的问题 , Go¨del语言采用的源 程序如下 : PRED ICATE Reverse: List( a ) 3 L ist( a ). DELAY Reverse ( X, Y ) UNTIL NONVAR ( X ) ∨NONVAR ( Y ). 1) Reverse ( [ ], [ ]). 2) Reverse ( [ H | T ], R ev ) ← Reverse ( T, TR ) ∧Append ( TR, [H ], R ev ). 其中 , DELAY延迟的语法形式为 DELAY A tom UNTIL Cond, A tom 为原子 , Cond为条件集. 这里 , Cond为 NONVAR ( X ) ∧NONVAR ( Y ). 程序表示 在操作中只有当 Reverse ( )内 X、Y中任意一项被实 例化 ,才能对 Reverse ( )所对应的子句进行处理 ,否 则 ,延迟将挂起对谓词 Reverse ( )的调用 ,直到条件 被满足. 所以 ,当例 2中同样的目标子句 Reverse ( Y , [ 2, 4, 3 ])被执行时 ,首先 ,目标子句满足 DELAY条 件 ,在与子句 1匹配失败后 ,与子句二合一 ,生成 2 个子目标 Reverse ( T, TR ) 和 Append ( TR, [H ], Rev). 由于子目标 1不满足延迟条件被挂起 ,子目 标 2被执行 , Append ( )谓词将 TR 和 H分别实例化 为 [ 2, 4 ]和 3. 此时 ,子目标 1延迟条件满足 ,立刻将 其执行唤醒 ,对 Reverse ( T , [ 2, 4 ])进行操作. 如此 循环操作直到所有合一操作结束 ,将得 Y值为 [ 3, 4, 2 ]. 从例子可以看出 ,延迟不仅解决了因 Prolog控 制机制带来的无限制循环问题 ,而且还引入了并发 执行 ,可提高系统执行的效率. Go¨del的剪枝操作 comm it类似于 Prolog中的 cut机制 ,但它是建立在并发语言的 comm it机制之 上 ,具有更好的说明性语义. 然而 , Go¨del的剪枝操 作也会带来和 p rolog中 cut一样的问题 ,如剪去了 有效答案所在的分支等 ,但 Go¨del语言通过增强对 谓词的 DELAY说明就能够很好地解决这个问题. 对于上述程序 ,若没有对其增加 DELAY说明 , 当执行目标语句 member ( X , [ 1, 2, 3 ]) ∧ X = 2 时 ,第 1个子目标在与子句 1合一后得到 X = 1结 束回溯. 这个结果与子目标 2相矛盾 ,从而无法得出 正确的结果. 当对其增加如下说明 : DELAY member ( X, [ Y | _ ]) UNTIL NON2 VAR ( X ) ∧NONVAR ( Y ). 对该目标子句 ,第 1个子目标由于不满足条件 而被挂起 ,直到第 2个子目标执行将 X实例化为 2, 立即将子目标 1唤醒. 得到判断结果 TRUE,表示 X 是列表中元素. 尽管剪枝会破坏程序的可读性和正确性 ,但合 理的剪枝可以大大提高程序执行的效率 ,因此 ,剪枝 在逻辑程序设计语言中仍具有重要意义. 在 Go¨del 语言中 ,如果配合以强 DELAY说明 ,更将大大减少 剪枝带来的负面作用 ,从而得到更加广泛的应用. 3 模块化程序设计的作用 模块化程序设计是大型软件系统开发的有效方 法和技术之一. Prolog的设计没有引入模块化的设 计方案 ,语言本身过于简单也使得它并不适用于大 型软件的设计与开发. 随着计算机应用领域的不断 深化 ,对软件的效率、可靠性、易维护的要求越来越 高 ,非模块化设计功能的 Prolog很明显不符合现代 软件工程的基本要求. Go¨del语言的定位考虑了大型智能软件的开 发 ,引入了模块系统. 每个模块相当于一个构件 ,程 序员将各个不同的构件进行组装设计可形成更大的 程序 ,而每个构件尽量保持各自的独立性. 模块的执 行细节封装在模块内部 ,对其他构件保持透明 [ 4 ] . 这样的设计使 Go¨del语言融合了现代软件工程的思 第 2期 昌 杰 ,等 :逻辑程序设计语言 Go¨del与 Prolog的比较 ·165·
·166 智能系统学报 第4卷 想方法,更易于反映现代软件的设计理念。 Godeli语言在描述计算时不仅结构清晰,可读性好 例5 Godeli语言模块系统的构成实例: 适合开发大型软件系统:而且通过引入类型系统实 EXPORT M5 现了可支持抽象数据类型程序设计,为支持面向对 MPORT Lists 象程序设计奠定了基础 BASE Day,Person 4 Monday,Tuesday,Wednesday,Thursday, 元程序设计及其应用 CONSTANT Friday,Saturday,Sunday:Day. 所谓元程序是指那些将其他程序包括自身作为 PRED CATE Append:List (a)*List (a)* 数据进行处理,无需考虑其源程序编程语言特性的 List(a)Append3:List(a)*List(a)* 程序.元程序的重要性主要表现在其大范围的应用 List(a)List(a). 上,如编译器、解释器、程序分析器和程序转换器等 LOCAL M5 另外,当逻辑程序被用于人工智能时通常需要形式 Append (Nil,X.X )Append (Cons (U. 化的知识表示,这些知识可用逻辑程序来表示,元程 X).Y,Cons (U.Z))-Append (X. 序可被视为元推理器,根据这些知识进行推断1 Y.Z). 元程序中如何表示目标程序是元程序中最重要 Append3 (X.Y.Z.U)+-Append X.Y. 的问题.元程序的表示方法主要有2种:基本表示和 W)&Append (W.Z.U). 非基本表示.前者将任一表达式表示为基本表达式, MODULE M6 后者除了将变量用相应的元级变量表示以外,非变 MPORT M5. 量标识符在元程序中表示为对应的常量和函数 PRED CA TE Member2:aa List(a). Pobg采用非基本表示方法】 Member2(X,y,Z)←Append(-,[X 例6设有Pobg程序: 1-1Y1-1Z) 1)member(X.T). 模块M5包含一个输出部分EXPORT和本地部 分LOCAL,其中BASE、CONSTANT和PRED CATE 2)menber(X,[H ])-member(X.T). 若用Poog元程序之一的ove标准解释器可 己在类型系统中介绍,这里重点讨论模块与模块之 表示为 间的连接以及内部的关系.在模块M5中,引入了 Lsts模块,它是处理表结构的系统模块,通过这个 1)solve(member(X,]) 模块,可以执行谓词Append3,它的参数类型是表类 2)solve (member (X.[H I T]))- 型.M6模块引入了前面的自定义模块M5,它除了 clause(member(X.H T1),member (X.T)) 继承Lists模块以外,还使用了M5模块中的Ap solve(member(X,T)). pend3来处理Mem ber2谓词.其中,Append谓词用 当执行sove(X,[1,2,3])时,可以分别得到 于将第1个参数表和第2个参数表合并成新表,并 X=1,2,3.但是,这种非基本表示会在执行过程中 且第1个表在第2个之前.Append.3定义了3个表 由于元级变量的绑定带来一些非说明性语义问题, 的合并操作.在模块M6定义的谓词Mem ber2.中调 例如,当目标子句为Var(X)memberl(X,[l,2, 用了M5中Append3.当且仅当X和Y是列表Z的元 3]),其中元程序子句Var(X)用来判断X是否是 素且X在Y的前面Member2为真.如当询问Mem 自由变量,可以分别得到结果X=1,2,3但是,在执 ber2(Friday,Monday,Thursday,Friday,Monday ] 行目标子句memberl(X,[1,2,3])Var(X)时,却 时,该程序将返回真。 由于X被实例化为1,而使得Var(X)执行失败 同样的程序M6,若用Poog编写,则除了编写 为了解决此问题,Godel采用元程序的另一种表 谓词mmbe2(),还必须重新编写谓词Append3(), 示方法,即基本表示.基本表示的主要特点是将目标 增加了程序语言编写的重复性,结构上也不如 语言表示为元语言中的基本项.上述程序可表示为 Godel语言写的程序 1)if (Aom (member,var (0),Tem (cons, 随着应用的不断深化,各类软件日趋复杂,软件 var(0),var(1)]])true). 生命周期中对开发效率、可靠性、易维护性、易管理 2)if (Atom (member,var (0),Tem cons, 等方面提出了更高的要求.通过引入模块化系统, var(2),var (1)]])Atom (member,var (0), 1994-2009 China Academic Journal Electronic Publishing House.All rights reserved.http://www.cnki.net
想方法 ,更易于反映现代软件的设计理念. 例 5 Go¨del语言模块系统的构成实例 : EXPORT M5. IMPORT Lists. BASE Day, Person. CONSTANT Monday, Tuesday, W ednesday, Thursday, Friday, Saturday, Sunday: Day; PRED ICATE Append: List ( a ) 3 List ( a ) 3 List( a) ; Append3: List ( a ) 3 List( a) 3 List( a ) 3 List( a ). LOCAL M5. Append (N il, X, X ). Append (Cons ( U, X) , Y , Cons ( U, Z ) ) ← Append ( X, Y, Z ). Append3 ( X, Y, Z, U ) ← Append ( X, Y, W ) & Append ( W , Z, U ). MODULE M6. IMPORT M5. PRED ICATE Member2: a 3 a 3 List( a ). Member2 ( X, Y, Z ) ← Append3 ( _, [ X | _ ], [ Y | _ ], Z ). 模块 M5包含一个输出部分 EXPORT和本地部 分 LOCAL,其中 BASE、CONSTANT和 PRED ICATE 已在类型系统中介绍 ,这里重点讨论模块与模块之 间的连接以及内部的关系. 在模块 M5中 ,引入了 Lists模块 ,它是处理表结构的系统模块 ,通过这个 模块 ,可以执行谓词 Append3,它的参数类型是表类 型. M6模块引入了前面的自定义模块 M5,它除了 继承 L ists模块以外 ,还使用了 M5 模块中的 Ap2 pend3来处理 Member2谓词. 其中 , Append谓词用 于将第 1个参数表和第 2个参数表合并成新表 ,并 且第 1个表在第 2个之前. Append3定义了 3个表 的合并操作. 在模块 M6定义的谓词 Member2中调 用了 M5中 Append3. 当且仅当 X和 Y是列表 Z的元 素且 X在 Y的前面 Member2 为真. 如当询问 Mem2 ber2 (Friday, Monday, [ Thursday, Friday, Monday ]) 时 ,该程序将返回真. 同样的程序 M6,若用 Prolog编写 ,则除了编写 谓词 member2 () ,还必须重新编写谓词 Append3 () , 增加了程序语言编写的重复性 , 结构上也不如 Go¨del语言写的程序. 随着应用的不断深化 ,各类软件日趋复杂 ,软件 生命周期中对开发效率、可靠性、易维护性、易管理 等方面提出了更高的要求. 通过引入模块化系统 , Go¨del语言在描述计算时不仅结构清晰 ,可读性好 , 适合开发大型软件系统 ;而且通过引入类型系统实 现了可支持抽象数据类型程序设计 ,为支持面向对 象程序设计奠定了基础. 4 元程序设计及其应用 所谓元程序是指那些将其他程序包括自身作为 数据进行处理 ,无需考虑其源程序编程语言特性的 程序. 元程序的重要性主要表现在其大范围的应用 上 ,如编译器、解释器、程序分析器和程序转换器等. 另外 ,当逻辑程序被用于人工智能时通常需要形式 化的知识表示 ,这些知识可用逻辑程序来表示 ,元程 序可被视为元推理器 ,根据这些知识进行推断 [ 5 ] . 元程序中如何表示目标程序是元程序中最重要 的问题. 元程序的表示方法主要有 2种 :基本表示和 非基本表示. 前者将任一表达式表示为基本表达式 , 后者除了将变量用相应的元级变量表示以外 ,非变 量标识符在元程序中表示为对应的常量和函数. Prolog采用非基本表示方法. 例 6 设有 Prolog程序 : 1) member( X, [X | T ] ). 2) member( X, [H | T ] ) ←member( X, T ). 若用 Prolog元程序之一的 solve标准解释器可 表示为 1) solve (member( X, [X | T ] ). 2 ) solve ( member ( X, [H | T ] ) ) ← clause (member(X, [H | T ] ) , member ( X, T ) ) solve (member(X , T ) ). 当执行 solve ( X , [ 1, 2, 3 ])时 ,可以分别得到 X = 1, 2, 3. 但是 ,这种非基本表示会在执行过程中 由于元级变量的绑定带来一些非说明性语义问题. 例如 ,当目标子句为 Var ( X ) member1 ( X , [ 1, 2, 3 ]) ,其中元程序子句 Var( X )用来判断 X 是否是 自由变量 ,可以分别得到结果 X = 1, 2, 3. 但是 ,在执 行目标子句 member1 ( X , [ 1, 2, 3 ]) Var( X )时 ,却 由于 X被实例化为 1,而使得 Var( X )执行失败. 为了解决此问题 , Go¨del采用元程序的另一种表 示方法 ,即基本表示. 基本表示的主要特点是将目标 语言表示为元语言中的基本项.上述程序可表示为 1) if (A tom (member, [ var ( 0 ) , Term ( cons, [ var(0) , var(1) ]) ]) , true). 2) if (A tom (member, [ var ( 0 ) , Term ( cons, [ var(2) , var ( 1 ) ]) ]) , A tom (member, [ var ( 0 ) , ·166· 智 能 系 统 学 报 第 4卷
第2期 昌杰,等:逻辑程序设计语言Godel与Pobg的比较 167· var(1)])) 示.该谓词表示将P程序引入的S模块中的F语句 其中:语句H-B表示为if(H,B),谓词mm- 删除,接着将整个修改后的程序保存为Q.显然, ber(X,y)表示为Aom(member,,[X,y]),表项 DeleteStatement(P,S,F,g)的引入,可视为改变 [XlY表示为Tem(cons,[X,Y]),并且var(0)、 Godeli语言程序控制流程的一种元级控制策略.并 var(1)、var(2)分别代表上述元程序中的3个变量 且配合模块化程序设计技术,具有改变源程序的能 X、T、H.在对于目标子句memberl(X,[1,2,3]) 力,并仍然保持了良好的说明性语义 Var(X)的执行过程中,由于基本表示不会对元变 对于目标Appenda([1,2],[3,4],Z),返回结 量进行值的绑定,因而不会因为子目标顺序的颠倒 果Z=[1,2,3,4],同时,该目标的执行还将程序P 而导致不同的结果 中的L ists模块的Append语句删除,修改后的程序 在动态元程序方面,元程序的设计主要有3种 仍表示为P,这样使得模块Lists中不含有谓词Ap- 方法:使用预定义模块、更新原程序和转换合成元程 pend,即别的用户无法再进行Append调用 序[).尽管Pobg采用了元程序的设计方法,但由于 这种处理元程序设计的方法除了采用基本表示 其没有采用模块化设计且不提供增加删除元语句的 外,还将修改后的程序另外保存,所以并没有破坏程 功能.所以,Pobg在结构上并不支持动态的元程序 序的说明性语义.以后,配合多态多类的变量设计 设计,而仅通过子句中参数值的改变而影响程序的 这种元程序设计技术在实现各模块(构件)重用和 控制流程,达到元程序设计的目的.为了解决此问 程序安全方面将发挥很大的作用,并在软件开发中 题,Poog引入cut对Poog运行机制进行控制,试 融入和体现软件重用的思想 图实现动态元程序设计的目标,但该语句并未从根 尽管基本表示的表示结果复杂,元程序设计需要 本上改变程序本身,所以仍然具有很大的局限性」 更多的程序代码,并且执行效率相对较低,但却能表 尽管Pobg语言在后期引入了若千语句可以对 达更复杂的程序设计思想,程序设计更符合人的思维 元程序数据库进行修改,例如retract()删除语句. 方式.而Godeli语言支持抽象数据类型机制,并在其 但retract()语句修改了正在执行的程序,而且删除 基础上提供了大量的操作,大大提高了程序的运行效 效果在回溯过程中是不可逆的,很明显它也不具有 率,可弥补了其基本表示的不足.显然,在元程序设计 说明性的语义 方面,Godeli语言比Probgl取得了更大的进步】 Godeli语言为了满足动态元程序设计的要求, 除了采用模块化程序设计,还提供了一系列添加删 5输入输出部分 除程序的元语言子句 任何程序设计语言都需要考虑输入输出部分, 例7设有Gode程序: 逻辑程序设计语言也一样.在目前己经出现的逻辑 MODULE M1. 程序设计语言系统中,输入输出语句并不是语言本 MPORT Lists,Programs 身固有的语言成分,而是根据用户的需要在系统的 PRED CA TE Appenda:L ist (a)List a ) 实现过程中添加的.Po0g语言中,对于输入输出 List(a ) 的设计一般是增加一些专门用于输入输出的预定 Appenda(X.Y.Z 义专用谓词,这种方法简单、易行.显然,Godeli语言 Append (Y.Y.Z)A 也可以遵循这样一种方式解决输入输出问题.然 DeleteStatement(P,Lists,Append,P) 而,还应该看到,由于引入了模块化技术,Godel语 模块M1引入了Lists和Program s模块,L ists模 言可以采用模块化设计方法,将输入输出谓词限定 块中包括了谓词Append(X,y,Z),表示将列表元 在一个最小的程序片段中,即对各种输入输出数据 素X和Y合并成新表Z例如,目标子句为 通过专门的输入输出模块进行处理,可以更好地解 Append([1,2],[3,4],Z),可得Z=[1,2,3,4] 决输入输出问题 Progra s模块提供了动态元程序设计所需要的谓词 可见,引入了模块化系统以后,输入输出被当 DeleteStatement(P,S,F,Q),其中:P、Q分别为一个 作一个单独的模块被调用和处理,尽可能降低输入/ 程序的表示,S是这个程序中一个打开的用户模块 输出模块在整个说明性程序中所占的比例,大大提 的名字,F是出现在这个模块中的一条语句的表 高了Godeli语言的说明性语义,使得程序的执行更 C1994-2009 China Academic Journal Electronic Publishing House.All rights reserved.http://www.cnki.net
var(1) ]) ) 其中 :语句 H ←B 表示为 if (H, B ) ,谓词 mem2 ber( X, Y )表示为 A tom (member, [ X, Y ]) ,表项 [ X | Y ]表示为 Term ( cons, [ X, Y ]) ,并且 var(0)、 var(1)、var(2)分别代表上述元程序中的 3个变量 X、T、H . 在对于目标子句 member1 ( X , [ 1, 2, 3 ]) Var( X )的执行过程中 ,由于基本表示不会对元变 量进行值的绑定 ,因而不会因为子目标顺序的颠倒 而导致不同的结果. 在动态元程序方面 ,元程序的设计主要有 3种 方法 :使用预定义模块、更新原程序和转换合成元程 序 [ 6 ] . 尽管 Prolog采用了元程序的设计方法 ,但由于 其没有采用模块化设计且不提供增加删除元语句的 功能. 所以 , Prolog在结构上并不支持动态的元程序 设计 ,而仅通过子句中参数值的改变而影响程序的 控制流程 ,达到元程序设计的目的. 为了解决此问 题 , Prolog引入 cut对 Prolog运行机制进行控制 ,试 图实现动态元程序设计的目标 ,但该语句并未从根 本上改变程序本身 ,所以仍然具有很大的局限性. 尽管 Prolog语言在后期引入了若干语句可以对 元程序数据库进行修改 ,例如 retract( ) 删除语句. 但 retract() 语句修改了正在执行的程序 ,而且删除 效果在回溯过程中是不可逆的 ,很明显它也不具有 说明性的语义. Go¨del语言为了满足动态元程序设计的要求 , 除了采用模块化程序设计 ,还提供了一系列添加删 除程序的元语言子句. 例 7 设有 Go¨del程序 : MODULE M1. IMPORT Lists, Program s. PRED ICATE Appenda: List ( a ) 3 L ist ( a ) 3 List( a ). Appenda ( X, Y, Z ) ← Append (X, Y, Z ) ∧ DeleteStatement( P,Lists,Append, P) 模块 M1引入了 Lists和 Program s模块 , L ists模 块中包括了谓词 Append ( X, Y, Z ) ,表示将列表元 素 X 和 Y 合 并 成 新 表 Z. 例 如 , 目 标 子 句 为 Append ( [ 1, 2 ], [ 3, 4 ], Z ) , 可得 Z = [ 1, 2, 3, 4 ]. Program s模块提供了动态元程序设计所需要的谓词 DeleteStatement( P, S, F, Q ) ,其中 : P、Q 分别为一个 程序的表示 , S 是这个程序中一个打开的用户模块 的名字 , F 是出现在这个模块中的一条语句的表 示. 该谓词表示将 P程序引入的 S模块中的 F语句 删除 ,接着将整个修改后的程序保存为 Q . 显然 , DeleteStatement ( P, S, F, Q ) 的引入 , 可视为 改变 Go¨del语言程序控制流程的一种元级控制策略. 并 且配合模块化程序设计技术 ,具有改变源程序的能 力 ,并仍然保持了良好的说明性语义. 对于目标 Appenda ( [ 1, 2 ], [ 3, 4 ], Z ) ,返回结 果 Z = [ 1, 2, 3, 4 ],同时 ,该目标的执行还将程序 P 中的 Lists模块的 Append语句删除 ,修改后的程序 仍表示为 P . 这样使得模块 Lists中不含有谓词 Ap2 pend,即别的用户无法再进行 Append调用. 这种处理元程序设计的方法除了采用基本表示 外 ,还将修改后的程序另外保存 ,所以并没有破坏程 序的说明性语义. 以后 ,配合多态多类的变量设计 , 这种元程序设计技术在实现各模块 (构件 )重用和 程序安全方面将发挥很大的作用 ,并在软件开发中 融入和体现软件重用的思想. 尽管基本表示的表示结果复杂 ,元程序设计需要 更多的程序代码 ,并且执行效率相对较低 ,但却能表 达更复杂的程序设计思想 ,程序设计更符合人的思维 方式.而 Go¨del语言支持抽象数据类型机制 ,并在其 基础上提供了大量的操作 ,大大提高了程序的运行效 率 ,可弥补了其基本表示的不足. 显然 ,在元程序设计 方面 , Go¨del语言比 Prolog取得了更大的进步. 5 输入 /输出部分 任何程序设计语言都需要考虑输入 /输出部分 , 逻辑程序设计语言也一样. 在目前已经出现的逻辑 程序设计语言系统中 ,输入 /输出语句并不是语言本 身固有的语言成分 ,而是根据用户的需要在系统的 实现过程中添加的. Prolog语言中 ,对于输入 /输出 的设计一般是增加一些专门用于输入 /输出的预定 义专用谓词 ,这种方法简单、易行. 显然 , Go¨del语言 也可以遵循这样一种方式解决输入 /输出问题. 然 而 ,还应该看到 ,由于引入了模块化技术 , Go¨del语 言可以采用模块化设计方法 ,将输入 /输出谓词限定 在一个最小的程序片段中 ,即对各种输入 /输出数据 通过专门的输入 /输出模块进行处理 ,可以更好地解 决输入 /输出问题. 可见 ,引入了模块化系统以后 ,输入 /输出被当 作一个单独的模块被调用和处理 ,尽可能降低输入 / 输出模块在整个说明性程序中所占的比例 ,大大提 高了 Go¨del语言的说明性语义 ,使得程序的执行更 第 2期 昌 杰 ,等 :逻辑程序设计语言 Go¨del与 Prolog的比较 ·167·
·168· 智能系统学报 第4卷 简单、直观」 法的支持J1.计算机时代,2006(11):13 L I Songbin,ZHAO Zhizhuo,L I Huigi The support of Godel 6结论 language for modem sofware engineering methods[J].Com- Pobg是当今应用最为广泛的人工智能语言. puter Era,2006(11):1-3 然而,它的无类型较弱的说明性语义以及不支持动 [5王啸澜,赵致琢,李慧琪.Pobg语言与Godeli语言中元 程序设计方法的研究[」]厦门大学学报:自然科学版, 态元程序设计限制了它的继续发展和深入应用.之 2005,44(6):247-250 后,在其基础上发展的一个基于多态多类一阶逻辑 WANG Xiaolan,ZHAO Zhizhuo,LI Huiqi Research on 的程序设计语言Godel,,融合了模块化程序设计、抽 Metaprogram ing in Godel language and Pobg Inguage 象数据类型、元程序设计、延迟计算和剪枝操作等程 [J].Joumal of Xiamen University:Natural Science,2005, 序设计技术,具有以下特点: 44(6):247-250 1)采用基本表示和强类型系统,具有更好的说 [6]H LL PM,LLOYD J W.Analysis of metapograms[C]// 明性语义: Meta-programm ing in Logic Programm ing Massachusetts 2)支持模块化程序设计和抽象数据类型,使得 MIT Press,.1989:23-52 大型软件系统的实现成为可能; [7]GUNTER C A.Semantics of programm ing languages:struc- 3)动态元程序设计让程序的执行更加灵活多 tures and techniques,foundation of computer[M ]Massa- chusetts:M IT Press,1992:20-40 变,可支持许多更精巧的程序设计,表达一些更复杂 [8 JM IICHELL J C Concepts in programm ing languages[M ] 的程序设计思想; UK:Cambridge Univ Press,2003:4-15. 4)延迟计算和剪枝操作的引入,完善了程序执 作者简介: 行控制机制,既提高了执行效率,也使得程序的输出 昌杰,1983年生,男,硕士研究 结果更加精确,并保持程序的说明性语义。 生,主要研究方向为逻辑程序设计语言 随着这些技术的进一步应用和完善,丰富了逻 Godel及其程序设计环境. 辑程序设计语言和逻辑程序设计的内涵⑧】,使得 Godeli语言的应用范围更加广泛,程序执行的效率 和灵活性也大大提高.相信随着研究的不断深入, Godeli语言将会对说明性逻辑程序设计产生深远的 影响。 赵致琢,男,1957年生,教授,硕士 生导师,主要研究方向为计算模型与分 参考文献: 布式基础算法、软件开发方法学、计算 机科学教育研究.先后获得2000年福 [1浏椿年,曹德和.PROLOG语言,它的应用与实现M]北 建省优秀教学成果奖一等奖、2001年国 京:科学出版社,1990:6494 家级优秀教学成果奖二等奖.发表学术 [2]H LL PM,LLOYD J W.The Godel programm ing language 论文多篇,出版专著2部. [M ]Massachusetts M IT Press,1994:3-23. 李慧琪,女,1973年生,博士研究 [3正炳波,赵致琢,晏松.Godeli语言类型系统[J]计算 生,主要研究方向为逻辑程序设计语言 机工程与设计,2005,26(12):3432-3435 Godel及其程序设计环境. WANG B ingbo,ZHAO Zhizhuo,YAN Song Type system in programm ing language Godel[J ]Computer Engineering and Design,2005,26(12):3432-3435 「4李松斌,赵致琢,李慧琪.Godeli语言对现代软件工程方 1994-2009 China Academic Journal Electronic Publishing House.All rights reserved.http://www.cnki.net
简单、直观. 6 结 论 Prolog是当今应用最为广泛的人工智能语言. 然而 ,它的无类型、较弱的说明性语义以及不支持动 态元程序设计限制了它的继续发展和深入应用. 之 后 ,在其基础上发展的一个基于多态多类一阶逻辑 的程序设计语言 Go¨del,融合了模块化程序设计、抽 象数据类型、元程序设计、延迟计算和剪枝操作等程 序设计技术 ,具有以下特点 : 1)采用基本表示和强类型系统 ,具有更好的说 明性语义 [ 7 ] ; 2)支持模块化程序设计和抽象数据类型 ,使得 大型软件系统的实现成为可能 ; 3)动态元程序设计让程序的执行更加灵活多 变 ,可支持许多更精巧的程序设计 ,表达一些更复杂 的程序设计思想 ; 4)延迟计算和剪枝操作的引入 ,完善了程序执 行控制机制 ,既提高了执行效率 ,也使得程序的输出 结果更加精确 ,并保持程序的说明性语义. 随着这些技术的进一步应用和完善 ,丰富了逻 辑程序设计语言和逻辑程序设计的内涵 [ 8 ] ,使得 Go¨del语言的应用范围更加广泛 ,程序执行的效率 和灵活性也大大提高. 相信随着研究的不断深入 , Go¨del语言将会对说明性逻辑程序设计产生深远的 影响. 参考文献 : [ 1 ]刘椿年 ,曹德和. PROLOG语言 ,它的应用与实现 [M ]. 北 京 :科学出版社 , 1990: 64294. [ 2 ]H ILL P M, LLOYD J W. The Go¨del p rogramming language [M ]. Massachusetts:M IT Press, 1994: 3223. [ 3 ]王炳波 ,赵致琢 ,晏 松. Go¨del语言类型系统 [J ]. 计算 机工程与设计 , 2005, 26 (12) : 343223435. WANG Bingbo, ZHAO Zhizhuo, YAN Song. Type system in p rogramm ing language Go¨del[J ]. Computer Engineering and Design, 2005, 26 (12) : 343223435. [ 4 ]李松斌 ,赵致琢 ,李慧琪. Go¨del语言对现代软件工程方 法的支持 [J ]. 计算机时代 , 2006 (11) : 123. L I Songbin, ZHAO Zhizhuo, L I Huiqi. The support of Go¨del language formodern software engineering methods[J ]. Com2 puter Era, 2006 (11) : 123. [ 5 ]王啸澜 ,赵致琢 ,李慧琪. Prolog语言与 Go¨del语言中元 程序设计方法的研究 [J ]. 厦门大学学报 :自然科学版 , 2005, 44 (6) : 2472250. WANG Xiaolan, ZHAO Zhizhuo, L I Huiqi. Research on Meta2p rogramm ing in Go¨del language and Prolog lnguage [J ]. Journal of Xiamen University: Natural Science, 2005, 44 (6) : 2472250. [ 6 ]H ILL P M, LLOYD J W. Analysis of meta2p rogram s[ C ] / / Meta2p rogramm ing in Logic Programm ing. Massachusetts: M IT Press, 1989: 23252. [ 7 ] GUNTER C A . Semantics of p rogramm ing languages: struc2 tures and techniques, foundation of computer[M ]. Massa2 chusetts:M IT Press, 1992: 20240. [ 8 ]M ITCHELL J C. Concep ts in p rogramm ing languages[M ]. UK: Cambridge Univ Press, 2003: 4215. 作者简介 : 昌 杰 , 1983 年生 ,男 ,硕士研究 生 ,主要研究方向为逻辑程序设计语言 Go¨del及其程序设计环境. 赵致琢 ,男 , 1957年生 ,教授 ,硕士 生导师 ,主要研究方向为计算模型与分 布式基础算法、软件开发方法学、计算 机科学教育研究. 先后获得 2000年福 建省优秀教学成果奖一等奖、2001年国 家级优秀教学成果奖二等奖. 发表学术 论文多篇 ,出版专著 2部. 李慧琪 ,女 , 1973 年生 ,博士研究 生 ,主要研究方向为逻辑程序设计语言 Go¨del及其程序设计环境. ·168· 智 能 系 统 学 报 第 4卷