今天我遇到了这个问题:
?- member(b,X).
该计划是:
member(X,[X|_]).
member(X,[_|T]) :-
member(X,T),
!.
当我运行查询时,我得到了这些答案:
?- member(b,X).
X = [b|_G1560] ;
X = [_G1559, b|_G1563].
那是什么意思?这个查询做了什么?
答案 0 :(得分:2)
查询member(b,X)
生成包含b
的列表。由于第二个参数未实例化,因此您有(理论上)无数个解决方案。第一个解决方案在第一个位置有b
,第二个解决方案在第二个位置有b
,依此类推。此外,如果仔细查看任何解决方案,您会发现它代表该位置上b
的任何列表。例如,第一个解决方案是[b| _]
。由于列表尾部未实例化(请参阅member/2
谓词基础案例),此解决方案将与头部位置b
的任何列表统一。
如果你想使member/2
确定性,即如果你只想使用谓词检查一个术语是否是列表的成员,你需要在base子句中添加一个cut,而不是在递归子句中@false注明:
member(Head, [Head| _]) :-
!.
member(Head, [_| Tail]) :-
member(Head, Tail).
结果谓词通常命名为memberchk/2
,可用作库谓词。