成员谓词

时间:2014-01-05 15:59:53

标签: prolog unification

当您使用未经许可的列表调用member(Item, List)时,Prolog会统一并返回包含项目的列表。我想要一个返回true / false并且不会尝试统一的规则。有这样的规则吗?

2 个答案:

答案 0 :(得分:3)

快速回答:使用\+ \+ member(Item, List)

请注意,当您的程序代表逻辑关系时,此类测试通常没有多大意义。

你声明member(Item, List)“会返回一个列表”。嗯,这不完全正确。 List部分列表统一,即List = [Item|_Rest] ; List = [_,Item|_Rest] ; ..._Rest是未实例化的变量。也就是说,目标member(Item, List)并不保证(成功时)List是一个列表。这是一个反例:member(Item, List), List = [_|nonlist]

答案 1 :(得分:1)

我会使用警卫,比如

is_member(E, L) :- nonvar(L), memberchk(E, L).

memberchk/2它是member / 2的确定性版本,用于查找列表是否包含至少1个元素。不能充当生成器,但效率更高。无论如何都需要警卫。