那迷人的被遗忘的语言:Prolog

在进入正题之前,我们先一起思考一个问题:当我们在编程时,我们在做什么?

看到这个问题,有些同学可能会第一时间要回答:

在听音乐

在打字

在发呆

在装作很忙的样子

……

呃,我不是那个意思,说认真的:当我们在编程时,我们在做什么?

我们在把所想的「解决方案」转换成计算机可理解的「计算机语言」。

JavaScript, Python, Java, Ruby, C++ …… 等等等等,哪怕是世界上最好的语言 PHP,也大抵如此:「解决方案」->「计算机语言」

但你有没有想过反过来?「计算机语言」->「解决方案」这样,我们使用「计算机语言」描述问题,而计算机来告诉我们「解决方案」?

或许你会想到人工智能、深度学习等等概念,但那些热门话题不是我们今天要讨论的。

今天,我们来一起聊聊那迷人的被遗忘的语言:Prolog.

Prolog 简介

Prolog(Programming in Logic)是一种逻辑编程语言。它创建在逻辑学的理论基础之上, 诞生与 1972 年,最初被运用于自然语言等研究领域,距今 46 年历史。当下火热的 JavaScript 语言 23 岁,年龄刚好是 Prolog 的一半。

说到 Prolog 是一种逻辑编程语言,那么跟一般的函数式语言有什么区别呢?答:完全不是一码事情。在 Prolog 里,最基本的做法是先描述事实(定立对象与对象之间的关系),然后用询问目标的方式来查询各种对象之间的关系,系统会自动进行匹配、回溯,并给出答案。

举个例子:

我们使用下面的语法来表述一个事实

这个语句描述了一个事实:二狗 (ergou) 是无比帅气 (handsome) 的,然后以句号 (.) 结束,表明这个事实描述完毕,不容置疑。

然后接下来我们在 Prolog 的控制台 (REPL) 里就会得到如下的结论:

其中 开头的是我们手动输入的,其他的是 Prolog 返回的。上面的那些操作是:

我们首先问 Prolog:谁是世界上最帅的人? 其中 是大写字母开头,在 Prolog 里所有大写字母开头的都是变量。

然后 Prolog 回答说: ,当然是二狗了!

以上,应该可以算作 Prolog 基本思路的一个演示。你可以去下载适用于你的 Prolog 环境,然后在自己的电脑上把玩一下。

建议使用 SWI Prolog(本文的所有演示代码都是在 SWI Prolog 进行的操作):http://www.swi-prolog.org/

安装完毕之后,执行下面三步,即可复现上面的结果:

将事实写入文件

启动 Prolog REPL 并加载既定事实:

在 Prolog REPL 内输入以下语句并回车:

谁是我大爷?

刚才的例子是我们描述了一个事实,然后又让 Prolog 告诉了我们这个事实,好像没有太大的用途,接下来我们试着做一下别的事情:

文件名:grandfather.prolog

看了上面的代码,应该可以理解到,我们是描述了三个事实:

二狗 (ergou) 的父亲是 一狗 (yigou)

一狗 (yigou) 的父亲是零狗 (linggou)

X 是 Z 大爷的前提条件是:X 是 Y 的父亲,Y 是 Z 的父亲

有了这些事实,我们可以干什么?可以找到二狗爷爷啊!

载入既定事实

执行询问语句

可以看到一狗 (yigou) 是没有爷爷的,二狗 (ergou) 的爷爷是零狗 (linggou) 。

我和小红的共同爱好是什么?

像刚才那个例子,我们再举一个来加深一下这种思维方式:

文件名:music.prolog

上面这些代码描述了二狗和小红的听歌品味,现在如果二狗想要找出自己与小红在听歌品味上的共同之处,该怎么办?

载入既定事实

执行询问语句

我们在加载了既定事实之后,开始询问:有什么音乐是二狗 (ergou) 和小红 (xiaohong) 都有在听的呢?

然后我们得到了下面的答案:

如果你有在跟着文章手动操作,如果你是个细心的同学,你会发现这次询问之后光标停留在了 这里,而不是换行显示出 。这是为什么呢?

这时候 Prolog 是在说:问题还有别的解答,按下 寻求更多,按下 表示接受当前答案。在上边了例子中,我们持续按下 ,直到返回 才停下来。

于是我们得到了二狗和小红共同欣赏的音乐,是巴赫和贝多芬。

鸡兔同笼问题

接下来我们来一个经典问题:

今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

—— 《孙子算经》

翻译成白话文:

有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?

停!快停止思考!

如果你在使用 JavaScript、Python 等等语言的思路去尝试编程解决问题的话,赶紧停下来,现在我们要用描述既定事实的方式,让 Prolog 给我们答案!

文件名:chicken-and-rabbits.prolog

我们定义好了事实,那么接下来让我们去询问 Prolog 答案:

载入既定事实

执行询问语句

答:鸡有 23 只!兔有 12 只!

哈哈哈哈,没错!再也不需要去绞尽脑汁思考怎么告诉计算机去计算啦!只需要告诉 Prolog 既定事实,剩下的,就是提出正确的问题啦!

古老的 Prolog 在计算机科学中的逐渐退热,必然有对应的原因,但这种语言所特有的思维方式,也不妨去探寻一下。在当下的编程氛围里,或许 Prolog 就像是夏日的一杯加冰柠檬水,给我们带来凉爽和清新呢!

好了,关于 Prolog 的讨论,我们今天就到这里了,多谢各位!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180810G1T3RW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券