Reputation: 133
I'm trying to extract the elements of a list of pairs, but I'm only able to access the pairs. If I have a list like this:
list([p(a,b),p(c,d)]).
How can I access the elements a, b, c, d
. For example, if I run:
list_s(X) :- list(L), member(X,L).
?- list_s(X).
X = p(a,b),
X = p(c,d)
I get all the pairs in the list. But I'm trying to write a rule:
listSelect(X) :- list(X), ( ... something).
?- listSelect(X).
X = a,
X = b,
X = c,
X = d
Is it possible to make a rule to do something like this?
Upvotes: 2
Views: 200
Reputation:
Rubens' answer is perfectly fine, if, however, the order is important, you can also write:
list_select(X) :-
list(L),
member(p(A,B), L),
( X = A
; X = B
).
As a small bonus, you only traverse the original list once.
If you wanted to make this work on functors with an arbitrary arity, you could instead write:
list_select(X) :-
list(L),
member(F, L),
F =.. [_N|Args],
member(X, Args).
Upvotes: 1
Reputation: 14768
You may simply run through the possible facts of your list, as in:
list([p(a, b), p(c, d)]).
listSelect(X) :- list(L), member(p(X, _), L).
listSelect(X) :- list(L), member(p(_, X), L).
Which gives:
?- listSelect(A).
A = a ;
A = c ;
A = b ;
A = d.
Upvotes: 0