我想知道为什么Prolog的member/2
谓词提供了多种替代方案(通过回溯?!),如果输出已经统一了。
例如member(1, [1,2,3]).
提供以下输出:
true ;
false.
为什么member
在发现原子1
确实是列表[1,2,3]
的成员后返回false?
对我来说更令人困惑的是以下输出:
?- member(1, [1,2,3,1]).
true ;
true.
答案 0 :(得分:5)
在你的第一个例子中,你要求它证明member(1,[1,2,3]).
;因为它可以,它报告true
。当您输入;
时,您要求找到另一种方法来证明该查询;因为它不能,它报告false
。
在第二种情况下,第一个true
是因为它在列表中找到了1
之一;第二个是因为它找到了第二个。如果您再次点击;
,它会返回false
,因为它没有其他方法可以证明查询。 (注意:正如@WillNess指出的那样,你实际上没有机会再次点击;
;这可能是由于member
的实现使得Prolog知道没有剩余的替代品。如果列表没有以1结尾,您将能够再次点击;
。)