前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从prolog到LTN,AI的逻辑推理能力1

从prolog到LTN,AI的逻辑推理能力1

作者头像
mixlab
发布2019-09-16 18:17:08
2.8K0
发布2019-09-16 18:17:08
举报

趁着假期快速阅读了一些关于逻辑编程的文献,喜欢上了逻辑编程这种编程方式。然后,顺藤摸瓜,果然,神经网络+逻辑编程,学术界的研究也有了初步的成果,例如Logic Tensor Networks 、Neural Logic Machines 等等。

本文整理了逻辑编程、prolog语言快速入门、LTN的核心思想,分享给大家。

01

逻辑编程是什么?

programming of Logic

只要给出事实和规则,它会自动分析其中的逻辑关系,然后给出答案。它描述了解决方案而不是计算步骤。基于该描述,计算机解决了该问题。从这点来说,描述问题的解决方案比设计解决问题的方法容易得多,在逻辑编程时,我们不需要关心寻找结果的过程,这就是逻辑编程具有吸引力的原因。

在逻辑编程中,我们需要建立建立变量(未知数)和值(知识)之间的约束关系,例如:

代码语言:javascript
复制
x * 2 + y * 2 == 16

就是一条建立好的约束关系,我们只需编写到这一步即可,剩下的逻辑编程语言会自动计算出有效的结果。

而非逻辑编程语言,需要我们一步一步告诉计算机确切地做什么,例如:

代码语言:javascript
复制
for(var x=0;x<16;x++){
    for(var y=0;y<16;y++){
        if(x*2+y*2==16){
            console.log(x,y)
        }
    }
}

我们需要把具体的解决方案也编写完。是不是感觉逻辑编程很简单?只需要把解题的约束建立好。学习逻辑编程,可以先从Prolog学起。

02

Prolog 语言

我们来试验下逻辑编程,开发环境是mac,打开终端,输入:

代码语言:javascript
复制
brew install swi-prolog

安装过程有点漫长,等待安装完成。

开始体验,终端输入:

代码语言:javascript
复制
swipl

然后输入:

代码语言:javascript
复制
write("Hello  Mixlab").

注意,prolog的每条命令结尾需要添加一个 . 号

终端会打印出Hello Mixlab的字样,恭喜,prolog运行成功。

如何退出prolog?终端输入:

代码语言:javascript
复制
halt.

即可退出prolog。

03

通过寻找凶手的例子,了解逻辑编程的核心思想

如何用prolog寻找凶手呢?案件是这样的Boddy先生死于谋杀,现有6名嫌疑犯,每个人在不同的房间,每间房间各有一件可能的凶器。我们不知道嫌疑犯、房间、凶器之间的对应关系。

下面将根据每次探案获得的线索,一步步输入prolog,最终找出谁是凶手。

这个过程是不是很像最近热播的《轮到你了》中用AI来寻找凶手的过程,也是一次次输入获得的线索,然后AI来推理。

6名嫌疑犯分别是:

三男 George、John、Robert

三女 Barbara、Christine、Yolanda

prolog先定义6名嫌疑犯:

代码语言:javascript
复制
man(george).
man(john).
man(robert).
woman(barbara).
woman(christine).
woman(yolanda).

用2条规则来约定男人属于人,女人属于人:

代码语言:javascript
复制
person(X):- man(X).
person(X):- woman(X).

这样,最基本的变量(未知数)X和知识person、woman,已经建立关系。我们可以把上面这几行代码写成一个test.pl文件,然后终端输入:

代码语言:javascript
复制
swipl
[test].

测试下:

代码语言:javascript
复制
person(shadow).

返回的是false,因为shadow没有录入man里,再试试输入:

代码语言:javascript
复制
person(john).

返回的是true。

详细的代码地址可以见文末。我们继续往下

04

Logic Tensor Networks(LTN)

LTN逻辑张量网络,把知识和数据都被映射到向量空间,从而使得模型具备知识推理能力。下面通过一个例子来理解它的核心思想。

通过上文的简单介绍,我们知道,需要把知识跟变量可能的值录入,程序就具备了逻辑推理能力。例如,知识“apple”,按照逻辑编程的写法“ apple(x)”,它将任何对象x作为参数,如果该对象是苹果则返回true,否则返回false。

规则:红苹果是甜的,可以表示为逻辑公式:

代码语言:javascript
复制
sweet(x):- apple(x),red(x)

此语句可解释如下:

“如果x是苹果和红色,那么这个x也必须是甜的。”

换句话说:所有红苹果都是甜的。

如果apple(x)返回的不是true或者false,而是返回0到1之间的数字,这样,我们就可以通过0-1来表达x是apple的概率。

一旦我们把apple(x)的取值范围变为0-1,我们就可以利用神经网络进行分类,然后再使用我们的逻辑公式对其进行推理。此外,我们可以使用逻辑公式来指导学习神经网络权重的过程。我们可以优化神经网络的权重,使其正确地将x分类为apple。

我是喜欢上了逻辑编程的方式,还可以为AI加上推理能力,

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无界社区mixlab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01
  • 逻辑编程是什么?
  • 02
  • Prolog 语言
  • 03
  • 通过寻找凶手的例子,了解逻辑编程的核心思想
  • Logic Tensor Networks(LTN)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档