Kanren逻辑推理库介绍
kanren库能够起到按照指定的表达式寻找满足表达式的值,下面将介绍常用的kanren函数及其常用用法
eq(u,v)
创建一个等式约束,表示变量a等于变量b,通常只是表达一个等式关系,返回值类型为一个逻辑表达式(函数)var()
用于创建逻辑变量,可以绑定到其他逻辑变量或常量。run(n,x,*goals)
函数用于进行逻辑推理,返回指定个满足约束的变量绑定,返回值类型为python列表,列表的每个元素是字典.
函数参数列表中n
表示返回个数,x
表示想要得到的逻辑变量,*goals
指的是约束条件,约束条件可以有多个.
示例如下
x = var()
print(run(1, x, eq(x, 3)))
"""
(3,)
"""
membero(x,coll)
函数用于判断某个元素是否属于一个列表或者另一个集合.参数列表中x
表示逻辑变量,membero()
函数返回值类型为布尔类型conde(*goalseqs)
函数用于提供逻辑与和逻辑或的操作,conde((A, B, C), (D, E))
表示(A and B and C) or (D and E)
.
返回对象为生成器对象,conde()
函数一般作为其他函数参数存在,用以表明逻辑关系.
示例如下
def grandParent(x,z):
y = var()
return conde((parent(x, y),parent(y,z)))
#表示与关系,x为y的父母且y为z的父母
#定义一个关系
parent = Relation()
#建立事实库
facts(parent, ("Ada", "Bart"),
("Ada", "Lisa"),
("Abe", "Ada"))
print(run(2, x, parent("Ada", x)))
print(run(1, x, grandParent(x, "Bart")))
lall(*goals)
和lany(*lany)
函数用于进行约束条件的添加,lall
参数中的条件必须全部满足,lany
参数中的条件部分满足,返回一个新的、作为一个整体的约束条件,最终在作为推理的约束条件而存在。
解决斑马问题
问题如下
5 个人
不同国家(英国、西班牙、日本、意大利、挪威)
工作各不相同(油漆工、摄影师、外交官、小提琴家、医生)
每个人住的房子的颜色不同(红色、白色、蓝色、黄色、绿色)
每个人都有自己养的不同宠物(狗、蜗牛、斑马、马、狐狸)
喜欢喝不同的饮料(矿泉水、牛奶、茶、橘子汁、咖啡)
请按如下提示进行推理:
- 英国人住在红色的房子里
- 西班牙人养了一条狗
- 日本人是一个油漆工
- 意大利人喜欢喝茶
- 挪威人住在左边的第一个房子里
- 绿房子在白房子的右边
- 摄影师养了一只蜗牛
- 外交官住在黄房子里
- 中间那个房子的人喜欢喝牛奶
- 喜欢喝咖啡的人住在绿房子里
- 挪威人住在蓝色的房子旁边
- 小提琴家喜欢喝橘子汁
- 养狐狸的人所住的房子与医生的房子相邻
- 养马的人所住的房子与外交官的房子相邻
根据以上提示,你能告诉我哪所房子里的人养斑马,哪所房子里的人喜欢喝矿泉水吗?
解决思路
定义推理体,负责定义逻辑变量,添加规则,进行推理即可
添加辅助限制调价,左相邻、右相邻、相邻
def left(x,y,units):
#这里使用units,units[1:]能够巧妙地返回相邻关系((1,2),(2,3),(3,4),(4,5))
groups = zip(units,units[1:])
return membero((x,y),groups)</