VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 6243|回复: 11

用情侣和情敌的例子向大家介绍 Prolog 语言

[复制链接]
 楼主| 发表于 2010-8-7 22:22:17 | 显示全部楼层 |阅读模式
本帖最后由 VBProFan 于 2010-8-7 22:37 编辑

什么是prolog?
prolog是Programming in LOGic的缩写,意思就是使用逻辑的语言编写程序。prolog不是很高深的语言,相反,比较起其他的一些程序语言,例如c、basic等等语言, prolog是更加容易理解的语言。如果你从来没有接触过计算机编程,那么恭喜你,你将很容易的进入prolog世界。如果你已经是其他语言的高手,你就需要完全丢弃你原来的编程思路,否则是很难掌握prolog的。

一个例子
逻辑思维在我们日常生活中比比皆是,prolog正是把这种思维用文字描述出来的计算机语言。还是首先举个例子吧。  
比如一群年轻人正在恋爱,每个人都有自己心中所追求的对象:
张学友爱王菲
张学友爱周慧敏
王菲爱谢霆锋
周慧敏爱张学友
谢霆锋爱王菲
谢霆锋爱周慧敏
刘德华爱周慧敏
......
我们说两个年轻人要互相都喜爱,他们就算是一对情侣,那么上面的谁和谁是情侣呢?
这应该算是一道最简单逻辑推理题目了,那么我们如何用prolog语言实现呢?
“张学友爱王菲”是一条已知的事实,用prolog语言来表达就是:
爱(张学友,王菲).  
注意1:这里是为了阅读方便才使用汉字的,真正的prolog是不允许使用除了基本字符以外字符的,也就是说,上面的句子必须写成love(zhangxueyou,wanfei).,电脑才能够真正的理解。
注意2:最末尾的“.”一定不能掉,它表示一个句子结束。
注意3:上面词汇对于电脑来说并没有真正的含义,所以我们完全可以用 ai(zxy,wf).来表达这个关系,更进一步,我们甚至可以用 xxx(a,b).来表达,只要你自己心里清楚xxx表示爱,a表示张学友,b表示王菲就可以了。
注意4:张学友和王菲的顺序也没有特别的规定,你完全可以把他们换个位置:爱(王菲,张学友). 只要你心里清楚它表达的意思就行了,而以后都遵循这种被爱的人在前面的顺序,就不会出错。
其他的事实我就不写了,你可以参照上面的例子自己把已知事实翻译成prolog的语句。
那么情侣的概念怎么定义呢?也很简单!
情侣(某人甲,某人乙):-爱(某人甲,某人乙),爱(某人乙,某人甲).
:-在prolog中表示“如果”的意思,我们使用它来定义规则。上面这句话的意思就是,某人甲和某人乙是情侣的规则就是:某人甲爱某人乙,并且某人乙爱某人甲。上面用来分隔两个爱的句子的“,”表示并且的意思。
当然为了能够让电脑运行,这个句子要改为英文的:
lovers(X,Y):-love(X,Y),love(Y,X).  
注意:在prolog中以小写字符开头的字符串代表确知的事物,比如love表示爱这种关系,而zhangxueyou表示张学友。而以大写字母开头的字符串表示未确定的事物,翻译成汉语就是某某。
完整的可运行的prolog程序如下:(我的拼音不好,要是什么人的名字拼写错了,请原谅:)
love(zhangxueyou,wanfei).
love(zhangxueyou,zouhuimin).
love(wanfei,xietinfen).
love(zouhuimin,zhangxueyou).
love(xietinfen,wanfei).
love(xietinfen,zouhuimin).
love(liudehua,zouhuimin).
lovers(X,Y):-love(X,Y),love(Y,X).
lovers.JPG
我们可以看出来,完整的prolog程序是有事实和规则组成的。事实用来储存一些数据,而规则用来储存某种可以推理出来的关系。
如果把上面的程序调入prolog解释器(关于prolog解释器,在后面有介绍)然后就可以对以上的程序进行询问。
prolog解释器的提示符号为“?-”,你只需要在在这个提示符后面输入自己的句子就可以了。让我们来看第一个询问:
?-love(zhangxueyou,wanfei).
事实上我们的询问完全和程序中的第一条事实一样,这个询问是“是非”询问,也就是说电脑回答的答案是yes或者no。上面的询问的含义是:就你所知,张学友爱王菲么?由于我们的程序中间有这样的事实,所以解释器将回答。
yes.
如果我们问:
?-love(zhangxueyou,liudehua).  
解释器将回答
no.
因为它没有发现love(zhangxueyou,liudehua).这个事实。
在询问中我们可以使用大写字母代表未知的事物,让解释器找到答案。例如:
?-love(zhangxueyou,X).
这句话询问的是:张学友都喜欢那些人。解释器将给出答案:
X=wanfei;
X=zouhuimin;
no.
注意1:上面的两个“;”是人工输入的,当解释器找到一个答案之后,它将这个答案输出,并且等待用户的进一步输入,如果用户输入“;”,解释器将继续寻找其他的答案,如果输入的是别的符号,解释器将终止查询。
最后那个no.是因为,系统在输出了zouhuimin这个答案以后,用户输入“;”,表示还想知道其他的答案,而解释器又找不到其他的答案了,于是输出no.来终止查询。我们再看一个例子:
?-love(X,zouhuimin).
X=zhangxueyou;
X=xietinfen;
X=liudehua;
no.
在上面的询问中,我们只涉及到对事实的查询,下面我们来看规则的用法。
?- lovers(X,Y).
X = zhangxueyou  
Y = zouhuimin ;
X = wanfei
Y = xietinfen ;
X = zouhuimin
Y = zhangxueyou ;
X = xietinfen
Y = wanfei ;
no
我们看到lovers(X,Y).找出了系统中所有的恋人。不过每对恋人被显示了两次,这是因为prolog是考虑顺序的,也就是说lovers(a,b).和lovers(b,a).并不等价。这一点在后面的学习中,你会了解。
再看一个例子:
?- lovers(wanfei,Y).  
Y = xietinfen ;
no
询问王菲的恋人,结果是xietinfen。呵呵,还挺聪明的。我们看到同样是lovers,根据其参数不同,功能也不同,这也是prolog的一个大特点。
最后让我们编写一个寻找情敌的规则来结束这一节内容吧。
rival_in_love(X,Y):-love(X,Z),not(love(Z,X)),love(Z,Y).
这段程序可以理解为:Y是X的情敌的条件是:X喜欢Z(代表某个人),而Z不喜欢X,而Y是Z喜欢的人。哈哈,这不正是情敌的条件嘛。
?- rival_in_love(X,Y).  
X = zhangxueyou
Y = xietinfen ;
X = xietinfen
Y = zhangxueyou ;
X = liudehua
Y = zhangxueyou ;  
no
好了,你自己分析一下为什么会是这样的答案吧。
发表于 2010-8-7 22:46:03 | 显示全部楼层
似乎你应该换一个GNU Prolog来玩玩,开源的……
回复 支持 反对

