Prolog成员/ 2谓词

时间:2017-05-09 21:48:15

标签: list prolog member

为什么prolog会回答错误:header.find('a').get(5).simulate('click');

有办法解决它吗?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

  

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

让我们问Prolog为什么!将library(diadem)下载到您的工作目录中,然后:

?- use_module(diadem).
   true.

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

它不仅失败而且泛化失败:我们现在只有至少一个元素 - 而不是[5],而不是Expl。因此,我们可以将?- member([_|_], [2, 5]). false. 的值作为仍然失败的查询。因此,剩余目标中的某些东西必须是罪魁祸首。

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

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

Base::~Base()

现在它成功了!

答案 1 :(得分:3)

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

  

成员( ?Elem ?列表

     

如果ElemList的成员,则为真。

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

答案 2 :(得分:0)

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

  

子集( + SubSet +设置
  如果 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.