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).
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).