在本章中,我们将重点介绍逻辑编程以及它在人工智能中的作用。
我们已经知道逻辑是对正确推理原则的研究,或者简单地说就是研究什么是什么。 例如,如果两个陈述是真的,那么我们可以从中推断出任何第三个陈述。
概念
逻辑编程是两个字,逻辑和编程的组合。 逻辑编程是一种编程模式,其中问题通过程序语句表达为事实和规则,但在形式逻辑系统中。 就像面向对象,函数式,声明式和程序式等其他编程模式一样,它也是编程方法的一种特殊方式。
逻辑编程使用事实和规则来解决问题。 这就是为什么他们被称为逻辑编程的基石。 在逻辑编程中需要为每个程序指定一个目标。要理解在逻辑编程中如何解决问题,我们需要了解构建块 - 事实和规则 -
事实
实际上,每个逻辑程序都需要事实来处理,以达到既定目标。 事实上基本上是关于计划和数据的真实陈述。 例如,北京是中国的首都。
规则
实际上,规则是允许我们对问题域做出结论的约束条件。 规则基本上写成逻辑条款来表达各种事实。 例如,如果构建游戏,那么必须定义所有规则。
规则对于解决逻辑编程中的任何问题都非常重要。 规则基本上是可以表达事实的合乎逻辑的结论。 以下是规则的语法 -
1 |
|
在这里,A是头部,B1,B2,… Bn是主体。
例如 - ancestor(X,Y): - father(X,Y)
。
ancestor(X,Z): - father(X,Y),ancestor(Y,Z)
。
对于每一个X
和Y
,如果X
是Y
的父亲,Y
是Z
的祖先,那么X
是Z
的祖先。对于每个X
和Y
,X
是Z
的祖先,如果X
是 Y
和Y
的父亲是Z
的祖先。
为了在Python中开始逻辑编程,需要安装以下两个包 -
Kanren
它为我们提供了一种简化业务逻辑编写代码的方式。 它让我们用规则和事实来表达逻辑。 以下命令来安装kanren
-
1 |
|
SymPy
SymPy是符号数学的Python库。 它旨在成为一个全功能的计算机代数系统(CAS),同时保持代码尽可能简单,以便易于理解和扩展。 以下命令是用来安装SymPy -
1 |
|
以下是一些可以通过逻辑编程解决的例子 -
匹配数学表达式
实际上,我们可以通过使用逻辑编程以非常有效的方式找到未知值。 以下Python代码用于匹配数学表达式 -
考虑先导入下列软件包 -
1 2 3 |
|
需要定义要使用的数学运算 -
1 2 |
|
加法和乘法都是交互进程。 因此,我们需要指定它,这可以按照以下方式完成 -
1 2 3 4 |
|
定义变量是强制性的; 这可以如下完成 -
1 |
|
需要将表达式与原始模式相匹配。有以下原始模式,基础是(5 + a)* b
-
1 |
|
有以下两个表达式来匹配原始模式 -
1 2 |
|
输出可以使用以下命令打印 -
1 2 |
|
运行此代码后,将得到以下输出 -
1 2 |
|
第一个输出表示a
和b
的值。 第一个表达式匹配原始模式并返回a
和b
的值,但第二个表达式与原始模式不匹配,因此没有返回任何内容。
在逻辑编程的帮助下,可以从数字列表中出素数,也可以生成素数。 下面给出的Python代码将从数字列表中找到素数,并且还会生成前10
个素数。
首先导入以下软件包 -
1 2 3 4 |
|
现在,我们将定义一个名为prime_check
的函数,它将根据给定的数字检查素数作为数据。
1 2 3 4 5 |
|
现在,声明一个变量 -
1 2 3 4 |
|
上述代码的输出如下 -
1 2 |
|
参考 :http://www.zyiz.net/tutorial/detail-7864.html
逻辑编程可用于解决许多问题,如8拼图,斑马拼图,数独,N皇后等。在这里,举例说明斑马拼图的变体如下 -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
在Python的帮助下解决谁有斑马的问题。
导入必要的软件包 -
1 2 3 |
|
现在,我们需要定义两个函数 - left()
和next()
来查找哪个房屋左边或接近谁的房子 -
1 2 3 4 |
|
现在,声明一个变量:houses
,如下 -
1 |
|
需要在lall
包的帮助下定义规则如下。
有5
间房子 -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
现在,用前面的约束运行解算器 -
1 |
|
借助以下代码,可以提取解算器的输出 -
1 |
|
以下代码将打印解决方案 -
1 |
|
上述代码的输出如下 -
1 |
|