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

时间:2017-02-13 16:46:41

标签: prolog member

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

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

true ;
false.

为什么member在发现原子1确实是列表[1,2,3]的成员后返回false?

对我来说更令人困惑的是以下输出:

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

1 个答案:

答案 0 :(得分:5)

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

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