prolog语言学习入门
- 格式:pdf
- 大小:98.95 KB
- 文档页数:7
prolog语言学习入门
看到今天的作业题,我就感觉很难按要求完成了,因为prolog
对于我来说,完完全全是陌生的,倒是pascal、C等语言反倒略微懂得
一点皮毛,照专家所说,这更增加了学习这门语言的难度。即使不难,
一天之内要用一门完全陌生的语言编写并调试运行三个程序,这对我来
说,也是不可能完成的。当然,视频中老师已经把程序代码展示出来了,
但如果单纯抄录下来,也不能真正弄懂其中含义,收益不大。所以,只
好静来心来,从网上找到一些Prolog入门资料,感觉帮助还是挺大的,
在这里总结下来,与大家一起分享。
一、prolog的特点
1.prolog程序没有特定的运行顺序,其运行顺序是由电脑决定的,
而不是编程序的人。
从这个意义上来说,prolog程序不是真正意义上的程序。所谓程序
就是按照一定的步骤运行的计算机指令,而prolog程序的运行步骤不
由人来决定。它更像一种描述型的语言,用特定的方法描述一个问题,
然后由电脑自动找到这个问题的答案。举个极端的例子,我们只需要把
某个数学题目告诉它,它就会自动的找到答案,而不像使用其他的语言
一样,必须人工的编制出某种算法。
2.prolog程序中没有if、when、case、for这样的控制流程语句
前面已经说了,程序的运行方式有电脑自己决定,当然就用不到这些控
制流程的语句了。通常情况下,程序员不需要了解程序的运行过程,只
需要注重程序的描述是否全面,不过prolog也提供了一些控制流程的
方法,这些方法和其他语言中的方法有很大的区别。
3.prolog程序和数据高度统一
在prolog程序中,是很难分清楚哪些是程序,哪些是数据的。事
实上,prolog中的所有东西都有相同的形式,也就是说数据就是程序,
程序就是数据。举一个其他语言的例子:如果想用c语言编写一个计算
某个数学表达式的程序很简单(比如:a=2+54),因为这是一段程序。但
是如果想编写一个计算用户输入的表达式的值的程序就很困难了。因为
用户输入的是一段数据(字符串),如果想让c语言处理这个字符串,就
需要很多方面的技术。则正是因为在c语言中,程序和数据是分开的。
而在prolog就不存在这个问题,我们甚至可以很轻松的编写处理其它
prolog程序的程序。
4.prolog程序实际上是一个智能数据库
prolog的原理就是关系数据库,它是建立在关系数据库的基础上
的。它和SQL数据库查询语言有很多相似之处。使用prolog可以很方
便的处理数据。
5.强大的递归功能
在其它的语言中,我们已经接触过递归程序了。递归是一种非常简
洁的方式,它能够有效的解决许多难题。而在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).
我们可以看出来,完整的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).并不等价。
例子很长,但很有趣,也很浅显,这对我们初学者来说,很容易理
解,也让我们有信心继续深入学习。
以上所写的,希望能对像我一样对prolog语言没有任何基础的老
师们能有所帮助,希望通过学习,我们能在不久的将来能独立完成今天
的作业,能编写出自己的prolog语言程序解决问题。