zoukankan      html  css  js  c++  java
  • Prolog学习:用八卦的精神走进Prolog

    最近枕头书是《七周七语言:理解多种编程范型》这本,前面两章分别看了Ruby和IO,都是命令式语言。虽然它们在语法上跟之前接触过的C,C#,Java这些C家族的语言差别很大,但是编程范型却是一致的。Ruby是纯面向对象的一门语言,再熟悉不过了,IO是基于原型的语言,之前也稍微接触过javascript所以理解起来也不会太困难,也正是因为命令式语言、面向对象之前经常接触,所以虽然这两门语言对我来说很新鲜但是却是没有达到让我很兴奋,很激动(大多数时候是因为没看懂。兴奋点也还是有的,比如Ruby中的method_missing,IO中的yield)。

    昨天晚上看到Prolog的时候终于让我有了“初恋”的感觉,迫不及待的想试试手,以前我们了解一门语言写的第一个程序基本都是Hello World,但是对于Prolog来说Hello World确实无法体现它的特点,所以我们……先看一张图吧:

    我本不是一个爱八卦的人,今天就为了Prolog八一八吧,这张图看似复杂其实一根跟连线描述的都是一个个事实,以程序员的思维换成像下面这样来描述应该都是能够理解的:

    旧爱(王菲,窦唯)
    旧爱(王菲,谢霆锋)
    旧爱(李亚鹏,周迅)
    旧爱(李亚朋,瞿颖)
    旧爱(周迅,朴树)
    旧爱(周迅,李大齐)
    旧爱(周迅,窦鹏)
    旧爱(chenguanxi,张柏芝)
    绯闻(谢霆锋,周迅) 离异(王菲,李亚鹏) 离异(王菲,窦唯) 离异(张柏芝,谢霆锋) 离异(张亚东,窦颖) 旧友(chenguanxi,谢霆锋)

    每一行都描述了两个人事实上的关系。面对这些关系,我想很多人都有很多问题或者说是猜测。试想王菲和李亚鹏离婚后有一天在大街上撞上周迅,王菲会是什么样的一种眼神。我假设满足下面这种情况都存在这样的眼神:

    如果甲和乙已经离异,乙和丙曾经相爱,那么甲就会以一种特殊的眼神看丙。

    那么上面这个人物关系中,哪些人之间会存在这种情况呢?下面我们用Prolog来描述这个问题,首先将那些事实用Prolog进行描述(:Prolog不能有中文,小写开头代表符号,大小或下划线开头代表变量):

    jiuai(wangfei,douwei).
    jiuai(wangfei,xietingfeng).
    jiuai(liyapeng,zhouxun).
    jiuai(liyapeng,quyin).
    jiuai(zhouxun,pushu).
    jiuai(zhouxun,lidaqi).
    jiuai(zhouxun,doupeng).
    jiuai(chengguanxi,zhangbozhi).
    liyi(wangfei,liyapeng).
    liyi(wangfei,douwei).
    liyi(zhangbozhi,xietingfeng).
    liyi(zhangyadong,douyin).
    jiuyou(chenguanxi,xietingfeng).

    注意:每行结束的“.”是必须的,在Prolog中它标识着一个事实的结束。上面那条的规则在Prolog是这样描述的:

    yanshen(X,Y):- liyi(X,Z),jiuai(Z,Y).
    

    “:-”表示如果的意思,“,”表示且的关系,同样末尾的句点不能省略。这句话的意思是“如果X和Z离异了,并且Z和Y是旧爱的关系,那么X就会以一种特殊的眼神看Y”。

    好了代码写好了,将上面的代码保存成yansen.pl。你可能很好奇这样的代码是怎么运行的?不要着急得下载安装一下Prolog的运行环境,可以使用GNU Prolog,点这里。我安装的是compiled under x86_64 / Windows 7 with MinGW64 gcc under Cygwi。安装后是下面这样一个界面:

    选择File-->Consult...打开yanshen.pl文件:

    如图出现yes就说明编译成功了,下面就到了我们运行程序的时候了,运行Prolog程序其实是一个问问题的过程。“上面这个人物关系中,哪些人之间会存在这种眼神?”我们可以这样问:

    yanshen(Who1,Who2).

    答案是:王菲和周迅,王菲和瞿颖。(:使用;号进行追问直到没有结果了会返回no)。

    我们也可以这样问:“王菲会以这样的眼神看谁?”

    yanshen(wangfei,Who).
    

    还可以这样问:“谁看周迅会有这种眼神?”

    yanshen(Who,zhouxun).

    ……

    OK,今天的“Hello World”程序就写都这里了,是不是很简单,我没有介绍Prolog的语法,只是向大家简单的展示下它是如何工作的。要想学好Prolog你要学会问问题,对于所有问题Prolog最终都会有一个yes或no的回答,当然问问题之前得摆清事实,理顺逻辑,Prolog正是一门基于逻辑的语言。

    我并没有八卦,八卦的是Prolog。:吐槽下,冠希哥的名字在博客园竟然被屏蔽掉了。

  • 相关阅读:
    学习:类和对象——构造函数和析构函数
    学习:类和对象——封装
    学习:引用类型
    学习:内存分区模型
    实现:通讯录管理系统
    实现:结构体案例
    学习:结构体
    实现:指针和冒泡函数和数组
    学习:指针
    学习:函数的分文件编写
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/3329647.html
Copyright © 2011-2022 走看看