Amzi prolog和列表成员谓词

时间:2014-07-19 08:20:31

标签: prolog amzi-prolog

我是学生,我对amzi prolog有疑问。我们在课堂上了解到,如果某个项目是列表中的成员,则会有一个谓词返回true:

member(1,[1,2,3])应该返回true。

但我得假。

我做错了吗?

请帮忙。

的问候, ID

2 个答案:

答案 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/2Amzi! Prolog's list library.的一部分但是,Prolog [主要]是用Prolog编写的,所以你可以很容易地推出自己的member/2导入列表库:

member( X , [X|_]  ) .
member( X , [_|Xs] ) :- member(X,Xs) .