究竟是什么成员(b,X)?

时间:2014-05-07 18:00:07

标签: prolog

今天我遇到了这个问题:

?- member(b,X).

该计划是:

member(X,[X|_]).   
member(X,[_|T]) :- 
    member(X,T),
    !.

当我运行查询时,我得到了这些答案:

?- member(b,X).
X = [b|_G1560] ;
X = [_G1559, b|_G1563].
那是什么意思?这个查询做了什么?

1 个答案:

答案 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,可用作库谓词。