1

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

4

2 回答 2

3

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

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

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

于 2014-01-05T17:36:19.507 回答
1

我会使用警卫,比如

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

memberchk/2它是 member/2 的确定性版本,用于查找列表是否包含至少 1 次出现的元素。不能充当发​​电机,但它更有效。无论如何都需要守卫。

于 2014-01-05T17:12:43.507 回答