如何使用序言查询 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).
会产生两个没有切的结果,只有一个有切的结果。因此,如果我想检查成员资格,我会更改查询而不是谓词。
我想检查一个人是否住在特定的房子里 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).
会产生两个没有切的结果,只有一个有切的结果。因此,如果我想检查成员资格,我会更改查询而不是谓词。