Prolog 语言尝试

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

内容简介:最近在看《七周七语言》这本书,其中有讲到 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 根据我们输入的事实和规则,自己计算得到了查询结果。


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

查看所有标签

猜你喜欢:

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

Essential PHP Security

Essential PHP Security

Chris Shiflett / O'Reilly Media / 2005-10-13 / USD 29.95

Being highly flexible in building dynamic, database-driven web applications makes the PHP programming language one of the most popular web development tools in use today. It also works beautifully wit......一起来看看 《Essential PHP Security》 这本书的介绍吧!

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

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具