(转)Prolog教程 1

今天是2019年1月1日, 因为AI课要用到Prolog, 看到不错的入门教程收录下来学习。

如果你是一位prolog的新手,希望你首先阅读这篇文章,好对prolog的全局有个了解。在这篇文章中我会把prolog和其他的程序语言做比较,所以希望你已经具有了一定的编程水平。

什么是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).

我们可以看出来,完整的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

好了,你自己分析一下为什么会是这样的答案吧。

为什么要prolog

看完上面的例子,不知道是否提起了你对prolog的兴趣。如果你感兴趣的话,那么让我们继续来看prolog能够做一些什么事情吧。

理论上来说使用c语言可以编制任何种类的程序,甚至连prolog语言都是使用c语言编写的。不过对于急于开发应用程序的用户,最关心的是如何最经济最有效率的开发程序,prolog为你多提供了一个选择的余地。

prolog很适合于开发有关人工智能方面的程序,例如:专家系统、自然语言理解、定理证明以及许多智力游戏。曾经有人预言prolog将成为下一代计算机的主要语言,虽然这个梦想目前还很难实现,不过世界上已经有许多prolog的应用实例了。你要坚信,它绝对不是那种只在实验室发挥作用的语言,之所以大多数人都不了解它,是因为它的应用范围比较特殊而已。

prolog有许多不足之处,但是这并不影响它在逻辑推理方面的强大功能,不过最好的方法是使用某种一般语言和prolog结合,一般语言完成计算、界面之类的操作,而prolog则专心实现逻辑运算的操作。例如:你编写一个下棋程序,用prolog来让电脑思考如何下棋,而用Visual Basic来编写界面。我们将在以后介绍这方面的技术。

总之,prolog在许多方面将极大的减少你的编程负担,所以赶快来了解一下它吧, 也许你日后遇到什么难题,可以使用prolog迎刃而解,到那个时候,你就知道今天的学习没有白费了。

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解释器,下一节我将就解释器进行一些讨论。

  2. 然后你必须熟练的掌握解释器的使用方法。

  3. 然后就可以开始阅读我的教程了。

  4. 当你学习完整个教程以后,希望你能够进入人工智能实例环节,那里有更多的、更有用的prolog编程方法,和有趣的程序。

  5. 如果你想使用prolog和其它的语言结合起来,编写让人瞠目结舌的又聪明、又漂亮的程序,你就应该仔细研究VB+prolog这一节。

Prolog教程 1相关推荐

  1. Atitit.5gl 第五代语言编程语言 PROLOG教程  人工智能语言的标准 与实现

    Atitit.5gl 第五代语言编程语言 PROLOG教程  人工智能语言的标准 与实现 1. 第五代语言就是自然语言又被称为知识库语言或人工智能语言,1 2. 人工智能语言特点2 2.1. 试探法2 ...

  2. Prolog教程 16

      Prolog特别适合开发自然语言的应用系统.在这一章,我们将为寻找Nani游戏添加自然语言理解的部分.(由于Prolog谓词是使用的英文符号,所以这里的自然语言理解只能局限在英文中) 在着手于编制 ...

  3. Prolog教程 3

    facts, predicate, pred(arg1,arg2,-argN). argument type: interger, atom( low case begin, ' '), variab ...

  4. Prolog教程 14--cut的功能

    cut,使用符号!来表示. 直到目前为止,我们都一直在使用Prolog内建的回溯功能.使用此功能可以方便地写出结构紧凑的谓词来. 但是,并不是所有的回溯都是必须的,这时我们需要能够人工地控制回溯过程. ...

  5. Prolog教程 5

      我们可以把简单的查询连接起来,组成一些较复杂的查询.例如,如果我们想知道厨房里能吃的东西,就可以向Prolog进行如下的询问. ?- location(X, kitchen), edible(X) ...

  6. Prolog教程 4

      现在我们的游戏中已经有了一些事实,使用Prolog的解释器调入此程序后,我们就可以对这些事实进行查询了.本章和下一章中的Prolog程序只包括事实,我们要学会如何对这些事实进行查询. Prolog ...

  7. Prolog教程 7

      到现在为止,我们已经对Prolog有了一个基本的了解,现在有必要对我们所学过的知识做一个系统的总结. Prolog的程序是由一系列的事实和规则组成的数据库. 规则之间的调用是通过联合操作完成的,P ...

  8. Prolog教程 9

    Prolog的程序就是谓词的数据库,我们通常把这些谓词的子句写入Prolog的程序中的.在运行Prolog时,解释器首先把所有的子句调入到内存中.所以这些写在程序中的子句都是固定不变的.那么有没有办法 ...

  9. Prolog教程 10

    到目前为止,所介绍的事实.查询以及规则都使用的是最简单的数据结构.谓词的参数都是原子或者整数,这些都是Prolog的基本组成元素.例如我们所使用过的原子有: office, apple flashli ...

最新文章

  1. Django+Bootstrap+Mysql 搭建个人博客(五)
  2. autofs一个神奇的服务
  3. axios请求五种方法
  4. UA MATH564 概率论VI 数理统计基础4 t分布
  5. Spring boot配置Servlet容器
  6. C#中Split用法 转
  7. List去重为什么要写equals(),hashCode()方法
  8. 全景摄像技术大有可为
  9. Multi-thread--多线程运行实例
  10. vue中使用axios发送请求(二)
  11. 用R和BioConductor进行基因芯片数据分析(三):计算median
  12. ECNU·AntNLP主页船新上线!
  13. Inno Setup 操作XML
  14. escape()方法和unescape()方法
  15. 河北安新复合型水稻 国稻种芯·中国水稻节:雄安生态示范区
  16. 本地计算机无法启动dhcp服务,Windows10无法启用dhcp服务怎么办?
  17. win7与VMware/VBox下linux共享文件夹方法
  18. 教程篇(7.0) 06. FortiGate基础架构 单点登录(FSSO) ❀ Fortinet 网络安全专家 NSE 4
  19. 动态和静态查看一个进程的内存使用
  20. 嵌入式开发者技能大全

热门文章

  1. 继电器线圈泄放电路及触点RC吸收电路
  2. Android应用数字签名详解
  3. movielens数据集导入mysql_GitHub - Colaplusice/movielens_recommend: 基于movielens数据集的电影推荐系统...
  4. 如何在windows10中查看与其他的电脑或者服务器通不通
  5. python 边界_如何在python中获取图像的边界像素?
  6. visual studio for mac
  7. [车联网安全自学篇] Android安全之Android工程模式
  8. windows 10系统下安装Hadoop
  9. 流网络的最小割问题c语言,网络流基础-最大流最小割定理
  10. 多IP地址集合的合并