爱因斯坦斑马问题实验

实验要求

确定性推理作业:设计一 Prolog 程序解决以下问题。
题目:有 5 间不同颜色的房间,每间住个不同国籍的人,每人有自己喜欢的饮料、香烟和宠物。已知信息:
英国人在红房间中
西班牙人有一条狗
挪威人住在左边第一间房里
黄房间中的人在抽库尔斯牌香烟
抽切斯菲尔德牌香烟的人是养了一只狐狸的人的邻居
挪威人住在蓝房间隔壁
抽温斯顿牌香烟的人有一只蜗牛
抽幸运牌香烟的人喝橘子汁
乌克兰人喝茶
日本人抽国会牌香烟
抽库尔斯牌烟的房间在有匹马的房间隔壁
绿房间中的人喝咖啡
绿房间在白房间的左边
中间房间的人喝牛奶
要求:试编程推理出各房间的颜色,以及每个客人所住的房间、各自的国籍、抽什么版的香烟、喝什么饮料、养的什么宠物。最终提交的作业要写明题意,给出程序清单和执行结果。程序中应有必要的注释说明。

实验分析

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

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

实验步骤

实验代码(Prolog实现)

/*描述房子的事实:建立五个房间*/
house(A,[A,_,_,_,_]).
house(A,[_,A,_,_,_]).
house(A,[_,_,A,_,_]).
house(A,[_,_,_,A,_]).
house(A,[_,_,_,_,A]).
/*描述房子的事实:建立房间之间的位置关系(left)*/
left(A,B,[A,B,_,_,_]).
left(A,B,[_,A,B,_,_]).
left(A,B,[_,_,A,B,_]).
left(A,B,[_,_,_,A,B]).
/*描述房子的事实:标记中间的房间(middle)*/
middle(A,[_,_,A,_,_]).
/*描述房子的事实:标记第一个房间(first)*/
first(A,[A,_,_,_,_]).
/*描述房子的事实:建立房间之间的邻居关系(neighbor)*/
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]).
/*建立人的五个属性*/
people[Country,Pet,Color,Drink,Smoke].
/*根据题目所给的信息描述房间分配的规则*/
find(Houses) :-
house(people(britsh,_,red,_,_), Houses),
house(people(spain,dog,_,_,_), Houses),
house(people(japan,_,_,_,congressCigarettes), Houses),
house(people(ukraine,_,_,tea,_), Houses), house(people(norway,_,_,_,_), Houses),
first(people(norway,_,_,_,_), Houses),
left(people(_,_,green,_,_), people(_,_,white,_,_), Houses),
house(people(_,snail,_,_,winstonCigarettes), Houses),
house(people(_,_,yellow,_,coorsCigarettes), Houses),
middle(people(_,_,_,milk,_), Houses),
house(people(_,_,green,cafe,_), Houses),
neighbor(people(norway,_,_,_,_), people(_,_,blue,_,_), Houses),
house(people(_,_,_,orange,luckCigarattes), Houses),
neighbor(people(_,fox,_,_,_), people(_,_,_,_,chesfieldCigarettes), Houses),
neighbor(people(_,horse,_,_,_), people(_,_,_,_,coorsCigarettes), Houses),
house(people(_,zebra,_,_,_), Houses),
house(people(_,_,_,water,_), Houses).

代码运行

运行环境:Prolog在线编译平台
输入问题:

?-find(X).



可见显示出的结果和我们之前分析的是一致的。

实验总结

建立人的五个属性时需要使用方括号“[]”,对变量进行处理,不能使用“()”,否则属性会被作为常量无法修改,从而报错无法执行。

people[Country,Pet,Color,Drink,Smoke].

用Prolog解决爱因斯坦斑马问题相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. BootStrap字体图标不显示、下拉菜单不显示
  2. 【计算机网络】应用层 : DNS 域名解析系统 ( 域名 | 域名服务器 | 域名解析过程 | 递归查询 | 迭代查询 | 高速缓存 )
  3. mac redis 链接_在Ubunt/Mac系统安装Redis以及设置Redis密码并且允许远程连接 - Laravel学习网...
  4. 基于struts2+hibernate+spring(ssh2)的登录验证码的实现
  5. mysql镜像备份和同步备份_mysql 主从同步及备份
  6. python模块下载失败_ubuntu16.04安装python的requests模块失败,怎么解决?
  7. java 循环间隔执行一次,每隔Java运行一次循环
  8. EBS R12.2 创建应用层的启动和关闭脚本
  9. 妙用TurboMail企业通讯平台,重要邮件不再躲猫猫
  10. linux 正向代理与反向代理
  11. python输入一个序列_Python序列合并,python
  12. SSM框架原理以及流程
  13. qt html转pdf 怎么取消页码,更改或删除QPrintPreviewWidg中的页码
  14. 阿里 OSS AccessDenied You are denied by bucket referer policy.
  15. python中的pymysql_Mysql在python中的使用:pymysql
  16. 35岁的大龄程序员都去哪里了?
  17. 一句话题解(20170801~20170125)
  18. springBoot员工管理系统
  19. 如何写/审AI领域的论文【VALSE Webinar】Panel实录
  20. 芝诺数解|「十」渝味之城,愉味无穷——重庆十一旅游数据分析报告

热门文章

  1. steam服务器维护6月28,多多自走棋维护公告 多多自走棋6月28日更新内容
  2. sql server 日期条件-上月、年初、同期
  3. Bootstrap可视化布局
  4. Java 微信公众号消息推送(从零开始)
  5. Spring Security 使用
  6. 工业互联网标识解析体系
  7. linux 中压缩文件夹命令行,Linux下压缩文件夹命令使用
  8. 微信公众号使用:设置开发者密码(AppSecret)的步骤
  9. APE音乐的处理[shntool]
  10. c语言如何算字节,C语言中结构字节的计算方法