/* MULTIL : Multi-List routines

                                                UTILITY
                                                Lawrence
                                                Updated: 11 September 81
*/

        %%%  MULTIL requires module:  APPLIC


  mlmaplist(P,Lists)
        :- ml_taketop(Lists,Line1,Lists2),
           !,
           apply(P,[Line1]),
           mlmaplist(P,Lists2).

  mlmaplist(_,L) :- !, ml_allempty(L).



  mlmaplist(P,Lists,V)
        :- ml_taketop(Lists,Line1,Lists2),
           !,
           apply(P,[Line1,V]),
           mlmaplist(P,Lists2,V).

  mlmaplist(_,L,_) :- !, ml_allempty(L).



  mlmaplist(P,Lists,Vin,Vfin)
        :- ml_taketop(Lists,Line1,Lists2),
           !,
           apply(P,[Line1,Vin,Vout]),
           mlmaplist(P,Lists2,Vout,Vfin).

  mlmaplist(_,L,Vfin,Vfin) :- !, ml_allempty(L).



  mlmember(Els,Lists)
        :- ml_taketop(Lists,Line1,Lists2),
           ( Els = Line1 ; mlmember(Els,Lists2) ).



  mlselect(Els,Lists,Lists3)
        :- ml_taketop(Lists,Line1,Lists2),
           ( Els = Line1,
             Lists3 = Lists2 ; mlselect(Els,Lists2,Rest),
                               Lists3 = [Line1|Rest]     ).



                        % Support routines for stripping off all first
                        %  elements into a list, and seeing if there are
                        %  no more elements.

  ml_taketop([[E|T1],..T2],[E|T3],[T1,..T4]) :- ml_taketop(T2,T3,T4).

  ml_taketop([],[],[]).


  ml_allempty([[],..TL]) :- ml_allempty(TL).

  ml_allempty([]).

