FredCC
FredCC

Reputation: 23

Prolog findall list of predicates

I've been searching but I can't find the right answer for my question.

The problem is:

a predicate

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

I want to use findall to get me a list of all the second term of rb's.

Like in this example [1,2,5]

Anyone can help

Upvotes: 1

Views: 3348

Answers (1)

tas
tas

Reputation: 8140

You can use lists:member/2 to interactively find all values of the pairs rb/2 in your list:

   ?- 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

And based on that findall to get all second elements (Y) in one list (Res):

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

Alternatively, you could also write a predicate, say rb_2nd/2, that describes the second argument to be the second element in the pair that is the first argument:

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

And then use apply:maplist/3 to apply that relation to the list described by 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]

I find the latter easier to read than the query using findall/3.

Upvotes: 1

Related Questions