如何使用序言查询 return 一次?

How to return once with prolog query?

我想检查一个人是否住在特定的房子里 ismemberof(NAME, HOUSE) -> (true 或 false once)。我的代码如下。问题是它检查所有具有与参数匹配的相同名称的事实和 returns 多个我不想要的结果。我怎样才能做到这一点?谢谢。

% Facts:
member(alex, 19, house1).
member(alex, 19, house2).
member(lisa, 21, house3).

% Rules:
ismemberof(NAME, HOUSE) :-
    member(NAME, _, HOUSE).

% Queries:
?- ismemberof(alex, house1).
   % expected: true
   % actual:   true
               false

您正在寻找 cut goal (!)

您可以将其添加到谓词:ismemberof(N,H) :- member(N,_,H),!. 或将其添加到查询本身:ismemberof(alex,house1),!..

剪切运算符实质上告诉 Prolog 一旦超过剪切目标就不要回溯超出剪切目标。

因为是红切,所以你要注意:查询 ismemberof(alex, X). 会产生两个没有切的结果,只有一个有切的结果。因此,如果我想检查成员资格,我会更改查询而不是谓词。