使用Prolog编程语言解决爱因斯坦斑马难题

原文链接:

http://www.cnblogs.com/lcomplete/p/3192488.html


目前商业上广泛使用的编程语言多是命令式或函数式的编程语言,这些语言在某些方面具有很高的相似度,比如 python 和 ruby 在很多地方是相通的,学会了一门,再学另一门便能够事半功倍,很多语言都是如此,然而今天要介绍的这门语言,却跟主流编程语言截然不同,它就是prolog——一门逻辑编程语言。

prolog 是 Programming in Logic 的缩写,它被广泛应用在人工智能、自然语言等研究领域,使用它来解决逻辑难题完全不在话下,今天我们将使用它来解决着名的爱因斯坦逻辑难题(斑马难题),首先让我们来认识一下 prolog 的语法。

prolog 基本语法

prolog 中有3种基本元素:事实、规则和查询。事实和规则用于描述数据,查询用于获取问题的答案。
我们可以这样定义事实:

human(lucy).
human(lili).
father(lucy,david).
sister(lucy,lili).
sister(lili,lucy).

这段代码表示 lucy 和 lili 是人类,且她们是姐妹,david 是 lucy 的父亲,继续定义规则:

daughter(Father,A,B) :-father(A,Father), sister(A,B)

这段规则表示对于变量A、B,如果Father变量是A的父亲,且A、B是姐妹,则A、B是Father对象的女儿。 
注意,在 prolog 中一个词若以小写开头,那么它是一个固定值,若以大写字母开头,则是一个变量。 
将这些事实和规则放在一个文件里面,在命令行下打开 prolog ,对这个文件进行编译,即可提出查询,比如 daughter(david,A,_),prolog 将会求出A可能的取值并输出到控制台,最后的下划线是一个占位符,不会进行求值。

在 prolog 中还可以使用递归完成列表和数学等运算,这部分是很强大的,但这里不打算讲,因为有了上面的基础知识后,我们就可以利用它来解决逻辑问题了,下面就让我们来解决“斑马难题”吧。

爱因斯坦逻辑难题

题目:5个不同国家且工作各不相同的人分别住在一条街上的5所房子里,每所房子的颜色不同,每个人都有自己养的不同宠物,喜欢喝不同的饮料。根据以下提示,你能告诉我哪所房子里的人养斑马,哪所房子里的人喜欢喝矿泉水吗?

  1. 英国人住在红色的房子里
  2. 西班牙人养了一条狗
  3. 日本人是一个油漆工
  4. 意大利人喜欢喝茶
  5. 挪威人住在左边的第一个房子里
  6. 绿房子在白房子的右边
  7. 摄影师养了一只蜗牛
  8. 外交官住在黄房子里
  9. 中间那个房子的人喜欢喝牛奶
  10. 喜欢喝咖啡的人住在绿房子里
  11. 挪威人住在蓝色的房子旁边
  12. 小提琴家喜欢喝橘子汁
  13. 养狐狸的人所住的房子与医生的房子相邻
  14. 养马的人所住的房子与外交官的房子相邻

这道题的解题关键在于,要以一种清晰的方式将每个房子相关的属性(国家、颜色、工作、宠物、饮料、编号)列出来,前面5个提示中包含了5个国家,那么可以利用这一点画出一个表格,每一行表示一个国家,每一列表示房子的一种属性。一步步根据提示得到一些推论,将结果填入表格,答案便渐渐清晰起来,使用这种人工方式推理的结果如下图所示:

虽然我们知道了解题的关键,但这个问题仍然需要经过很多步的推导才能得出结果,如果使用 prolog 那得到这个问题的答案就简单多了,只需要定义好事实和规则,然后向 prolog 提出问题,逻辑引擎就会为我们查出结果来。

下面是解决这个问题的 prolog 代码。

