prolog语言安装

Ubuntu实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。

关于作者:

  • 张丹,分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/prolog-install/

前言

最近在研究逻辑推理的一些问题,无意中发现了一门编程语言prolog就是解决推理问题的。这可太好了,直接勾起了我们的兴趣,马上动手试一下。本文是prolog编程语言的初探,一切从零开始,就让我们揭开prolog的神秘的面容吧。

目录

  1. 什么是prolog语言
  2. 在Ubuntu中安装prolog
  3. 在Win10中安装prolog
  4. 5分钟上手
  5. 躲不过的错误:DWIM could not correct goal

1. 什么是prolog语言

prolog(Programming in logic)是一种面向演绎推理的逻辑型程序设计语言,最早于1972年由柯尔麦伦纳(Colmeraner)及其研究小组在法国马赛大学提出。prolog以处理一阶谓词演算为背景,由于其简单的文法、丰富的表达力和独特的非过程语言的特点,很适合用来表示人类的思维和推理规则,从而一问世就赢得了人工智能研究和应用开发者的广泛兴趣。

Prolog实际上就是一种基于逆向规则的演绎推理技术,只不过对规则和目标的表示有严格的限制.再加上演绎推理控制机制自身的简单性,难以适用于复杂的应用域。

Prolog 语言仅有三种语句:事实(Fact)、规则(Rule)和问题(Question)。

  • 事实,是prolog中最简单的谓词,它和数据库中的记录十分相似。事实用来说明一个问题中已知的对象的性质和它们之间的关系。
  • 规则,由几个互相依赖的简单句(谓词)组成。用来描述事实之间的依赖关系,如:因果关系,蕴含关系,对应关系。
  • 问题,是把事实和规则写入Prolog程序之后,就可以想Prolog询问有关问题的答案,询问的问题就是程序的运行目标。

从语言的描述来看,很抽象、很强大的样子,就让我们为体验一下吧。

2. 在Ubuntu中安装prolog

本文使用的Linux是Ubuntu 20.04.1 LTS Server 64bit的系统,安装Prolog数据库软件包可以通过apt实现。

简单地3条命令就可以实现


# 增加swi-prolog源到配置文件
~ sudo apt-add-repository ppa:swi-prolog/stable

# 更新源
~ sudo apt update

# 安装
~ sudo apt install swi-prolog

查看prolog安装版本,为最新的8.2.3


~ swipl --version
SWI-Prolog version 8.2.3 for x86_64-linux

启动prolog的命令行


~ swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 8.2.3)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.

For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).

?-

启动后,出现 ?- 这个符号,表示启动正常,进入到了prolog的运行时环境。

3. 在Win10中安装prolog

我们需要从官网下载prolog的window的安装包,最新版本为8.2.3,https://www.swi-prolog.org/download/stable

然后,一路(next)安装就行,安装完成后,我们找到SWI-Prolog的快捷方式启动。

启动后,出现的操作界面和Linux是一致的,我们就可以在这个环境中运行prolog的脚本程序了。

4. 5分钟上手

接下来,我们初步认识一下prolog编程,做一个5分钟上手的小例子。

4.1 语句以 . 为结束标志
在prolog编程中,每条命令执行完,需要输入 . 表示语句运行结束。如果不输入 . 就会默认自动换行处理,第一次是 ?- 提示符,第二行为 | 提示符。

查看当前的运行路径,以.结尾


?- pwd.
% c:/users/bsspi/documents/prolog/
true.

%% 没有输入.,默认自动换换行,再第二行输入 .
?- pwd
|    .
% c:/users/bsspi/documents/prolog/
true.

4.2 切换路径

通常来说,每个项目都会运行在不同路径中,所以我们需要切换工作路径。


?- cd('c:/work/prolog').
true.

%% 查看路径
?- pwd.
% c:/work/prolog/
true.

4.3 语法帮助

查看帮助命令,使用 help(命令). ,分别查看pwd命令和append命令。

查看append命令的帮助


?- help(append).
                                                                          Availability: built-in

append(+File)
    Similar to tell/1, but positions the file pointer at the end of File rather  than truncating
    an existing file. The pipe construct is not accepted by this predicate.

                                Availability: :- use_module(library(lists)). (can be autoloaded)

append(+ListOfLists, ?List)
    Concatenate a list of lists. Is true if  ListOfLists is  a list  of lists,  and List  is the
    concatenation of these lists.

         ListOfLists  must be a list of possibly partial lists 

                                Availability: :- use_module(library(lists)). (can be autoloaded)

