当你调用member(Item, List)
一个未实例化的列表时,Prolog 会统一并返回一个包含项目的列表。我想要一个返回true
/false
并且不尝试统一的规则。有这样的规定吗?
问问题
647 次
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 回答