最近枕头书是《七周七语言:理解多种编程范型》这本,前面两章分别看了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。:吐槽下,冠希哥的名字在博客园竟然被屏蔽掉了。

Prolog学习:用八卦的精神走进Prolog的更多相关文章

  1. Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现

    Asp.net与Dojo交互:仪器仪表实现 项目中需要用到仪器仪表的界面来显示实时的采集信息值,于是便遍地寻找,参考了fusionchart和anychart之后,发现都是收费的,破解的又没有这些功能 ...

  2. Prolog学习:数独和八皇后问题

    上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...

  3. Prolog学习:基本概念

    上一篇对Prolog有了一个感性的认识,今天介绍下Prolog中一些基本概念,想要用Prolog解决一些实际问题之前必须要先了解它们.这些概念在<七周七语言>这本书中都有介绍,我简单提炼汇 ...

  4. 逻辑学与Prolog学习笔记

    int a = 3 + 5; 很自然.如果Matrix a, b要加呢?没有运算符重载,a + b是不行的,只能add(a, b). int a = add(3, 5)也行.如果函数名可以用+呢?+( ...

  5. JavaWeb学习总结第三篇--走进JSP页面元素

    JavaWeb学习(三)—走进JSP页面元素 JSP:Java Server Pages,译为Java服务器页面.其脚本采用Java语言,继承了Java所有优点.JSP元素可以分为指令元素.脚本元素和 ...

  6. 七种Prolog解释器/编译器

    http://blog.sina.com.cn/s/blog_494e45fe0100lh1v.html PROLOG 人工智能领域常用的语言,开发自然语言分析,专家系统,以及所有和智能有关的程序,都 ...

  7. Prolog奇怪奇妙的思考方式

    今天在<七周七语言>中接触到了prolog,发现它的编程模式和思考方式的确比较奇怪,但同时也非常奇妙,值得学习一下. 1. prolog语言介绍     和SQL一样,Prolog基于数据 ...

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

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

  9. 对Prolog的感想和我写的一些教程

    我第一次见到Prolog这门独特的编程语言是在<七周七语言(Seven Languages in Seven Weeks)>中看到的.<七周七语言>名字看起来与市面上什么< ...

随机推荐

  1. Gartner 2018新技术成熟度曲线

    https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/82047719 近日,Gartner发布了2018年新技术成熟度曲线,首次将生物 ...

  2. Python fabric实践操作

    前面学习了理论,下面该练练手了.两台机器:10.1.6.186.10.1.6.159.fabric部署在10.1.6.186上面. 1  执行一个简单的task任务,显示两台机器的/home/guol ...

  3. DIOCP开源项目-数据库连接池的使用<多帐套数据库>

    很久没有写DIOCP的Demo了,主要公司的事情太繁琐,工作之余都不想动了,之前承若的群里面朋友们的DEMO,昨天晚上恶补了一下,把对数据库连接池的操作加入到了Demo中,大家可以通过SVN下载到最新 ...

  4. zookeeper的原理讲解

    留着以后看:http://blog.csdn.net/u010311445/article/category/1677839

  5. IntelliJ IDEA中的properties文件乱码转成中文[unicode码转中文]

    在IntelliJ IDEA中,一些.properties后缀的配置文件中的中文常常会是下面的样子,看不懂怎么办? 解决办法:File-->Settings-->File Encoding ...

  6. 使用ViewPager和Fragment实现滑动导航

    ViewPage是android-support-v4.jar包提供的用于页面滑动的库,android-support-v4.jar是google推荐使用的一个类库,在项目中使用之前,你必须其添加到项 ...

  7. 【神经网络】LSTM 网络

      Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息.LSTM 由Hochreiter & Schmidhuber (199 ...

  8. celery 实例进阶

    认识 这里有几个概念,task.worker.broker.顾名思义,task 就是老板交给你的各种任务,worker 就是你手下干活的人员. 那什么是 Broker 呢? 老板给你下发任务时,你需要 ...

  9. QT-提示“database not open”

    问题现象: 要用QT开发"SQLite"时出现如下提示: QSqlQuery::exec: database not open QSqlDatabase: QSQLITE driv ...

  10. jQuery实现radio第一次点击选中第二次点击取消功能(转)

    转载自:http://www.jb51.net/article/113730.htm 由于项目的需求,要求radio点击两次后为取消状态,不方便修改为checkbox,可以用正面的方法实现. // j ...