% ----- member -----

member( X, [X|_]).
member( X, [_|Rest]) :- member(X, Rest).



% ----- allHave -----

% allHave( List, Key ) returns true iff every element of List is
% a list that contains Key.

allHave( [First|Rest], Key ) :-
    is_list(First),
    member(Key, First),
    allHave( Rest, Key ).

allHave( [], _ ).



% ----- allListsHave -----

% allListsHave ( List, Key ) returns true iff every element of List 
% that is a a list, contains Key.


% broken version:

broken( [First|Rest], Key ) :-
    is_list(First),
    member(Key, First),
    broken( Rest, Key ).

broken( [_|Rest], Key ) :-
    broken( Rest, Key ).

broken( [], _ ).


% Working version (with cut):

allListsHave( [First|Rest], Key ) :-
    is_list(First), !,      % A cut here fixes the prob. 
    member(Key, First),
    allListsHave( Rest, Key ).

allListsHave( [_|Rest], Key ) :-
    allListsHave( Rest, Key ).

allListsHave( [], _ ).



% Working version (with not):

allListsHave2( [First|Rest], Key ) :-
    is_list(First),      
    member(Key, First),
    allListsHave2( Rest, Key ).

allListsHave2( [First|Rest], Key ) :-
    not is_list(First),		% another way to fix the prob.
    allListsHave2( Rest, Key ).

allListsHave2( [], _ ).
