1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2%%                                                                           %%
    3%%      Version:  1.00   Date: 14/07/96   File: base.pl
    4%% Last Version:                          File:                              %%
    5%% Changes:                                                                  %%
    6%% 25/03/96 Created                                                          %%
    7%% 14/07/96 removed configuration utilities (-> defaults.pl)
    8%%                                                                           %%
    9%% Purpose:                                                                  %%
   10%%                                                                           %%
   11%% Author:  Torsten Schaub                                                   %%
   12%%                                                                           %%
   13%% Usage:   prolog base.pl                                                   %%
   14%%                                                                           %%
   15%%                                                                           %%
   16%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   17
   18%%% ----------------------------------------------------------------------
   19%%% 
   20%%%       additional predicates
   21%%%
   22%%%
   23
   24apply_to_list([],_,[]).
   25apply_to_list([Elem|List],P,[Elem1|List1]) :-
   26	T =.. [P,Elem,Elem1],
   27	call(T),
   28	apply_to_list(List,P,List1).
   29
   30
   31apply_to_list_flat([],_,[]).
   32apply_to_list_flat([Elem|List],P,ResList) :-
   33	T =.. [P,Elem,Result1],
   34	call(T),
   35	apply_to_list(List,P,List1),
   36	append(Result1,List1,ResList).
   37
   38
   39%%% mymember(?Element, ?Set)
   40%%% is true when Set is a list, and Element occurs in it.  It may be used
   41%%% to test for an element or to enumerate all the elements by backtracking.
   42%%% Indeed, it may be used to generate the Set!
   43
   44mymember(X, [X|_]    ).
   45mymember(X, [_,X|_]  ).
   46mymember(X, [_,_,X|_]).
   47mymember(X, [_,_,_|L]) :-
   48	mymember(X, L).
   49
   50%%% myselect(?Element, ?Set, ?Residue)
   51%%% is true when Set is a list, Element occurs in Set, and Residue is
   52%%% everything in Set except Element (things stay in the same order).
   53
   54myselect(X, [X|R],     R        ).
   55myselect(X, [A,X|R],   [A|R]    ).
   56myselect(X, [A,B,X|R], [A,B|R]  ).
   57myselect(X, [A,B,C|L], [A,B,C|R]) :-
   58	myselect(X, L, R).
   59
   60%%% mysubset(+Set1, +Set2)
   61%%% is true when each member of Set1 occurs in Set2.
   62%%%
   63
   64mysubset([],_).
   65mysubset([X|R],L) :-
   66	mymember(X,L),
   67	mysubset(R,L).
   68
   69
   70concatenate(String1,String2,String) :-
   71	name(String1,L1),
   72	name(String2,L2),
   73	append(L1,L2,L),
   74	name(String,L),
   75	!