Prolog:具有真假值

G. *_*dre 1 list prolog

我正在学习使用 SWI Prolog,我正在学习使用列表。一个小练习是检查一个元素是否在列表中。这是我得到的:

member(X,[X|_]).
member(X,[_|T]):-member[X|T].
Run Code Online (Sandbox Code Playgroud)

第一种情况按预期进行:

?- member(a,[b,a]).
true.
Run Code Online (Sandbox Code Playgroud)

但第二个没有,因为似乎出现了一些回溯:

?- member(a,[a,b]).
true ;
false.
Run Code Online (Sandbox Code Playgroud)

我怎样才能防止这种情况发生,即让 Prolog 只返回true?(我不想忽略 false。)

lur*_*ker 6

member/2是一个标准的 Prolog 谓词。你应该给你的名字起别的名字。标准谓词与您显示的行为相同。

当您查询时:

?- member(a, [a,b]).
true ;
false.
Run Code Online (Sandbox Code Playgroud)

Prolog 找到a匹配第一个元素并成功。列表中有更多内容需要检查,因此它会提示您输入更多内容。按说;“是的,请检查更多”。当它这样做时,它找不到更多的a成员,然后产生false(在 GNU Prolog 中,它会说no)。

您可以通过以下任一方式使其消失:

  • 不按;而是按 Enter 键,或者
  • 使用once/1: once(member(a, [a,b])), 或
  • 您可以更改谓词以在第一个子句中包含一个 cut ,但这是一个坏主意,因为它在一般情况下不起作用:member(X, [a,b])只会返回X = a然后停止。