append(?List1, ?List2, ?List1AndList2)
    List1AndList2 is the concatenation of List1 and List2
true.

查看pwd命令的帮助


?- help(pwd).
Warning: No help for pwd.
Warning: Use ?- apropos(query). to search for candidates.
true.

4.4 输出到控制台

输出hello world


?- write("hello world").
hello world
true.

连续输出 hello world fens.me


?- write("hello world "),write("fens.me").
hello world fens.me
true.

连续输出 hello world fens.me,中间中nl换行


?- write("hello world "),nl,write("fens.me").
hello world 
fens.me
true.

4.5 加载官方例子
prolog官方为了能够让大家让手方便,提供了一个简单的例子的脚本,我们可以加载这些脚本,看看官方的脚本编写语法。

加载swi软件demo目录下的likes.pl文件


?- [swi(demo/likes)].
true.

查看likes文件中定义的sam都喜欢什么东西,用X标识X为变量,每次只显示一行,按 ; 换行继续显示,可以用来查看sam都喜欢什么东西。


?- likes(sam, X).
X = dahl ;
X = tandoori ;
X = kurma ;
X = chow_mein ;
X = chop_suey ;
X = sweet_and_sour ;
X = pizza ;
X = spaghetti ;
X = chips.

编辑likes.pl文件


?- edit(likes).
true.

会自动弹出一个prolog编辑器,可以看到likes.pl文件的源代码。
我们可以输入一些参数进行判断。


# sam喜欢dahl吗
?- likes(sam,dahl).
true .

# sam喜欢chop_suey吗
?- likes(sam,chop_suey).
true .

# sam喜欢curry吗
?- likes(sam,curry).
false.

查看indian餐列表


?- listing(indian) .
indian(curry).
indian(dahl).
indian(tandoori).
indian(kurma).

4.6 创建自定的命令
首先,需要创建一个本地的文件叫abc.pl。

定义 hello 命令,输出Hello world。


?- edit(file(abc)).
true.

在打开的文件abc.pl中,添加下面内容


hello : format('Hello world ~n').

加载abc.pl文件,输出hello命令。


?- [abc].
true.

?- hello.
Hello world
true.

在运行环境修改hello命令,失败。


?- hello : format('Hello fens.me ~n').
false.

?- hello.
Hello world
true.

4.7 完成退出
在我们完成工作任务后,最后用halt命令进行退出运行环境。


?-  halt.

退出prolog环境。

5. 躲不过的错误:DWIM could not correct goal

第一次使用prolog时,不管从哪里复制的过来的例子,都会出现 ERROR: Unknown procedure: love/2 (DWIM could not correct goal) 的错误。我也试了很多次,才搞明白这个错误的问题。

在prolog的执行过程中,prolog要求所有的自定义命令,都必须是在指定文件中定义,所以当我们任意复制过来的命令,直接在运行环境中执行就会出现这个错误。解决的方法,就是把命令写到文件中,然后加载文件就能解决。

比如下面的例子,我们要创建一个恋爱关系,在c:/work/prolog目录下,新建一个love.pl文件。


~ notepad c:/work/prolog/love.pl

love(zhangxueyou,wangfei).
love(zhangxueyou,zhouhuimin).
love(wangfei,xietingfeng).
love(zhouhuimin,zhangxueyou).
love(xietingfeng,wangfei).
love(xietingfeng,zhouhuimin).
love(liudehua,zhouhuimin).
loves(X,Y):-love(X,Y),love(Y,X).  %恋人
rival_in_love(X,Y):-love(X,Z),not(love(Z,X)),love(Z,Y). %情敌

直接在prolog的运行环境中运行,第一行命令,出现错误 (DWIM could not correct goal)


?- love(zhangxueyou,wangfei).
ERROR: Unknown procedure: love/2 (DWIM could not correct goal)

接下来,我们加载c:/work/prolog/love.pl文件



# 加载文件
?- ["c:/work/prolog/love"].
true.

# 判断是否恋人关系
?- love(zhangxueyou,wangfei).
true .

# 判断是否恋人关系
?- love(liudehua,wangfei).
false.

# 判断是否情敌关系
?- rival_in_love(liudehua,wangfei).
false.

通过上面的操作,我们就完成了prolog语言的初次尝试,prolog安装很简单,语法上有点奇怪。随后我将进一步学习prolog语法,以及能用prolog来解决什么问题的尝试。

希望本文能让所有的prolog新手快速上手,顺利完成prolog语言的初探。

转载请注明出处:
http://blog.fens.me/prolog-install/

打赏作者

This entry was posted in IT相关知识