如果我有一些关于人们拥有多少钱的事实
% 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中是否有一种方法可以调用谓词的反转,使其绑定所有可能的变量?