当您使用未经许可的列表调用member(Item, List)
时,Prolog会统一并返回包含项目的列表。我想要一个返回true
/ false
并且不会尝试统一的规则。有这样的规则吗?
答案 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个元素。不能充当生成器,但效率更高。无论如何都需要警卫。