头脑风暴-逻辑编程语言Prolog(01)

Prolog语言介绍

Prolog的英语意思就是Programming in logic(逻辑编程)。与几乎无所不能的C语言或是Python语言不同,Prolog不是一种通用语言,比如说它并不能够写出3D游戏引擎,它是建立在逻辑学的理论基础之上的一种独特的编程语言。不够全能但它仍然是一种值得学习的语言,它也被广泛的应用在人工智能的研究中,它可以用来建造专家系统、自然语言理解、智能知识库等。

如果你有一些基础的逻辑学知识,用Prolog解决一些逻辑推理问题方面会很方便,它能够比其他的语言更快速地开发此类程序。因为它的编程方法更象是使用逻辑的语言来描述问题,而不是编写程序,Prolog的程序和数据高度统一,很难分清楚哪些是程序,哪些是数据的。事实上,prolog中的所有东西都有相同的形式,也就是说数据就是程序,程序就是数据。这与我们常见的编程语言完全不是一种思维方式,prolog程序甚至没有特定的运行顺序,其运行顺序是由电脑决定的。

进入Prolog世界

我们选择Prolog的一种实现,叫做SWI Prolog。他的在Linux,Mac,Windows下都可以安装,下载页面,安装很简单这里就不介绍了。SWI Prolog还支持中文来编程。我们先来看看什么逻辑编程,Prolog简单到只有下面三种基本语句,

1. 事实

事实用来说明已知对象之间的关系或是对象的定义。在Prolog程序中,事实由谓词名及用括号括起来的一个或几个对象组成。谓词和对象可由用户自己定义。比如:

喜欢(小明,小红)

这是一个名为喜欢的关系,表示对象小明对于小红之间有喜欢的关系。

漫画(哆啦A梦)

这是一个名为漫画的表述,表示对象哆啦A梦是一种称为漫画的东西。

有了事实的逻辑声明就可以询问Prolog系统,来判断谁喜欢谁,或是什么是什么。

我们这里先把上面两句保存到一个文件里,文件名为like.pl。默认情况下,SWI-Prolog安装后的可执行文件名称为“swipl”,我们打开当前目录的命令行,输入swipl,成功的话会有类似如下显示:

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

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

?-

这里就打开了swi prolog的交互式环境,你可以在?-后面输入命令,这种解释型的交互环境很像Python。

现在我们有一些事实储存在like.pl文件里,我们先加载这个文件到Prolog系统里,我们可以输入consult(like).,也可以用简略的写法[like],注意不要忘记句号,这里的意思是加载当前文件夹的叫做like的文件,如果正确这时系统会返回一个true,代表命令执行正确。

?- [like].
true.

2. 查询

现在我们可以对这个系统进行询问了,这就是Prolog的第二类语句,查询。如果现在我们询问小红是不是喜欢小明,会获得一个false的答复,因为事实里只有小明喜欢小红。

?- 喜欢(小红,小明).
false.

?- 喜欢(小明,小红).
true.

在这个系统里,叫西游记的东西不是漫画,哆啦A梦才是漫画。

?- 漫画(西游记).
false.

?- 漫画(哆啦A梦).
true.

只有这两条事实有点少,下面我们增加几条事实来测试。
修改like.pl文件:

喜欢(小明,小红).
喜欢(小王,小红).
喜欢(小红,小李).
喜欢(小李,小花).
喜欢(小花,小李).

重新加载like.pl文件:

?- [like].
true.

现在我们来学几个新的查询,我想看看有哪几个人喜欢小红。这里X是代表一个未知对象。

?- 喜欢(X,小红).
X = 小明 ;
X = 小王.

注意,这里的X必须大写,在第一个答案出现后如果没有结束,可以按;继续,如果不想看其他答案,可以按回车结束。这里得到两个答案,小明和小王都喜欢小红。

3. 规则

现在除了单一事实喜欢之外,还想要有一些组合的条件来表示某些事实,这就是规则。规则由几个互相有依赖性的简单句(谓词)组成,用来描述事实之间的依赖关系。

例如:恋人(X,Y):-喜欢(X,Y),喜欢(Y,X).
这里XY代表两个不同的未知对象,表示如果X喜欢Y,而且Y也喜欢X,那么他们就是恋人关系。继续修改like.pl文件加入规则:

喜欢(小明,小红).
喜欢(小王,小红).
喜欢(小红,小李).
喜欢(小李,小花).
喜欢(小花,小李).

恋人(X,Y):-喜欢(X,Y),喜欢(Y,X).

重新加载后继续询问系统;

?- [like].
true.

?- 恋人(小红,Y).
false.


?- 恋人(小李,Y).
Y = 小花.

?- 恋人(X,Y).
X = 小李,
Y = 小花 ;
X = 小花,
Y = 小李.

这里发现小红没有恋人,而这个系统中只有小李和小花互为恋人。
是不是有点意思了,那这些关系中还能分析出什么呢?我们最后来找找谁和谁是情敌关系吧:

我们这么定义情敌:如果X喜欢Z,而且Z又不喜欢X,Z喜欢Y,那么X和Y就是情敌。这么写:情敌(X,Y):-喜欢(X,Z),not(喜欢(Z,X)),喜欢(Z,Y).,这里的not()代表否定一个规则。

现在文件是这样,编辑完后重新加载:

喜欢(小明,小红).
喜欢(小王,小红).
喜欢(小红,小李).
喜欢(小李,小花).
喜欢(小花,小李).

恋人(X,Y):-喜欢(X,Y),喜欢(Y,X).
情敌(X,Y):-喜欢(X,Z),not(喜欢(Z,X)),喜欢(Z,Y).

小王的情敌是谁呢?我们不用自己去判断了,来问问系统吧!

?- 情敌(小王,Y).
Y = 小李.

看完上面的例子,不知道是否提起了你对prolog的兴趣。prolog有许多不足之处,但是这并不影响它在逻辑推理方面的强大功能,不过最好的方法是使用某种通用语言和prolog结合,通用语言完成计算、界面之类的操作,而prolog则专心实现逻辑运算的操作。例如:你编写一个下棋程序,用prolog来让电脑思考如何下棋,而用别的语言来编写界面。

到这里我们已经大概体验了这种逻辑编程语言,但这还远远不是Prolog的全部,下一节我们将继续学习这种强大的逻辑编程语言。

这里SWI Prolog提供了一个在线编程环境,如果你不愿意安装也能尝试Prolog,点击Create aProgram,就可以新建程序了,左侧是程序区,右侧下面是查询区。


最新STEM知识分享请关注STEM实验室 :www.steamlab.club

你可能感兴趣的:(头脑风暴-逻辑编程语言Prolog(01))