Prolog:获取不符合事实的对象或对象

时间:2017-02-17 18:39:08

标签: prolog

假设我有以下事实:

boy(a).
boy(b).
girl(c).
girl(d).

如果我查询:

?-boy(X).

我明白了:

X=a;
X=b.

我应该使用哪个查询来使用变量来获取不符合规则boy()的对象,在本例中为c和d?

我是Prolog的新手,所以我在考虑使用

?-not(boy(X)).

但这不正确。 我正在使用swi-prolog。 提前感谢您的时间和帮助。

1 个答案:

答案 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).