house(A,[A,_,_,_,_]).
house(A,[_,A,_,_,_]).
house(A,[_,_,A,_,_]).
house(A,[_,_,_,A,_]).
house(A,[_,_,_,_,A]).right(A,B,[A,B,_,_,_]).
right(A,B,[_,A,B,_,_]).
right(A,B,[_,_,A,B,_]).
right(A,B,[_,_,_,A,B]).middle(A,[_,_,A,_,_]).first(A,[A,_,_,_,_]).neighbor(A,B,[A,B,_,_,_]).
neighbor(A,B,[_,A,B,_,_]).
neighbor(A,B,[_,_,A,B,_]).
neighbor(A,B,[_,_,_,A,B]).
neighbor(A,B,[B,A,_,_,_]).
neighbor(A,B,[_,B,A,_,_]).
neighbor(A,B,[_,_,B,A,_]).
neighbor(A,B,[_,_,_,B,A]).attr(Country,Pet,Color,Drink,Work).all_houses(Houses) :-house(attr(britsh,_,red,_,_), Houses),house(attr(spain,dog,_,_,_), Houses),house(attr(japan,_,_,_,painter), Houses),house(attr(italy,_,_,tea,_), Houses),house(attr(norway,_,_,_,_), Houses),first(attr(norway,_,_,_,_), Houses),right(attr(_,_,white,_,_), attr(_,_,green,_,_), Houses),house(attr(_,snail,_,_,photographer), Houses),house(attr(_,_,yellow,_,diplomat), Houses),middle(attr(_,_,_,milk,_), Houses),house(attr(_,_,green,cafe,_), Houses),neighbor(attr(norway,_,_,_,_), attr(_,_,blue,_,_), Houses),house(attr(_,_,_,orange,violinst), Houses),neighbor(attr(_,fox,_,_,_), attr(_,_,_,_,doctor), Houses),neighbor(attr(_,horse,_,_,_), attr(_,_,_,_,diplomat), Houses),house(attr(_,zebra,_,_,_), Houses),house(attr(_,_,_,water,_), Houses).

在事实部分,将房子看做一个整体,描述了房子在5所房子中、房子的左右关系、中间的房子处于什么位置、第一所房子处于什么位置、房子间的相邻关系以及每所房子拥有哪些属性。
规则部分包含了对题目中提示的描述和最终问题的描述,这些定义是为了告诉逻辑引擎,在求值时必须满足这些条件。
最终的查询为 all_houses(A) ,prolog 逻辑引擎将会查找出满足结果的房子数组,注意每所房子由它的属性组成,这样最后得到的结果为:

[attr(norway, fox, yellow, water, diplomat), 
attr(italy, horse, blue, tea, doctor), 
attr(britsh, snail, red, milk, photographer), 
attr(spain, dog, white, orange, violinst), 
attr(japan, zebra, green, cafe, painter)] .

