python实现知识推理,图可达,pydatalog,kanren,sympy

刚刚学习人工智能知识推理记录一下

python 人工智能的推理包 又 kanren , pydatalog ,sympy
楼主比较各有利弊
kanren 语法更加接近python 原生语法
pydatalog 语法更加接近我们 离散数学 学到的语法

1、编写一个描述亲属关系的逻辑程序,然后再给予出一些事实数据,建立一个小型演绎数据库。
提示:可以以父亲和母亲为基本关系(作为基本谓词),再由此来描述祖父、祖母、兄弟、姐妹以及其他所属关系。
在这里插入图片描述
代码
import kanren
import sympy

from kanren import run, eq, membero, var, conde
from kanren import Relation, facts
parent = Relation()
facts(parent, (“Homer”,“Bart”),(“lmk”,“Bart”),(“Homer”,“Lisa”),(“Abe”,“Homer”))
x = var()

res1=run(0, x, parent(x, “Bart”))

print(res1)

father=Relation()
mather=Relation()
facts(father,(“f1”,“f2”),(“f2”,“f3”),(“f2”,“f31”),(“f3”,“f4”),(“f4”,“f5”))

facts(mather,(“m1”,“m2”),(“m2”,“m3”),(“m3”,“m4”))

someone=var()
someone_son=var()

#爷爷
def grandfather(grandson):
someone = var()
someone_son = var()
return run(0,someone,father(someone,someone_son),father(someone_son,grandson))

#奶奶
def grandmather(grandson):
someone = var()
someone_son = var()
return run(0,someone,mather(someone,someone_son),mather(someone_son,grandson))

grandfather1=grandfather(“f3”)

#兄弟
def borther(one_person):
one_father = var()
one_mather =var()
one_brother = var()
return run(0,(one_person,one_brother),father(one_father,one_person),father(one_father,one_brother),)

one_grandson=input(“你要找谁的爷爷\n”)
grandfather1=grandfather(one_grandson)
print(grandfather1)

one_person=input(“你要找谁的兄弟\n”)
borther1=borther(one_person)
print(borther1)

2、编写一个路径查询程序,使其能输出图中所有路径。
提示:程序中的事实描述了下面的有向图,规则是图中两节点间通路的定义。
在这里插入图片描述

import  pyDatalog 
pyDatalog.create_terms('X,Y,Z,link,can_reach')
# there is a link between node 1 and node 2
+link('a', 'b')
+link('a', 'c')
+link('c', 'd')
+link('b', 'd')
+link('b', 'e')
+link('d', 'e')
# x y之间是否可达?
can_reach(X, Y) <= link(X, Y)  # direct link
# 递归查找 x,y 之间是否可达
can_reach(X, Y) <= link(X, Z) & can_reach(Z, Y) & (X != Y)

while True:
    start_node=input('请输入出发的地点')
    print(can_reach(start_node, Y))

3、一个雇主在发出招聘广告之后,收到了大量的应聘申请。为了从中筛选出不量的候选人,该雇主采用下列判据:申请者必须会打字、开车,并且住在伦敦。
(a)用规则表述这个雇主的选择准则。
(b)用事实描述下列申请者的情况:
史密斯住在剑桥,会开车但不会打字。
布朗住在伦敦,会开车也会打字。
简住在格拉斯哥,不会开车但会打字。
埃文斯住在伦敦,会开车也会打字。
格林住在卢顿,会开车也会打字。
(c)要求运行结果提供一个候选人名单。

import pyDatalog 
pyDatalog.create_terms('X,live,drive,type_word,can_be_hire')

#现在又 几个 应聘者
# sms  ,bl  , jian  ,aws   ,gl

+live('sms','jianqiao')
+live('bl','lundun')
+live('jian','silage')
+live('aws','lundun')
+live('gl','ludun')

+drive('sms')
+drive('bl')
+drive('aws')
+drive('gl')

+type_word('bl')
+type_word('jian')
+type_word('aws')
+type_word('gl')
#定义能够被雇佣的 员工
can_be_hire(X)  <= live(X,'lundun') & drive(X)  & type_word(X)

print(can_be_hire(X))

输出结果
在这里插入图片描述

你可能感兴趣的:(知识推理,pydatalog,kanren,python)