Prolog 语言尝试

栏目: 数据库 · 发布时间: 5年前

内容简介:最近在看《七周七语言》这本书,其中有讲到 Prolog,感觉它跟平时自己用到的语言完全不同,是声明式的编程语言,因此安装尝试了一下。我们之前常用的语言例如 JavaScript 等,被称为命令式语言(imperative language)。命令式语言就像是一本烹饪菜谱,你需要精确告诉计算机如何去完成一项工作…你其实是在列出原料的购物清单,并描述烤蛋糕的详细步骤。

最近在看《七周七语言》这本书,其中有讲到 Prolog,感觉它跟平时自己用到的语言完全不同,是声明式的编程语言,因此安装尝试了一下。

什么是声明式编程语言?

我们之前常用的语言例如 JavaScript 等,被称为命令式语言(imperative language)。

命令式语言就像是一本烹饪菜谱,你需要精确告诉计算机如何去完成一项工作…你其实是在列出原料的购物清单,并描述烤蛋糕的详细步骤。

而 Prolog 是一门声明式编程语言(decalarative language)。我们提供事实和推论,Prolog 可以自己计算给出我们想要的推断。

声明式语言更像是一名手艺高超的糕点师,说出你喜欢的蛋糕的特征,让糕点师挑选原料并按照你提供的规则为你烤出蛋糕。

安装 Prolog

自从有了 WSL 以后,我更喜欢在 Windows 上进行编程了,我使用的是 Ubuntu 子系统,这里说一下如何在 Ubuntu 中安装 Prolog。

如果你还不了解 WSL,欢迎读一下我的另一篇博客: https://meixg.cn/2019/05/16/wsl/

Prolog 有很多实现,搜了一下有:B-Prolog, Ciao, ECLiPSe, GNU Prolog, Jekejeke Prolog, Poplog Prolog, P#, Quintus Prolog, SICStus, Strawberry, SWI-Prolog, Tau Prolog, tuProlog, WIN-PROLOG, XSB, YAP。。。

我选择的是 GNU-prolog, http://www.gprolog.org/ ,仅仅是因为书里是按照这个讲解的。

这里有个坑,Ubuntu 的 apt 中是直接可以搜索到 gprolog 这个包的,安装就可以直接运行。但是当你执行一些简单代码时,会发现有报错。

uncaught exception: error(existence_error(procedure,likes/0),friend/0) (Seven Languages)

搜索了一下,发现 apt 中的 Prolog 有 bug: https://stackoverflow.com/questions/54496409/uncaught-exception-errorexistence-errorprocedure-likes-0-friend-0-seven-la

解决办法是下载源码自己编译:

  1. 首先下载源码:
wget http://www.gprolog.org/gprolog-1.4.5.tar.gz
  1. 解压
  2. 进入 src 目录
./congifure
make
sudo make install

就可以了,很简单。

Prolog 的基本构建单元

  • 事实。事实是关于真是世界的基本断言。
  • 规则。规则是关于真实世界中的一些事实的推论。
  • 查询。查询时关于真实世界的一个问题。

我们编写一些事实和规则,就可以进行查询,得到一些推论是不是正确,或者得到一些符合查询条件的结果。比如我们编写:

  • 事实:Babe 是一头猪。
  • 规则:如果一个动物是猪,那么它就喜欢泥巴。
  • 查询:Babe 喜欢泥巴吗?

编写简单 Prolog 代码

% 事实
isPig(babe).

% 规则
likeDirt(X) :- isPig(X).

那么我们就可以使用 likeDirt(babe) 来判断 babe 是不是喜欢泥巴了。

接下来看一个稍微难一点的问题,比如地图着色:

Prolog 语言尝试

我们需要用红绿蓝三种颜色填充上面的地图,要求相邻州的颜色不同。

先写事实:

different(red, green). different(red, blue).
different(green, red). different(green, blue).
different(blue, red). different(blue, green).

编写规则:

coloring(A, M, G, T, F) :-
		different(M, T). different(M, A),
    different(A, M), different(A, G),
    different(A, T), different(A, F),
    different(G, F), different(G, T).

接下来我们执行一下试试。

使用 gprolog 执行 Prolog 代码

在安装好 gprolog 后,我们直接执行 prolog,会看到以下界面:

Prolog 语言尝试

我们可以先加载我们的事实和规则文件:

['color.pl'].

Prolog 语言尝试

返回 yes 表示加载成功了。之后进行查询:

coloring(A, M, G, T, F).

Prolog 语言尝试

我们得到了一个填充方式,当然填充方式可能不止一种,输入 a 可以得到所有结果:

Prolog 语言尝试

总结

Prolog 的这种编程方式,更像是我们在跟程序进行对话,计算过程我们并不知道,Prolog 根据我们输入的事实和规则,自己计算得到了查询结果。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

众声喧哗

众声喧哗

胡泳 / 广西师范大学出版社 / 2008-9 / 35.00元

本书触及了网络政治学中的一个重大话题——网络空间中的私域与公域。随着科技的进步,在信息时代的开端,公与私的含义和边界都出现了不容忽视的游移。《众声喧哗》主要探讨,经由新的共有媒体的作用,传统的公私两分如何在社会和政治的双重压力下产生消长和易位。在这里,公域与私域不能看做结构性的东西,而必须视之为一种流和一种过程。在网络时代,我们既要追求生机勃勃的公共生活,又要保证私人领域一定的自主性。共有媒体也许......一起来看看 《众声喧哗》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具