Prolog找到所有谓词列表

时间:2016-05-21 14:26:07

标签: prolog

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

问题是:

谓词

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

我想用findall给我一个rb的所有第二个词的列表。

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

任何人都可以提供帮助

1 个答案:

答案 0 :(得分:1)

您可以使用list: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的查询更容易阅读。