[英]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,? 列表 )
如果
Elem
是List
的成员,则为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.