我是学生,我对amzi prolog有疑问。我们在课堂上了解到,如果某个项目是列表中的成员,则会有一个谓词返回true:
member(1,[1,2,3])
应该返回true。
但我得假。
我做错了吗?
请帮忙。
的问候, ID
答案 0 :(得分:2)
暗洗! Prolog的a built-in predicate is_member/2
是(半)确定性的(不回溯),并且它具有必须通过list.pro库加载的标准member/2
。
由于定义是双线的,我通常只根据需要将member/2
的定义放在项目的源代码中。
答案 1 :(得分:0)
暗洗! Prolog的内置谓词is_member/2
,每its documentation,是确定性的,只是测试成员资格。它不会在回溯中返回列表中的所有成员:
is_member/2
是经典member/2
谓词的限制版本(在{ 如果Term是List的成员,则[sic]的LIST.PLM库可以用于快速测试。 它使用强大的统一(==
)来测试元素。 它不能用于回溯列表的各个成员。 该定义等同于:is_member(X, [Y|_]) :- X == Y, !. is_member(X,[_|Z]) :- is_member(X,Z).
正如@hardmath在另一个答案中指出的那样,经典member/2
是Amzi! Prolog's list library.的一部分但是,Prolog [主要]是用Prolog编写的,所以你可以很容易地推出自己的member/2
导入列表库:
member( X , [X|_] ) .
member( X , [_|Xs] ) :- member(X,Xs) .