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