【问题标题】:Prolog findall list of predicatesProlog findall 谓词列表
【发布时间】:2016-05-21 23:38:35
【问题描述】:

我一直在搜索,但找不到我的问题的正确答案。

问题是:

谓词

initial_estates([rb(1,1),rb(2,2),rb(3,5)]).

我想使用 findall 来获取 rb 的所有第二项的列表。

就像这个例子中的 [1,2,5]

任何人都可以提供帮助

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您可以使用 lists:member/2 以交互方式查找列表中 rb/2 对的所有值:

       ?- initial_estates(L),member(rb(X,Y),L).
    L = [rb(1,1),rb(2,2),rb(3,5)],
    X = Y = 1 ? ;
    L = [rb(1,1),rb(2,2),rb(3,5)],
    X = Y = 2 ? ;
    L = [rb(1,1),rb(2,2),rb(3,5)],
    X = 3,
    Y = 5 ? ;
    no
    

    并基于 findall 将所有第二个元素 (Y) 放在一个列表 (Res) 中:

       ?- findall(Y,(initial_estates(L),member(rb(X,Y),L)),Res).
    Res = [1,2,5]
    

    或者,您也可以编写一个谓词,例如 rb_2nd/2,将第二个参数描述为第一个参数对中的第二个元素:

    rb_2nd(rb(X,Y),Y).
    

    然后使用 apply:maplist/3 将该关系应用于由 initial_estates/1 描述的列表:

       ?- initial_estates(L), maplist(rb_2nd,L,Res).
    L = [rb(1,1),rb(2,2),rb(3,5)],
    Res = [1,2,5]
    

    我发现后者比使用 findall/3 的查询更容易阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多