斑马问题实验

斑马问题实验
附加实验五 斑马问题实验
一、实验背景
- 在本次实验中,我们学习将 Python 应用于逻辑编程,并尝试自主撰写逻辑规则解决斑马问题。
- 本章实验的主要目的是掌握逻辑与推理相关基础知识点,熟悉python编程。
- 能够依据给定的事实以及规则编写代码,解决逻辑约束问题。
二、实验简介
5个不同国家且工作各不相同的人分别住在一条街上的5所房子里,每所房子的颜色不同,每个人都有自己养的不同宠物,喜欢喝不同的饮料。
根据以下提示,你能告诉我哪所房子里的人养斑马,哪所房子里的人喜欢喝矿泉水吗?
1 | 英国人住在红色的房子里 |
存在的条件汇总:
国籍:英国、西班牙、日本、意大利、挪威
房子颜色:红色、绿色、白色、蓝色、黄色
工作:油漆工、摄影师、外交官、小提琴家、医生
宠物:狗、蜗牛、狐狸、马、斑马
饮料:茶、牛奶、咖啡、橘子汁、矿泉水
三、实验步骤
使用python逻辑编程kanren库,将题目中的条件形式化为一个个的表达式,加入约束到kanren的一个集合中,然后利用kanren内置函数run求解即可。
根据已知条件的性质将条件分为三组:
1.第一组为属于一个实体的属性间的关系,有如下几个:
1 | 1.英国人住在红房子里 |
kanren中加入一个逻辑表达式的方法:
- 首先用houses = var() 创建一个逻辑变量houses。
- 代码中的var表示任意变量。5个var()分别代表国籍、工作、饮料、宠物、屋子颜色
- 然后利用membero函数表示一个约束, membero(item, houses) 表示 item是houses集合中的一个成员。如:
2.第二组为表示实体在整体中的确切属性的条件
添加方法为eq函数,eq(a,b) 表示ab相等。
1 | 5.挪威人住在左边的第一个房子里 |
3.第三组为描述两个实体间的不确定的(模糊的)关系的表达式
1 | 6.绿房子在白房子的左边 |
在kanren中没有能够直接描述以上关系的函数,所以需要人为定义
实现的函数:
left(q,p,x)表示在关系集合x中q在p的左边
next(q,p,x)表示在关系集合x中q和p相邻
借助以上两个函数就可以将对应的四个逻辑表达式表达出来了
到这里所有的表达式都已经表达完毕,已经可以利用run运行了,但是此时的表达式中还没有斑马和矿泉水这两个变量,程序处理到他们时会用符号代替,下面添加这两个变量进入表达式:
最后运行规则代码:
四、实验代码总结
1 | from kanren import * |
运行代码截图
五、实验总结
kanren库能够起到按照指定的表达式寻找满足表达式的值,下面是常用的kanren函数及其常用用法。
eq(u,v)创建一个等式约束,表示变量a等于变量b,通常只是表达一个等式关系,返回值类型为一个逻辑表达式(函数)。
var()用于创建逻辑变量,可以绑定到其他逻辑变量或常量。
run(n,x,*goals)函数用于进行逻辑推理,返回指定个满足约束的变量绑定,返回值类型为python列表,列表的每个元素是字典。
函数参数列表中n表示返回个数,x表示想要得到的逻辑变量,*goals指的是约束条件,约束条件可以有多个。