Prolog findall谓词列表

Prolog findall谓词列表,prolog,Prolog,我一直在寻找,但我找不到我问题的正确答案 问题是: 谓词 initial_estates([rb(1,1),rb(2,2),rb(3,5)]). 我想用findall给我一个rb第二学期的列表 就像这个例子[1,2,5] 任何人都可以提供帮助您可以使用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 ? ;

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

问题是:

谓词

initial_estates([rb(1,1),rb(2,2),rb(3,5)]).
我想用findall给我一个rb第二学期的列表

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


任何人都可以提供帮助

您可以使用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获取一个列表(
Res
)中的所有第二个元素(
Y
):

或者,您也可以编写一个谓词,例如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的查询更容易阅读

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