逻辑编程是种编程典范,它设定答案须符合的规则来解决问题,而非设定步骤来解决问题。过程是事实+规则=结果。
要点逻辑编程的要点是将正规的逻辑风格带入计算机程序设计之中。数学家和哲学家发现逻辑是有效的理论分析工具。很多问题可以自然地表示成一个理论。说需要解答一个问题,通常与解答一个新的假设是否跟现有的理论无冲突等价。逻辑提供了一个证明问题是真还是假的方法。创建证明的方法是人所皆知的,故逻辑是解答问题的可靠方法。逻辑编程系统则自动化了这个程序。人工智能在逻辑编程的发展中发挥了重要的影响。
猴子和香蕉问题是逻辑编程社区的著名问题。电脑须自行找出令猴子接触香蕉的可行方法,取代程序员指定猴子接触香蕉的路径和方法。逻辑编程创建了描述一个问题里的世界的逻辑模型。逻辑编程的目标是对它的模型创建新的陈述。世界上知识不断澎涨。传统来说,我们会将一个问题陈述成单一的假设。逻辑编程的程序通过证明这个假设在模型里是否为真来解决问题。
一些经常用到逻辑编程工具的范畴:专家系统,程序从一个巨大的模型中产生一个建议或答案。自动化证明定理,程序产生一些新定理来扩充现有的理论。最常用的逻辑编程语言是Prolog,另外有较适用于大型方案的Mercury。1
历史早在二十世纪七十年代,罗伯特·科瓦尔斯基等人提出了逻辑可以作为程序设计语言的基本思想,把逻辑和程序这两个截然不同的概念协调统一为一个概念,于是诞生了逻辑程序设计。这也是早期自动定理证明和人工智能发展的自然结果。随后,逻辑程序设计得到了迅速发展,特别是基于一阶谓词的逻辑程序设计语言,将逻辑推理对应于计算,具有丰富的表达能力、非确定性等特点,在定理机器证明、关系数据库系统、程序验证、模块化程序设计和非单调推理等都有了广泛的应用。1
逻辑编程语言Prolog以处理一阶谓词演算为背景,由于其简单的文法、丰富的表达力和独特的非过程语言的特点,很适合用来表示人类的思维和推理规则,从而一问世就赢得了人工智能研究和应用开发者的广泛兴趣。尤其在西欧和日本,Prolog语言已推广应用于许多应用领域,如关系数据库、数理逻辑、抽象问题求解、自然语言理解和专家系统等。日本还在其于1979年提出的第五代计算机研究计划中把Prolog列为核心语言。
Prolog实际上就是一种基于逆向规则的演绎推理技术,只不过对规则和目标的表示有严格的限制.再加上演绎推理控制机制自身的简单性,难以适用于复杂的应用域。
Prolog语言的基本成分是Horn子句,表示为如下形式:∧ ∧ ∧ p;Prolog语言中,Horn子句以3种形式去分别表示逆向演绎推理中问题求解描述的3个部分:目标、规则和事实。目标表示为只有左部的Horn子句:∧ ∧ ∧ ;即在Prolog语言中,目标公式只限于表示为原子公式的合取,而不能是任意的文字与或形。规则表示为典型的Horn子句:∧ ∧ ∧ p这就是逆向演绎推理所使用的规范化B规则,只是规则左部限定为原子公式的合取,而非任意文字与或形。事实表示为事实元素的集合,每个事实元素表示为只有右部的Horn子句,即单一原子公式P。事实元素间隐含合取关系。只要用Prolog语言表示问题描述的这3个部分,支持Prolog语句的推理机制就会自动执行基于规则的逆向演绎推理,并最终给出解答。由于目标和规则的左部都限定为原子公式的合取,而这些原子公式又可激活多条规则(这些规则间隐含或关系)。所以,Prolog演绎推理过程建立的与或图具有与、或关系呈现逐层交替的局面。随着与或图的向下扩展,最终会形成(搜索到)一致解图,从而演绎推理成功;否则推理失败。把目标中包含的各原子公式视为子目标,每当由子目标激活的规则插入与或图时,规则左部的各原子公式又成为新的子目标,再用于激活新的规则;如此,随着规则的激活和新子目标的产生,与或图逐步扩展,直到子目标直接与事实元素(原子公式)匹配为止。2
特点Prolog语言的语法结构相当简单,但描述能力很强。例如,当事实和规则描述的是某一学科公理。那么问题就是待证的命题;当事实和规则描述的是某些数据和关系,那么问题就是数据查询语句;当事实和规则描述的是某些状态变化规律,那么问题就是目标状态。因此,Prolog语言是一种智能型程序设计语言。
Prolog程序没有特定的运行顺序,程序运行顺序完全按照数理逻辑推导(消解法)的方式进行.而不是由编程序的人决定。Prolog是一种描述型语言,用特定的方法描述一个问题,然后由计算机自动找到这个问题的答案。举个极端的例子:当建立好事实和规则后,只需要把某个问题告诉它,它就会自动查找答案。
Prolog程序中没有if、case、for这样的控制流程语句。通常情况下,程序员不需要了解程序的运行过程,只需要注重程序的描述是否全面。不过Prolog也提供了一些控制程序流程的方法,这些方法和其他语言中的方法有很大区别。2
本词条内容贡献者为:
尹维龙 - 副教授 - 哈尔滨工业大学