Ubuntu实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。
关于作者:
- 张丹,分析师/程序员/Quant: R,Java,Nodejs
- blog: http://fens.me
- email: bsspirit@gmail.com
转载请注明出处:
http://blog.fens.me/prolog-install/
前言
最近在研究逻辑推理的一些问题,无意中发现了一门编程语言prolog就是解决推理问题的。这可太好了,直接勾起了我们的兴趣,马上动手试一下。本文是prolog编程语言的初探,一切从零开始,就让我们揭开prolog的神秘的面容吧。
目录
- 什么是prolog语言
- 在Ubuntu中安装prolog
- 在Win10中安装prolog
- 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/