user3102567
user3102567

Reputation: 133

How to access facts inside list

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

Answers (2)

user1812457
user1812457

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

Rubens
Rubens

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

Related Questions