关于Prolog
Prolog(Programing in Logic)的第一个系统是1972年开发的。它是一种典型的逻辑型语言,其理论基础是一阶谓词逻辑,重点在于对象问的逻辑描述,因而又称描述性语言。编写的程序是由说明程序应达到目标的逻辑说明组成的,程序员只需说明达到程序目标的逻辑方法,而不必说明程序执行的步骤,所以又有人把Prolog称为面向目标的语言。Prolog程序设计不是描述计算机“如何做”,而是描述计算机要“做什么”,至于如何做,则由Prolog语言自己完成。这说明Prolog语言在向自动求解方面迈进了一大步。Prolog的基本机制是匹配、递归定义、自动回溯和控制回溯。程序接近于自然语言、文法简捷、逻辑性强、易写易读、便于学习使用、易于正确性证明。
日本在开展第五代计算机计划时,曾经把Prolog语言作为核心语言使用。目前Prolog语言已广泛应用于关系数据库、抽象问题求解、数理逻辑、符号处理、定理证明、自然语言理解、专家系统以及人工智能的许多领域。在国内流行的Prolog语言主要版本有:纯Prolog、Prolog II、Arity Prolog、Wisdom Pmlog、Micro Prolog、PDC(Turbo,Visual) Prolog、SWI Prolog、B-Prolog、Dec一10 Prolog、MP Pmlog、PDP一11 UNIX Prolog和Quintus Prolog等。
Turbo PrologTurbo Prolog由美国Prolog开发中心(Pmlog Development Center,PDC)1986年开发成功,Borland公司对外发行,其1.0、2.0和2.1版本取名为Turbo Pmlog,主要为IBM PC系列及其兼容微机研制的一种编译型Prolog系统,也可在MS—DOS环境下运行。
PDC Prolog1990年后,PDC推出新的版本,更名为PDC Prolog 3.0和3.2。它把运行环境扩展到OS/2操作系统,并且向全世界发行。它的主要特点是:
(1)速度快,内存要求小。编译及运行速度都很快,编译时采用累积的方式,把整个源代码编译成机器代码,可产生与Pascal、C语言非常的紧凑代码,编译中发现错误能自动回到编辑状态,指出出错位置,修改后原来已编译好的部分基本不动,效率大为提高。
(2)用户界面友好。集编辑、编译、链接、调试等功能为一体,按多窗口菜单和系统提示,边上机边学习,可方便快速地进行应用开发,能自动连接生成目标文件,同时能对源代码进行跟踪调试。
(3)内部谓词丰富独特,提供了强有力的外部数据库系统,用屏幕、窗口、颜色、声音、图形、绝对地址存取、数据端口等控制,编写出图文并茂的程序。
(4)具有强大的图形功能。支持与Turbo C和Turbo Pascal同样的图形功能。
(5)集成式、模块化的程序开发环境,可将多个程序模块联结成一个可执行的程序,能与C、Pascal、Fortran、汇编、dBASE III等语言实现自然和谐的联结,可与DOS交互。可产生能从其他语言调用Prolog的子程序,也可从Prolog中调用其他语言产生的子程序。
(6)提供了一个用PDC Prolog编写的Prolog解释起源代码。用户可以用它研究Prolog的内部机制,并创建自己的专用编程语言、推理机、专家系统外壳或程序接口。
Visual PrologVisual Prolog是基于Prolog语言的可视化集成开发环境,是PDC推出的基于Windows环境的智能化编程工具,也是一个可以制作界面的Prolog,已经推出版本4.x、5.X、6.X和7.x。它的基本Prolog语句同DOS下的Turbo Prolog相似,曾使用过Turbo Prolog的人很容易就能上手,原DOS下的Prolog源程序也很容易移植。这个Prolog版本需要对谓词以及数据进行声明,就像c语言一样。因此在使用的时候比较复杂,不过更加适合编制较大的程序。
Visual Prolog为编译型执行,运行速度比解释型Prolog快,源程序可编译为独立执行的可执行程序,也可发布为动态链接库供VB、VC、Delphi等调用,为开发者提供更灵活的组合开发方式。
Visual Prolog具有模式匹配、递归、回溯、对象机制、事实数据库和谓词库等强大功能。它包含构建大型应用程序所需要的一切特性:图形开发环境、编译器、连接器和调试器,支持模块化和面向对象程序设计,支持系统级编程、文件操作、字符串处理、位级运算、算术与逻辑运算,以及与其他编程语言的接口。1
基本语句Prolog语言只有3种基本语句:事实、规则和问题。与命令式编程语言相比,Prolog程序中的问题相当于主程序,规则相当于子程序,而其事实相当于数据。
事实事实用来说明问题中已知对象之间的性质和关系。
例如:likes(1ibai,book). /*喜欢(李白,书)*/
以上语句是一个名为like的关系,表示对象libai(李白)和book(书)之间有喜欢的关系。末尾“.”表示句子结束。以上语句对计算机来说没有真正的含义,完全可以用“ai(lb,shu).”来表达这个关系,只要自己清楚ai表示爱,lb表示李白,shu表示书就可以了。
规则规则用来描述事实之间的依赖关系,用来表示对象之间的因果关系、蕴含关系或对应关系。规则左边表示结论,右边表示条件。
例如:bird(X):一animal(X),has(X,feather)./*鸟(X):一动物(X),有(X,羽毛).*/
以上语句表示,凡是动物并且有羽毛,那么它就是鸟。“:一”表示“如果”(if)的意思,可用它来定义规则,它的左边是规则的结论,右边是规则的前提。“,”表示而且(and)的意思,用来分隔两个句子。
问题问题表示用户的询问,它是程序运行的目标,问题是程序执行的起点。问题可以写在程序内部,但是不能与事实及规则排在一起,它需要在程序中单独列出。问题也可以在程序运行时临时给出,运行Prolog程序后,就可以询问有关问题的答案了。
例如:?-student(libai). /* 李白是学生吗?*/2
特点Prolog语言的语法结构相当简单,但描述能力很强。例如,当事实和规则描述的是某一学科公理.那么问题就是待证的命题;当事实和规则描述的是某些数据和关系,那么问题就是数据查询语句;当事实和规则描述的是某些状态变化规律,那么问题就是目标状态。因此,Prolog语言是一种智能型程序设计语言。
Prolog程序没有特定的运行顺序,程序运行顺序完全按照数理逻辑推导(消解法)的方式进行,而不是由编程序的人决定。Prolog是一种描述型语言,用特定的方法描述一个问题,然后由计算机自动找到这个问题的答案。举个极端的例子.当建立好事实和规则后,只需要把某个问题告诉它.它就会自动查找答案。
Prolog程序中没有if、case、for这样的控制流程语句。通常情况下,程序员不需要了解程序的运行过程,只需要注重程序的描述是否全面。不过Prolog也提供了一些控制程序流程的方法,这些方法和其他语言中的方法有很大区别。
在Prolog程序巾,程序和数据高度统一,很难分清楚哪些是程序,哪些是数据。事实上,Prolog中所有东西都有相同的形式,也就是说数据就是程序,程序就是数据。例如,用c语言编写一个计算某个数学表达式的程序很简单(如:a=2+54);但是如果编写一个C程序.由用户输入表达式,由程序计算出表达式的值,这样的程序编制很困难。因为用户输入的是一段数据(字符串),如果想让C语言处理这个字符串,就需要多方面的技术,因为在C语言中,程序和数据是分开的。
Prolog具有智能数据库功能,它的工作原理与关系数据库基本相同,它是建立在关系数据库的基础上的.它与SQL数据库查询语言有很多相似之处。
递归是一种非常简洁的方式,它能够有效地解决许多难题。在Prolog程序语言中,递归功能得到了充分体现。2