0

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

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

然而我却是假的。

难道我做错了什么?

请帮忙。

问候,身份证

4

2 回答 2

2

安齐!Prolog 有一个(半)确定性(不回溯)的内置谓词 ,并且它具有必须通过list.pro库加载的标准。is_member/2member/2

由于定义是两行的,我通常只是member/2根据需要将定义放在项目的源代码中。

于 2014-07-20T04:07:19.540 回答
0

安齐!Prolog 的内置谓词is_member/2,根据其文档,是确定性的,并且只是测试成员资格。它不会在回溯时返回列表的所有成员:

is_member/2是经典member/2谓词(在 LIST.PLM 库中)的受限版本,如果 Term 是 List 的成员,则 [sic] 可用于快速测试。它使用强大的 unify ( ==) 来测试元素。它不能用于回溯列表的各个成员。定义等价于:

is_member(X, [Y|_]) :- X == Y, !.
is_member(X,[_|Z]) :- is_member(X,Z).

正如@hardmath 在另一个答案中指出的那样,经典member/2Amzi 的一部分!Prolog 的列表库。但是,Prolog [大部分] 是用 Prolog 编写的,因此您可以轻松地自己member/2导入列表库:

member( X , [X|_]  ) .
member( X , [_|Xs] ) :- member(X,Xs) .
于 2014-07-22T17:28:38.167 回答