% Breitensuche

edge(a, b).
edge(a, c).
edge(a, d).
edge(b, e).
edge(b, f).
edge(f, i).
edge(f, j).
edge(j, k).
edge(j, l).
edge(d, g).
edge(d, h).
edge(f, a).


% RUFZEICHEN ist ein _CUT_, davor darf die Ausführung nicht mehr
% zurück!! wichtig, weil wenn member nicht erfüllt werden kann,
% dann soll auch nicht listbuild nochmal aufgerufen werden...

is_path(A, B) :-
    listbuild([A], List, [], _),
    !,
    member(B, List).


build(Kn, List, Anzahl) :-
    listbuild([Kn], List, [], _),
    count(List, Anzahl).


listbuild([], [], L, L).

listbuild([H|T], LOut, Visited, VisitedNeu) :-

    not_member(H, Visited),
    Visited1 = [H|Visited],
    safesetof(X, edge(H, X), L2),
    concatenate(L2, T, L4),
    listbuild(L4, L1, Visited1, VisitedNeu),
    concatenate(L1, L2, LOut).


listbuild([H|T], LOut, Visited, VisitedNeu) :-
    my_member(H, Visited),
    listbuild(T, LOut, Visited, VisitedNeu).


safesetof(X, Y, Z) :-
    setof(X, Y, Z).

safesetof(_, _, []).

count([], 0).
count([_|Tail], Anzahl) :-

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


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

    my_member(X, Tail).

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

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


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


concatenate(L,[],L).
concatenate([],L,L).
concatenate([H1|T1], L2, [H1|Liste]) :-

    concatenate(T1, L2, Liste).