头脑风暴-逻辑编程语言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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 什么是prolog prolog是Programming in LOGic的简写,也就是使用逻辑的语言编写程序。 ...
    小白frankie阅读 3,095评论 0 3
  • 计算机编程语言可用于将指令传达给计算机。它们基于某些句法和语义规则,定义了编程语言中每种结构的含义。 现在我得到了...
    幻凌风阅读 8,011评论 1 26
  • 饱读诗书有何用? 至今依然内外空。 东疆遗珠写网文, 一年四季不放松。
    千秋笔阅读 197评论 0 2
  • 年少时师父对我影响甚远,常会给我讲解经文里的意思,记得有一次师父问我:“你是怎么理解慈悲、舍得的?”我说:“慈悲就...
    叛逆女说故事阅读 224评论 2 0
  • 她是个幸运的女孩。 母亲是一代天后王菲,父亲是著名演员李亚鹏。堪称衔着金钥匙出生的人。 可她也是个有缺陷的人——先...
    米汤泡米饭汤慧阅读 270评论 0 1