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

5 篇文章 0 订阅

一、题目简述

题目被称为“爱因斯坦难题-斑马问题”,具体问题描述如下:
在这里插入图片描述
在这里插入图片描述

二、 解题思路阐述

本题中有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对提升我的计算机水平有很大帮助,我对计算机科学的理解也能在学习的过程中逐步加深。

  • 6
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HanslerLi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值