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

Prolog系列学习-1相关推荐

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

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

  2. prolog_如何通过观看权力的游戏学习Prolog

    prolog by Rachel Wiles 瑞秋·威尔斯(Rachel Wiles) 如何通过观看权力的游戏学习Prolog (How to learn Prolog by watching Gam ...

  3. 状态机系列学习笔记01

    状态机系列学习笔记01 有限状态机(FSM)概念 定义 总的来说,有限状态机系统,是指在不同阶段会呈现出不同的运行状态的系统,这些状态是有限的.不重叠的.这样的系统在某一时刻一定会处于其所有状态中的一 ...

  4. MINA系列学习-IoAccpetor

    MINA系列学习-IoAccpetor 其实在mina的源码中,IoService可以总结成五部分service责任.Processor线程处理.handler处理器.接收器和连接器,分别对应着IoS ...

  5. Prolog基本程序

    编辑下面代码: male(di). male(jianbo). female(xin). female(yuan). female(yuqing). father(jianbo,di). father ...

  6. Prolog 语言入门

    Prolog 就是"逻辑编程"(programming of Logic)的意思.只要给出事实和规则,它会自动分析其中的逻辑关系,然后允许用户通过查询,完成复杂的逻辑运算. 很适合 ...

  7. CUDA系列学习(五)GPU基础算法: Reduce, Scan, Histogram

    喵~不知不觉到了CUDA系列学习第五讲,前几讲中我们主要介绍了基础GPU中的软硬件结构,内存管理,task类型等:这一讲中我们将介绍3个基础的GPU算法:reduce,scan,histogram,它 ...

  8. CUDA系列学习(四)Parallel Task类型 与 Memory Allocation

    本文为CUDA系列学习第四讲,首先介绍了Parallel communication patterns的几种形式(map, gather, scatter, stencil, transpose), ...

  9. CUDA系列学习(三)GPU设计与结构QA coding练习

    啥?你把CUDA系列学习(一),(二)都看完了还不知道為什麼要用GPU提速? 是啊..经微博上的反馈我默默感觉到提出这样问题的小伙伴不在少数,但是更多小伙伴应该是看了(一)就感觉离自己太远所以赶紧撤粉 ...

最新文章

  1. 管道 过滤器风格 java_完成基于管道过滤器风格的KWI实现.doc
  2. C# HasRows 和 Read的区别
  3. Java中怎样遍历Map的所有数据
  4. Vue_VueResource
  5. markdown与word相互转换的快捷方法
  6. centos安装mysql8.0.13_CentOS 7.4安装MySql 8.0.13及配置
  7. java数组实验心得体会_学习JAVA之数组小结
  8. 2.4 理解指数加权平均
  9. 推箱子 (hdu1254)(bfs双重广搜)
  10. 《阿甘正传》英文原版剧本(场景+台词)(看电影学英语的最佳材料)
  11. 八岁时我弄丢长命锁,七年后他说保我长命无忧
  12. 遮罩层 遮挡不住 flash曲线的解决办法
  13. mac php7.2,MAC下更新自带的PHP版本到7.2
  14. 五、C语言创建桌面程序:画笔和画刷
  15. 深度优先搜索和深度优先搜索的区别
  16. Android选项卡
  17. ASEMI代理艾赛斯IGBT管IXYB82N120C3H1
  18. 沿用供应商批号进行批号管理的优劣分析
  19. 简单分析Java中审批业务流程业务原理
  20. BIM云协同时代来临,再不跟上就晚了

热门文章

  1. Button 按钮的点击时候出现蓝色边框
  2. 2021年10月24日马丁加德纳聚会线上主题分享开启通知
  3. 任天堂服务器维护2021,《怪物猎人:崛起》太火爆 任天堂服务器紧急维护
  4. 游戏同步方案——帧同步
  5. 组件分享之后端组件——用于将日志写入滚动文件的组件包lumberjack
  6. 高级语言.汇编语言和机器语言
  7. 战地五多计算机登录账户,玩战地5电脑配置要求
  8. CultureInfo 类中需要的【区域性名称】查询
  9. 正交子空间投影的学习笔记
  10. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群