Prolog仅声明male事实时如何查询所有female对象?
Prolog否定谓词查询无返回结果的原因及解决方案
问题原因
- 该现象由Prolog 失败即否定(Negation as Failure,
\+操作符) 的特性导致 \+操作符仅支持对已绑定具体值的变量做逻辑判断,无法推导自由变量的取值:- 执行
?- female(X)时,X为自由变量,male(X)会直接匹配已有的male事实返回成功,\+ male(X)因此返回失败,整个查询无结果 - 传入具体姓名查询时,X被绑定为对应值,若该值没有匹配的male事实,
male(X)查询失败,\+ male(X)就返回成功,因此可以得到正确的yes/no判断结果
- 执行
- 额外隐藏问题:你未定义待统计个体的论域,Prolog默认不知道需要在哪些对象范围内筛选「非male」对象,无法凭空生成未声明的个体。
解决方案
- 在
db.pl文件中新增所有待统计个体的定义谓词,把所有需要纳入范围的人员全部列出:
% 所有需要考虑的个体列表 person(Oliver). person(james). person(sam). person(anna). person(lily). % 其他需要补充的个体均在此处添加
- 修改
female谓词的定义,先将X绑定到具体的person个体,再执行非male判断:
female(X) :- person(X), \+ male(X).
- 重新加载知识库后执行查询
?- female(X).,即可返回所有符合条件的女性列表。
内容的提问来源于stack exchange,提问作者Shray
相关产品推荐
相关产品推荐

