解决斑马问题

  • 一、题目简述
  • 二、 解题思路阐述
  • 三、 程序代码
  • 四、 实验运行过程及结果的截图说明
  • 五、 实验体会

一、题目简述

题目被称为“爱因斯坦难题-斑马问题”,具体问题描述如下:

二、 解题思路阐述

本题中有5个不同国家且工作各不相同的人分别住在一条街的5所房子里,根据这个提示,我们要表示出来房子的相对位置关系,并且根据所给的14个条件,找出实验描述的唯一匹配结果,对对象和属性的关系描述显得尤为重要。
我们首先需要明白,住户的国籍、职业、所养的宠物、喜欢的饮品和所居住房子的位置、颜色等属性是需要绑定在一起的,我在一开始尝试了如下的框图所示的逻辑:

本来是想要根据人将题目中的六个属性联系在一起,即分为人的个人属性和住房属性,借此我定义了谓词people(Country, Work, Drink,Pet) 以及房子谓词house(Country, Place, Color) 两个谓词来进行基本属性的书写,其中Country 为两个谓词中的共有属性,但是在解决条件(13):养狐狸的人所住的房子和医生所住的房子相邻时出现了问题,Color 这一属性是house的,而Work职业是属于people个人的,因此在判断相邻和左右的时候,不同类属性的比较,导致逻辑不太严谨,同时由于我对prolog代码的学习程度不够,没能写出相邻和右邻的代码,我将继续学习,争取实现该类解法。
回归正题,之后也是在他人的解法的启发下,将题目中的属性全部并在一起,而房子的相对位置关系,将用一个list来表示,最终能输出所有的实际结果,改变之后的属性逻辑图如下:

根据如上所示,只需要命名一个people谓词即可,其中包含五个属性,people(Country, Work, Pet, Color, Drink)。借此,题目中的五个属性被绑定在了一起,之后解决题目中潜在的关系问题。
房子的位置关系即[1,2,3,4,5],其中编号即代表自左向右对房子的编号,然后1~5都是people,之后将题目中14个条件和2个疑问进行输入,其中确定的输入对应常量即可,而对于不确定的输入下划线表示占位,然后相邻和右邻代码可以同样在列表中表示明白。在所有规则和事实书写完毕后,prolog就可以通过逻辑推断出题目的唯一解,然后输出一个列表,其中people谓词含有不同的属性,根据所需查找就可以得到题目答案。

三、 程序代码

程序解法代码如下:

/*人与五个属性绑定在一块*/
people(Country, Work, Pet, Color, Drink).
/*十分形象的表示出了房子的相对位置关系*/
house(A,[A,_,_,_,_]).
house(A,[_,A,_,_,_]).
house(A,[_,_,A,_,_]).
house(A,[_,_,_,A,_]).
house(A,[_,_,_,_,A]).
/*书写了题目中较为特殊的两个房子位置*/
first(A,[A,_,_,_,_]).
middle(A,[_,_,A,_,_]).
/*书写了相邻关系的列表相对位置*/
beside(A,B,[A,B,_,_,_]).
beside(A,B,[_,A,B,_,_]).
beside(A,B,[_,_,A,B,_]).
beside(A,B,[_,_,_,A,B]).
beside(A,B,[B,A,_,_,_]).
beside(A,B,[_,B,A,_,_]).
beside(A,B,[_,_,B,A,_]).
beside(A,B,[_,_,_,B,A]).
/*右相邻的表示*/
right(A,B,[A,B,_,_,_]).
right(A,B,[_,A,B,_,_]).
right(A,B,[_,_,A,B,_]).
right(A,B,[_,_,_,A,B]).
/*推断所有房子属性,其中包含所有事实*/
find(Houses):-house(people(english,_,_,red,_), Houses),house(people(spanish,_,dog,_,_), Houses),house(people(japanese,painter,_,_,_), Houses),house(people(italian,_,_,_,tea),Houses),first(people(noseman,_,_,_,_),Houses),right(people(_,_,_,green,_), people(_,_,_,white,_),Houses),house(people(_,photographer,snail,_,_), Houses),house(people(_,officer,_,yellow,_),Houses),middle(people(_,_,_,_,milk),Houses),house(people(_,_,_,blue,coffee), Houses),house(people(_,violinist,_,_,orange),Houses),beside(people(_,_,fox,_,_),people(_,doctor,_,_,_),Houses),beside(people(_,_,horse,_,_),people(_,officer,_,_,_),Houses),house(people(_,_,_,_,water),Houses),house(people(_,_,zebra,_,_),Houses).

四、 实验运行过程及结果的截图说明

本问题解决使用的是prolog在线编译平台

截图左边是代码区,我们输入了自己的代码之后,可以在右端输入问题,运行后在上面会输出代码的运行结果,该斑马问题的结果为

[people(noseman, photographer, snail, blue, coffee)people(english, violinist, fox, red, orange),people(spanish, doctor, dog, green, milk),people(japanese, painter, horse, white, water),people(italian, officer, zebra, yellow, tea)]

然后我们将结果做成表格,可以更清楚的看到各个条件的关系。

结论:
根据表格,解决了斑马问题,可以知道,日本人喜欢喝矿泉水,意大利人饲养斑马。

五、 实验体会

