首页 文章

Prolog:所有绑定的反向谓词

提问于
浏览
1

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

% 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.

However ,我想通过调用 isRich 来编写 isPoor . 因此,当我更改谓词 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 回答

  • 1

    正如Thomas By suggested,这就是诀窍:

    % enumerate all people and
    % return the ones that aren't rich
    isPoor(P) :-
        owns(P,_),
        \+ isRich(P).
    

相关问题