Prolog:所有绑定的反向谓词

时间:2018-04-01 16:17:01

标签: prolog

如果我有一些关于人们拥有多少钱的事实

% poor people
owns(luke,1).
owns(maria,3).
owns(sara,5).
owns(mike,9).

% rich people
owns(barbara,10).
owns(paula,11).
owns(thierry,19).

和谓词isRich(如果P拥有10个或更多,则返回true)

isRich(P) :-
    owns(P,M),
    M >= 10.

我可以打电话给isRich(X),我会得到X的所有绑定,其中X是一个富人,即

?- isRich(X).
X = barbara ;
X = paula ;
X = thierry.

现在我想要一个与isPoor相反的谓词isRich,即它返回穷人(拥有少于10个人)的所有绑定。当然,我可以写:

isPoor(P) :-
    owns(P,M),
    M < 10.

但是,我想通过致电isPoor来撰写isRich。因此,当我更改谓词isRich(假设isRich是一个更复杂的谓词)时,我不必更改isPoor。理想情况下,我想写一些类似的东西:

isPoor(P) :-
    not(isRich(P)).

但是当我按照上面的定义调用isPoor(X)时,我只是得到了错误,而不是获得X的所有可能的绑定,其中X是一个穷人:

?- isPoor(X).
false.

我想要的是:

?- isPoor(X).
X = luke ;
X = maria ;
X = sara ;
X = mike.

SWI Prolog中是否有一种方法可以调用谓词的反转,使其绑定所有可能的变量?

1 个答案:

答案 0 :(得分:1)

作为Thomas By suggested,这就是诀窍:

npm_debug=1