使用Prolog编程语言解决爱因斯坦斑马难题相关推荐

  1. prolog应用:解决爱因斯坦“斑马”问题

    解决斑马问题 一.题目简述 二. 解题思路阐述 三. 程序代码 四. 实验运行过程及结果的截图说明 五. 实验体会 一.题目简述 题目被称为"爱因斯坦难题-斑马问题",具体问题描述 ...

  2. 引导直觉解决数学猜想难题,DeepMind登上《Nature》封面

    来源:机器之心 编辑:nhyilin 多年来,数学家们一直使用计算机来生成数据以帮助搜索数学模式,这种被称为实验数学的研究方法产生出许多重要的猜想,例如BSD猜想.虽然这种方法已经取得成功并且相当普遍 ...

  3. 深度RNN解决语义搜索难题

    深度RNN解决语义搜索难题 2016-08-15 22:34 转载 CSDN 0条评论 雷锋网(搜索"雷锋网"公众号关注)按:本文作者张俊林,主要介绍了3种基于深度RNN的语义搜索 ...

  4. 采用python解决实际问题_Python编程语言解决几种常见的实际问题

    Python编程语言解决几种常见的实际问题 (2012-10-25 17:24:12) 标签: it python python培训 北京 杂谈 Python编程语言解决一些实际问题 from os. ...

  5. 十年磨一剑,王坚自研的MaxCompute如何解决世界级算力难题

    大数据时代,随着企业数据规模的急剧增长,传统软件已无法承载,这也推动了大数据技术的发展,Google.AWS.微软等硅谷巨头纷纷投入大数据技术的研发:而在国内,王坚也在十年前带领阿里云团队研发MaxC ...

  6. 法兰克机械手手动操作_吸盘搬运机械手,一步解决玻璃搬运难题!

    玻璃是一种易碎品,所以连保险公司都不敢轻易承保玻璃运输业务.如果要保证玻璃制品完好无损的的搬运到指定位置,就必须做好防护.江阴同力工业生产的搬运机械手,可以有效解决玻璃搬运难题. 玻璃真空吸盘机械手的 ...

  7. 零信任能彻底解决邮件安全难题

    零信任是一个安全概念,就是不信任任何人和物,这虽然不是一项新技术,但这是一个创新的安全理念,为当今的数字化转型时代的网络安全发展指明了明确的方向.特别是目前的全球疫情时期,远程办公已经成为常态.据微软 ...

  8. 小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题

    小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题 原创 韦东山 百问科技 1周前 上周四我们预告了这周要发布环境搭建的终极解决方案,经过一周的努力,终于写好了文档,Ubunt ...

  9. 企业数据打通有什么好处?不同行业怎么解决数据打通难题?

    企业数据打通有什么好处?不同行业怎么解决数据打通难题? 企业大数据来源于互联网.企业系统ERP.金蝶.Excel表格和物联网等信息系统,经过大数据治理系统的分析发掘,产生新的知识支撑企业决策和业务智能 ...

最新文章

  1. 数据挖掘和机器学习:基本概念和算法(附电子书PPT)
  2. 关于阻塞I/O 非阻塞I/O 同步I/O 异步I/O epoll select的学习
  3. 由旋转画廊,看自定义RecyclerView.LayoutManager
  4. python random.seed()函数 (生成固定随机数)random.seed(None)(取消固定随机数种子)
  5. ActiveMQ的自定义安全插件(十)
  6. vue-cli3中安装lib-flexible和px2rem
  7. CDN加速小水管动态应用技巧
  8. impala sql清单
  9. 深入理解 sudo 与 su 之间的区别【转】
  10. eprime2.0 倒计时功能
  11. 高赞 GitHub 项目盘点:给力的 Spring 教程
  12. 静止轨道卫星几何校正——FY-4A几何校正(风云系列静止卫星可以参考)
  13. ADB投屏_智能安全帽出厂配置调测工具最优之选:投屏神器Qtscrcpy
  14. UE4搭建场景与特效文档—地形、水体、植被、雨雾效果
  15. 大数据工程应用 数据分析_大数据工程的方式
  16. 关于outlook不能发送126邮件的问题
  17. 灵感专题—2019年优秀网页设计作品赏析#4月
  18. 2.57亿美元:纸币打破了ICO资金的全部记录
  19. 【web安全】——文件上传的绕过方式
  20. Unity 如何使用Edit Script (the script is an edit script)

热门文章

  1. 永磁同步电机矢量控制(八)——弱磁控制(直接计算法)
  2. 如何制作符号文件(.sig文件)
  3. ProcessDB实时/时序数据库——EXCEL连接数据库
  4. 百度人脸识别 返回json 数据提取
  5. apple pay支持的银行有哪些?如何绑定银行卡?
  6. python操作abaqus建模教程①
  7. 项目:广告点击预测率评估
  8. 【读书笔记】《你有你的计划世界另有计划》——达·芬奇诅咒
  9. 基于NXP iMX6ULL 扩展音频解码器 MAX98357A
  10. web图书销售管理系统_图书进销存管理软件的优势是什么?