该逻辑编程是使用逻辑电路,而不仅仅是数学函数控制的事实和规则如何设定的一种编程范式。
代替了精心设计的控制流来指示何时执行以及如何评估函数调用或其他指令,该程序的逻辑规则被编写为子句或逻辑谓词。
Prolog中逻辑编程的示例。来源:By Kuldeepsheoran1-屏幕截图,CC BY-SA 3.0,维基共享资源
通常在遗传和进化规划中使用的这种方法通常会告诉模型要实现的目标,而不是实现目标。
每个规则都包含标题和带有形式化逻辑的主体,而不是可执行的数学函数。例如,“并且为真(标题):如果C1,C2和C3为真(正文)。” 事实或结果的表达没有任何内容,例如“而且是真实的”。
但是,对于像Prolog这样的编程语言,也可以包括命令式编程来告诉模型如何解决某些问题。例如,“要求解Y,请添加C1,C2和C3。”
逻辑编程的特点
逻辑编程与其他现有编程策略有很大不同。建立对象之间的关系,而不是通过程序将指令提供给计算机。这样,计算机可以推理出这些关系,从而得出逻辑解决方案。
在逻辑程序中,主要有两套代码:事实和规则。将规则应用于事实,以获取有关环境的知识。
真理与逻辑推论
可以通过两个重要概念来解密逻辑程序:真相和逻辑推论。在程序符号的实现下,事实证明了程序中的计算是否正确。逻辑推论确定逻辑子句是否是程序的结果。
这些指令将始终被解释为逻辑语句和子句,其执行的结果是其包含的计算的逻辑结果。
一阶逻辑
它是命题逻辑的分支。从被称为域的局部世界角度考虑对象是真还是假。逻辑编程基于一阶逻辑的一般化。
该逻辑由语法和语义组成。语法是用于表达概念的形式语言。另一方面,一阶逻辑公式的语义表示如何确定任何公式的真实值。
该逻辑基于字母和一阶语言以及一组公理和推理规则。
子句形式
它是一阶逻辑的子集。它具有规范化的形式,其中语句由通用前缀或通用量词链定义,并且在子句中包含一组自由的量词。
当请求程序查询时,将考虑其标题可能重合的子句的主体。这与在逻辑中应用推理规则相同。
作为推论的步骤,选择两个子句,它们具有一个属性,其中一个包含析取X(正文字),另一个包含析取¬X(负文字)。这些折衷被称为互补。
从这两个初始子句中,使用除补全之外的所有文字构造一个新的可分辨子句。
人工智能
逻辑编程是一种用于使计算机演绎的方法,因为它对表示知识很有用。逻辑用于表示知识并进行推理。
用来表示知识的逻辑是从句形式。之所以使用它,是因为一阶逻辑已被很好地理解并且能够代表所有计算问题。
Prolog是一种基于逻辑编程思想的编程语言。Prolog的想法是使逻辑看起来像一种编程语言。
逻辑编程实例
例子1
-事实:鲁比是猫。
-规则:所有的猫都有牙齿。
-咨询:鲁比有牙齿吗?
-结论:是的。
可以将“所有的猫都有牙齿”规则应用于Ruby,因为存在一个事实,即“ Ruby是猫”。本示例未使用任何用于实际编程语言的语法编写。
例子2
可以看到该示例是用Prolog编写的,因为它是最流行的逻辑编程语言之一:
-女性(alissa)。
-男性(鲍比)。
-男性(卡洛斯)。
-女性(多丽丝)。
-son_of(多丽丝,卡洛斯)。
-son_of(carlos,bobby)。
-son_of(doris,alissa)。
-父亲(F,P):-男性(F),儿子(P,F)。
该程序变得难以阅读,因为Prolog与其他语言明显不同。任何类似于“女性(alissa)”的代码组件。这是事实。
一个规则是“ father_of(F,P):-男性(F),child_of(P,F)”。符号“:-”可以读作“如果是,则为真”。大写字母表示变量可以应用于任何对象,因此F可以代表carlos,doris,alissa或bobby。此代码可以翻译为:
-Alissa是位女士。
-鲍比是个男人。
-卡洛斯是个男人。
-多丽丝(Doris)是位女士。
-多丽丝(Doris)是卡洛斯(Carlos)的女儿。
-卡洛斯是鲍比的儿子。
-Doris是Alissa的女儿。
-如果F是男人并且P是F的儿子,则“ F是P的父亲”为真。
询问
假设您想咨询该程序以获取更多信息。您可以搜索询问以查找谁的父亲Bobby是谁:?-Father_of(bobby,X)。系统将指示以下答案:X = Carlos。
在这种情况下,将传递一个关系,其中其值之一是变量。Prolog所做的是将不同的对象应用于这种关系,直到其中一个在逻辑上是可靠的为止。
卡洛斯的唯一父亲是鲍比,鲍比是男性。这满足了规则“ father_of(F,P):-男性(F),son_of(P,F)”。当X等于“ carlos”时,逻辑是正确的。
其他咨询
可以对Prolog进行其他更常规的查询,这会导致系统生成多个结果:
-?-parent_of(父母,孩子)。
-父亲=鲍比
-孩子=卡洛斯(Carlos)
-父亲=卡洛斯
-孩子=多丽丝
如已经看到的,逻辑编程不需要为了获得关于艾丽莎或鲍比的信息就可以得到有关它们的知识。实际上,没有必要指出存在一个称为人的概念。
在大多数非逻辑编程语言中,必须先定义这些概念,然后才能编写处理有关人的信息的程序。
参考文献
- Deep AI(2020年)。逻辑编程。摘自:deepai.org。
- 维基百科(2020)。编程语言理论/逻辑编程。摘自:en.wikiversity.org。
- 伦敦帝国学院(2006)。逻辑编程。摘自:doc.ic.ac.uk。
- 尤佳怀(2020)。逻辑编程简介。艾伯塔大学。摘自:eng.ucy.ac.cy。
- C2 Wiki(2020年)。逻辑编程。摘自:wiki.c2.com。