【问题标题】:How to return once with prolog query?如何使用序言查询返回一次?
【发布时间】:2021-06-05 15:52:58
【问题描述】:

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

% 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

【问题讨论】:

  • 在 SWI-Prolog 中,结果是确定性的:?- ismemberof(alex, house1). 答案:true. “我找到了一个证明,我确信没有替代证明”。这取决于编译器如何创建谓词索引以及 Prolog VM 如何利用这些索引。

标签: prolog predicate


【解决方案1】:

您正在寻找cut goal (!)

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

cut 运算符本质上是告诉 Prolog,一旦越过它,就不要回溯到超出 cut 目标的位置。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多