基于PyDatalog的家庭关系专家系统:亲属规则推理错误排查
PyDatalog家庭关系专家系统规则修正
我正在用PyDatalog构建家庭关系专家系统,已加载CSV数据集,son、male、parent、brother等基础规则测试通过,但uncle、aunt、cousin规则存在推理错误:查询Asmaa的uncle返回空列表,正确结果应为Bachar和Hassan,需要修正规则。
数据集
| name | father_name | mother_name | gender |
|---|---|---|---|
| Ahmad | Bachar | Rafah | Male |
| Amjad | Bachar | Rafah | Male |
| Danah | Bachar | Rafah | Female |
| Yazan | Hassan | Ghalia | Male |
| Leen | Hassan | Ghalia | Female |
| Dema | Faiaz | Sahar | Female |
| Dania | Faiaz | Sahar | Female |
| Tareq | Faiaz | Sahar | Male |
| Asmaa | Waleed | Hanan | Female |
| Alaa | Waleed | Hanan | Female |
| Tasneem | Waleed | Hanan | Female |
| Firas | Waleed | Hanan | Male |
| Farouk | Shareef | Sameah | Male |
| Usaema | Saeed | Adebeh | Female |
| Bachar | Farouk | Usaema | Male |
| Hassan | Farouk | Usaema | Male |
| Rafah | Zuhair | Rukaieh | Female |
| Zoukaa | Zuhair | Rukaieh | Female |
| Lujain | Adnan | Zoukaa | Female |
| Mohammad | Adnan | Zoukaa | Male |
术语定义
pyDatalog.create_terms('X,Y,Z,W, parent, male, female, father_of, mother_of, son, daughter, aunt, uncle, cousin, niece, nephew, sibling, brother, sister')
基础规则定义
for index, row in data.iterrows(): name, father_name, mother_name, gender = row['name'], row['father_name'], row['mother_name'], row['gender'] if gender == 'Male': +son(name, father_name) +son(name, mother_name) +male(name) else: +daughter(name, father_name) +daughter(name, mother_name) +female(name) +father_of(father_name, name) +mother_of(mother_name, name)
已测试通过的亲属关系规则
parent(X, Y) <= father_of(X, Y) parent(X, Y) <= mother_of(X, Y) brother(X, Y) <= (parent(Z, X) & parent(Z, Y) & male(X) & (X != Y)) sister(X, Y) <= (parent(Z, X) & parent(Z, Y) & (X != Y) & female(X)) sibling(X,Y) <= parent(Z, X) & parent(Z, Y) & (X != Y)
存在问题的规则
uncle(X, Y) <= brother(X, Z) & parent(Z, Y) & male(X) aunt(X, Y) <= sister(X, Z) & parent(Z, Y) & female(X) cousin(X, Y) <= parent(Z, X) & (sister(X, Z) & parent(Z, Y))
错误分析与修正方案
1. 核心问题:数据集缺失导致兄弟关系无法推导
Asmaa的父亲是Waleed,但数据集中没有Waleed的记录,因此无法推导Waleed与Bachar、Hassan的兄弟关系(缺少father_of(Farouk, Waleed)和mother_of(Usaema, Waleed)的事实)。需先补充Waleed的数据集记录:
name,father_name,mother_name,gender Waleed,Farouk,Usaema,Male
2. 修正Uncle规则
原规则中male(X)冗余(brother(X,Z)已隐含X为男性),修正后:
uncle(X, Y) <= brother(X, Z) & parent(Z, Y)
补充数据集后,该规则会推导Bachar、Hassan是Waleed的兄弟,进而成为Asmaa的uncle。
3. 修正Aunt规则
同理,female(X)冗余,修正后:
aunt(X, Y) <= sister(X, Z) & parent(Z, Y)
4. 修正Cousin规则
原规则逻辑完全错误(实际匹配的是姐妹关系),正确的堂/表亲逻辑是:X的父母与Y的父母为兄弟姐妹关系。修正后:
cousin(X, Y) <= parent(Z, X) & parent(W, Y) & sibling(Z, W) & (X != Y)
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