进入大学以后,我了解学习到了很多编程语言,其中有基础的C 语言,有功能强大的C++, 也自己学习了python,其中语法规则存在差异,在了解prolog语言之后,我感觉prolog的语法具有更强的逻辑性,更适合我们去思考、学习人对于问题的思考过程。
做完这个实验之后,我更倾向于参加到人工智能研究之中,但同时认识到了自己逻辑推理方面的不足,这也将是我之后努力的方向。在这次实验中,我感受到了prolog语言的魅力,我将在之后的学习生活来继续学习它,相信学习prolog对提升我的计算机水平有很大帮助,我对计算机科学的理解也能在学习的过程中逐步加深。

prolog应用:解决爱因斯坦“斑马”问题相关推荐

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

    使用Prolog编程语言解决爱因斯坦斑马难题 原文链接: http://www.cnblogs.com/lcomplete/p/3192488.html 目前商业上广泛使用的编程语言多是命令式或函数式 ...

  2. C语言编程快速解决爱因斯坦谜题

    C语言编程快速解决爱因斯坦谜题 2012年7月15日 1      问题简介 爱因斯坦谜题(Einstein'sriddle)是很多人熟悉的问题.记得读高中时候就有同学就拿这个题目来考人,不过那时的解 ...

  3. python编程爱因斯坦的问题_教你如何用编程解决爱因斯坦的数学问题

    曾经爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最后剩1阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶.只有每次跨7阶,最后才正好一阶不剩.请问在 ...

  4. 【爱因斯坦谜题】用python基础语法解决爱因斯坦谜题

    今天分享一个困难的谜题 据传是爱因斯坦还年轻时所想出来的 本人自学python已经有一段时间,偶然间了解到了爱因斯坦谜题,就想用已经学过的知识来解决这个谜题,下面我就将我的方法分享给大家. 题目: 有 ...

  5. 用Python解决爱因斯坦的数学问题

    1 问题 有一条阶梯,若每步跨2阶,则剩最后一阶,若每步跨3阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶,则最后剩5阶,只有每次跨7阶,最后才刚好不剩,问1-n,有多少个数能满足. 2 ...

  6. 【人工智能Prolog】Prolog解决数独问题

    Prolog解决数独问题 问题简述 建立Prolog.pl文件 解决数独问题 问题简述 我们尝试使用 Prolog 来解决这道数独问题. 已知可以填充的所有单词为: dog, run, top, fi ...

  7. 符合推理的解决方法 NSlover

    农场里有兔子和鸡若干只,知道共20个头和56条腿.问兔子和鸡各多少只? 我记得以前小学或是初中的时候经常要解类似这样的问题 一般我们的想法是: 设有 X 只鸡 Y只免子 X+Y=20; x*2 +Y* ...

  8. Prolog 语言入门(一)

    Prolog官网手册https://www.swi-prolog.org/pldoc/man?section=quickstart Prolog是一种与众不同的语言,不用来开发软件,专门解决逻辑问题. ...

  9. python爱因斯坦的问题_基于Python3的趣味数学问题

    基于Python3的趣味数学问题 Pro1. 数独(Sudoku)根据九宫格盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个宫(3*3)内的数字均含1-9这9个数字. Pro2 ...

最新文章

  1. Android监听后台状态,退出即杀死并显示退出提示框
  2. 五、开始学习Excel函数,效率快速提高
  3. 3d打印 路径规划_“光博会+工博会”双展来袭!这个9月,知象光电3D视觉工业应用方案,重磅亮相!...
  4. python的合法语句_Python练习2
  5. Increasing Frequency(CF-1082E)
  6. 完整nagios安装最新pnp版绘图-sync模式
  7. 关于 Flutter Layout(转载)
  8. IDEA搭建Maven Web(SSM)项目(二)——jar包引入、jetty服务器配置和ssm配置
  9. Oracle 11g 数据恢复 数据误删除后的恢复 0、执行 select log_mode from v$database;查看是否为归档模式 1、确定删除时间和被删除的表 04-23,GR
  10. 云计算最有利于中小企业
  11. 神经网络硕士就业前景,计算神经科学就业前景
  12. 【精】【爆】MTK手机安装软件游戏大全!新人必看
  13. 将html转成pdf加水印,HTML页面转PDF加水印解决截取不全问题
  14. 心智成熟的道路虽然辛苦,却是实打实的进步,因为你的每一次迈进,朝向的都是自我实现,也是人之所以为人的价值所在
  15. 海报看起来很普通?数字平原概念设计来制作
  16. 算法习题---5-3卡牌游戏(UVa10935)
  17. JavaWeb - 软件开发的流程,综合案例
  18. 路边电动车快充多少安?知识介绍
  19. 常用的HTTP请求方法
  20. ARM neon详解

热门文章

  1. 关于安装Adobe Illustrator AI CC 2017中遇到的问题总结
  2. OFD查验~看OFD 用超阅
  3. 用邻接表表示图【java实现】
  4. 微信、QQ、电话下单,在线订货系统助企业走出困局
  5. [Android]使用HorizontalScrollView实现广告栏Banner及相关原理分析
  6. pandas合并dataframe
  7. 前端公共图表数据大盘方案
  8. c语言停车场管理系统源代码,C语言课程设计 停车场管理系统 源代码 原创 不得随意转载...
  9. UG_NX曲面造型概述
  10. 哪个软件可以免费pdf转word?可以pdf转word的软件分享给你