使用道具 举报

发表于 2010-8-7 22:48:24 | 显示全部楼层
好像用起来挺方便的,不过像图论算法……
回复 支持 反对

使用道具 举报

发表于 2010-8-8 01:13:37 | 显示全部楼层
以后LZ可以改名VBProLog
回复 支持 反对

使用道具 举报

发表于 2010-8-8 11:25:59 | 显示全部楼层
弱弱地问一下,
有哪个软件是用Prolog写的?
作为一门语言,Prolog有结构控制、算数函数、字串处理、模块化、输入输出、编译运行等功能吗?
回复 支持 反对

使用道具 举报

发表于 2010-8-8 14:55:49 | 显示全部楼层
5# bsmj

按LZ所说,很多专家系统都是Prolog写的……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-9 07:43:20 | 显示全部楼层
弱弱地问一下,
有哪个软件是用Prolog写的?
作为一门语言,Prolog有结构控制、算数函数、字串处理、模块化、输入输出、编译运行等功能吗?
bsmj 发表于 2010-8-8 11:25


算数函数、字串处理、模块化、输入输出、编译运行 这些功能都有。
最神奇的就是虽然它没有 if else、for、while、switch 这些结构控制语句,但却能实现智能。这是因为它的运行机理含有替换、匹配、合一、递归、回溯。
它可以解八数码、走迷宫、汉诺塔等状态图搜索问题,逻辑判断问题更是它的强项。Visual Prolog 的强大更是可以和 VB6 媲美(但不知道它能否调用 API,反正无需调用API的程序VB能做的它都可以做)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-9 07:44:08 | 显示全部楼层
5# bsmj  

按LZ所说,很多专家系统都是Prolog写的……
acme_pjz 发表于 2010-8-8 14:55


昨天在书城看书发现,写专家系统还有一个更强大的武器----CLIPS
回复 支持 反对

使用道具 举报

发表于 2010-8-9 14:08:32 | 显示全部楼层
什么什么?
这个解释器会自动匹配?
如果ACM的题能用这个提交那不是很爽
回复 支持 反对

使用道具 举报

发表于 2010-8-9 14:30:07 | 显示全部楼层
7# VBProFan

根据网上资料,GNU Prolog可以将Prolog程序完全编译成汇编代码……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-3-22 05:27

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表