刚刚学习人工智能知识推理记录一下
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))
输出结果