Prolog:成员谓词的真/假输出?

Prolog: true / false output of member predicate?

我想知道为什么 Prolog 的 member/2 谓词提供了多个备选方案(通过回溯?!),如果 true 已经统一为输出。

例如 member(1, [1,2,3]). 提供以下输出:

true ;
false.

为什么 member return 已经发现原子 1 确实是列表 [1,2,3] 的成员?

更让我困惑的是以下输出:

?- member(1, [1,2,3,1]).
true ;
true.

在你的第一个例子中,你要求它证明member(1,[1,2,3]).;因为它可以,所以它报告 true。当您输入 ; 时,您要求找到另一种方法来证明该查询;因为它不能,它报告 false.

在第二种情况下,第一个true是因为它在列表中找到了1之一;第二个是因为它找到了第二个。如果您再次点击 ;,它会返回 false,因为它没有其他方法来证明查询。 (注意:正如@WillNess 指出的那样,您实际上没有机会再次点击 ; ;这可能是由于 member 的实现使得 Prolog 知道没有剩余的选择。如果列表不是以 1 结尾,您可以再次点击 ;。)