% Elementare Listenfunktionen

% Nachbildung der 'member'-Funktion

my_member(X, [X|_]).
my_member(X, [_|Tail]) :-

    my_member(X, Tail).

% Negation der 'member'-Funktion
not_member(_, []).
not_member(X, [Head|Tail]) :-

    Tail == [],
    Head \== X.


not_member(X, [Head|Tail]) :-
    X \== Head,
    not_member(X, Tail).


% Anzahl der Elemente in einer Liste errechnen
count([], 0).
count([_|Tail], Anzahl) :-

    count(Tail, AnzahlNeu),
    Anzahl is AnzahlNeu + 1.


% Ein Element aus der Liste entfernen
remove(_, [], []).
remove(A, [A|T], L2) :-

    remove(A, T, L2).

remove(A, [H|T], L2) :-
    remove(A, T, L3),
    L2 = [H|L3].


% Duplikate aus der Liste entfernen
singular([], []). singular([Head|Tail], ListeNeu) :-
    singular(Tail, Liste),
    not_member(Head, Liste),
    ListeNeu = [Head|Liste].


singular([_|Tail], Liste) :-
    singular(Tail, Liste).

% Zwei Listen aneinanderhängen
concatenate([],L,L).
concatenate([H1|T1], L2, [H1|Liste]) :-

    concatenate(T1, L2, Liste).

% Differenz zweier Listen ermitteln
difference(L1,[],L1).
difference([],_,[]).
difference(L1,L2,L3) :-

    L1=[H|T],
    not_member(H,L2),
    difference(T,L2,T1),
    L3=[H|T1].


difference(L1,L2,T1) :-
    L1=[H|T],
    my_member(H,L2),
    difference(T,L2,T1).