Prolog member/2 谓词

Prolog member/2 predicate

为什么序言回答错误:member([5], [2, 5]).

有办法解决吗?

任何帮助将不胜感激。

member/2 的 SWI Prolog 文档中所述:

member(?Elem, ?List )

True if Elem is a member of List.

谓词是成员。它不是 subsetsublistsubsequence。如果第一个参数是第二个参数中给出的列表的成员(即 元素 ),则它会成功。元素 [5] 不是列表 [2, 5] 的成员,因为元素 [5] 不是 2 也不是 5。但是,[5] 将是列表的成员列表 [2, [5]],因此 member([5], [2, [5]]) 会成功。

Why does Prolog answer false to: member([5], [2, 5]).?

让我们问问 Prolog 为什么!下载 library(diadem) 到您的工作目录并:

?- use_module(diadem).
   true.

?- member([5], [2,5]).? Expl.
   Expl = member([_|_], [2, 5])
;  ...

它不仅失败了,而且 [5] 的泛化 fails:instead 也失败了,这是一个只有一个元素 5 的列表,我们现在至少有一个元素 - 不管是哪个。所以我们可以将 Expl 的值作为仍然失败的查询。因此,剩下的目标中的某些东西一定是罪魁祸首。

?- member([_|_], [2, 5]).
   false.

另请注意概括的内容:这两个元素仍然存在!如果它们是变量,查询就会成功!稍微概括一下查询:

?- member([5], [2, Any]).
   Any = [5].

现在成功了!

可能是您正在寻找另一个谓词?
来自 subset/2 的 SWI Prolog 文档:

subset( +SubSet, +Set )
True if all elements of SubSet belong to Set as well.

它按预期工作:

Welcome to SWI-Prolog (threaded, 64 bits, version 7.5.5)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.

?- subset([5], [2, 5]).
true.

?- subset([5, 3], [2, 3, 5, 7]).
true.

?- subset([5, 3], [2, 5]).
false.