member(?Element, ?List)

member(?Element, ?List) is true when List is a (possibly partial) list, and Element is one of its elements. It may be used to check whether a particular element occurs in a given list, or to enumerate all of the elements of a list by backtracking. member/2 may also be used to generate a list.

     | ?- member(a, [b,e,a,r]).
     
     yes
     
     | ?- member(e, [s,e,e,n]).
     
     yes   /* this will succeed twice */
     
     | ?- member(e, [t,o,l,d]).
     
     no
     
     | ?- member(X-Y, [light-dark,near-far,wet-dry]).
     
     X = light,
     Y = dark ;
     
     X = near,
     Y = far ;
     
     X = wet,
     Y = dry
     
     | ?- member(a-X, [b-2,Y-3,X-Y]).
     
     X = 3,
     Y = a ;
     
     X = a,
     Y = a
     
     | ?- member(a, L), member(b, L), member(c, L),
     |    length(L, N).
     
     L = [a,b,c],
     N = 3
     

The last example will generate lists of increasing length whose first three members are a, b, and c.

If L is a proper list of length n, member(X, L) has at most n solutions, whatever X is. But if L is a partial list, member/2 will backtrack indefinitely, trying to place X ever farther to the right. For example,

     | ?- member(a, L).
     
     L = [a|_879] ;
     
     L = [_878,a|_881] ;
     
     L = [_878,_880,a|_883] ;
        .
        .
        .
     

until you stop it.

In general, you should only use member/2 when the second argument is a proper list. This list need not be ground; however, it must not end with a variable.