最近枕头书是《七周七语言:理解多种编程范型》这本,前面两章分别看了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. Android各版本代号、版本号、API/NDK级别、发布时间及市场份额

    Android各版本代号.版本号.API/NDK级别.发布时间及市场份额 代号 版本号 API/NDK级别 发布时间 - O 8.0 API level 26 2017-3-21 牛轧糖 Nougat ...

  2. (原创)c++11改进我们的模式之改进表驱动模式

    所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值.表驱动是将一些通过较为复杂逻辑语句来得到数据信息的方式,通过查询表的方式来实现,将数据信息存放在表里.对于消除 ...

  3. 李洪强iOS经典面试题

    李洪强iOS经典面试题 1. struct和class的区别 swift中,class是引用类型,struct是值类型.值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指 ...

  4. iOS开发-Tom猫

    // //  ViewController.m //  20-tom猫 // //  Created by hongqiangli on 2017/8/1. //  Copyright © 李洪强. ...

  5. [开源项目-MyBean轻量级配置框架] 使用MyBean快速搭建分模块的应用程序(主页面的TAB)(DLL-MDI)

    [概述] 抱歉由于上次开源比较匆忙,没有来的及做一个DEMO,里面也有些垃圾的文件没有及时清理.DEMO其实昨天晚上已经调通.相关说明文档今天晚上才说明好,欢迎大家继续关注和交流,和大家一起分享我10 ...

  6. 【教程】InstallShield使用完全教程

    InstallShield Installshield是一个强大和易于使用,用于解决Windows软件安装包开发的制作工具.用它可以以传统MSI方式和虚拟格式,自动化地封装.捆绑和包装你的产品. In ...

  7. javascript中json对象长度

    JSON中无法使用length去获取长度,length只针对数组对象适用: var data={"showdata":{"中国人民大学":{"2013 ...

  8. [转]SpringMVC<from:form>表单标签和<input>表单标签简介

    原文地址:https://blog.csdn.net/hp_yangpeng/article/details/51906654 在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标 ...

  9. JQUERY根据值将input控件选中!

    <select>: $('#country').find("option[value = " + data.country + "]").attr( ...

  10. C语言 · 求arccos值

    算法提高 7-2求arccos值   时间限制:10.0s   内存限制:256.0MB      问题描述 利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[- ...