繁体   English   中英

Prolog成员/ 2谓词

[英]Prolog member/2 predicate

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

有办法解决它吗?

任何帮助将不胜感激。

为什么Prolog会回答: member([5], [2, 5]).

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

?- use_module(diadem).
   true.

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

它不仅失败而且泛化失败:而不是[5]这是一个包含单个元素5的列表,我们现在只需要至少一个元素 - 无论哪个。 因此我们可以将Expl的值作为仍然失败的查询。 因此,剩余目标中的某些东西必定是罪魁祸首。

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

还要注意没有概括的内容:这两个元素仍在这里! 如果它们是变量,查询就会成功! 稍微概括一下查询:

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

现在它成功了!

成员/ 2的SWI Prolog文档中所述:

会员( ?Elem,? 列表

如果ElemList的成员,则为True。

谓词是成员 它不是子集子列表 序列 如果第一个参数是第二个参数中给出的列表的成员(即元素 ),则成功。 元素[5]不在列表中的一员[2, 5]由于元件[5]不为2,它不是5。然而, [5]将是列表的成员[2, [5]] ,所以member([5], [2, [5]])会成功。

可能是你在寻找另一个谓词?
来自子集/ 2的SWI Prolog文档:

子集( + SubSet+ Set
如果SubSet的所有元素属于Set则为 True。

它按预期工作:

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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM