最近枕头书是《七周七语言:理解多种编程范型》这本,前面两章分别看了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. Python3之pymysql导入mysql

    $cat insert.py #!/usr/bin/python # -*- coding: UTF-8 -*- import os import sys import datetime import ...

  2. js判断是否安装flash player及当前版本 和 检查flash版本是否需要升级

    一.js检查flash版本升级 for (var i = 0, len = navigator.plugins.length; i < len; i++) { var plugin = navi ...

  3. WebService中方法的重载

    阅读目录 一:WebService中的方法是否允许重载? 二:为什么WebService中不支持方法的重载? 三:如何解决WebService中方法的重载? 一:WebService中的方法是否允许重 ...

  4. django 利用PIL 保存图片

    在使用django时不知道怎么保存图片,又不想用它的form ,在网上找了许久,终于找到个解决方案,利用PIL.image 将POST上来的图片保存到media目录下,然后再修改models from ...

  5. 【密码学】RSA公钥密码体制

    RSA公钥密码体制是美国麻省理工学院(MIT)的三位科学家Rivest.Shamir.Adleman于1978年提出的,简称RSA公钥秘密系统.实际上,RSA稍后于MH背包公钥密码实用系统,但它的影响 ...

  6. tf.placeholder

    tf.placeholder placeholder( dtype, shape=None, name=None ) 功能说明: 是一种占位符,在执行时候需要为其提供数据 参数列表: 参数名 必选 类 ...

  7. django 事务错误 -- Transaction managed block ended with pending COMMIT/ROLLBACK

    Request Method: GET Request URL: http://192.168.128.111:8000/×××/××××/ Django Version: 1.4.8 Excepti ...

  8. .net System.IO之Stream的使用详解

    本篇文章是对.Net中System.IO之Stream的使用进行了详细的分析介绍,需要的朋友参考下 Stream在msdn的定义:提供字节序列的一般性视图(provides a generic vie ...

  9. [Linux实用工具]munin-node插件配置和插件编写

    前面介绍了2篇munin使用的相关文章: [Linux实用工具]Linux监控工具munin的安装和配置 [Linux实用工具]Linux监控工具munin的展示(Nginx)   这次介绍一下mun ...

  10. Emacs代码折叠

    进入HideShow mode: M-x hs-minor-mode(幸亏有tab键..要不这么长的命令=.=) 主要的功能: * C-c @ C-M-s 显示所有的代码 * C-c @ C-M-h ...