假设我有以下事实:
boy(a).
boy(b).
girl(c).
girl(d).
如果我查询:
?-boy(X).
我明白了:
X=a;
X=b.
我应该使用哪个查询来使用变量来获取不符合规则boy()的对象,在本例中为c和d?
我是Prolog的新手,所以我在考虑使用
?-not(boy(X)).
但这不正确。 我正在使用swi-prolog。 提前感谢您的时间和帮助。
答案 0 :(得分:3)
not(boy(X))
的问题在于Prolog不知道X
的“可能选择范围”是什么,以便测试他们是否是男孩。当然,boy
事实只知道男孩。
一种方法是定义除性别之外的所有人。例如:
% Define people
person(a).
person(b).
person(c).
person(d).
% Define genders
boy(a).
boy(b).
girl(c).
girl(d).
然后检查所有“非男孩”你会做什么:
?- person(X), not(boy(X)).
根据您要整理数据的方式,您可以将性别与人员结合使用:
person(a, boy).
person(b, boy).
person(c, girl).
person(d, girl).
然后查询:
?- dif(Y, boy), person(X, Y).
或者将其写为谓词:
person_not_of_gender(Person, Gender) :-
dif(OtherGender, Gender),
person(Person, OtherGender).
然后查询:
?- person_not_of_gender(Person, boy).