% Definition des fluss-Praedikates und Zuweisen einer
% Schuettungsmenge zu dessen Quelle.
% Wenn der Fluss aus einem See entspringt,
% oder durch die Gabelung eines anderen
% Flusses entsteht wird 0 als Schuettungsmenge angenommen.

fluss(drau, 6).
fluss(lieser, 4).
fluss(riegerbach, 2).
fluss(donau, 0).
fluss(inn, 8).
fluss(glan, 0).
fluss(gail, 3).
fluss(maibachl, 1).
fluss(mur, 0).
fluss(gurk, 3).

see_(millstaettersee_end, 60).
abfluss(mur_glan).


% Staedte werden definiert, und es wird ihnen ein Fluss zugeordnet.
stadt(spittal, drau).
stadt(hermagor, mur).
stadt(st_veit, mur).
stadt(graz, mur).
stadt(linz, donau).
stadt(wien, donau).


% Der erste Teil des Praedikates ist ein Knoten,
% der Folgende ein am Fluss darauffolgender Knoten.
% Danach ist die Laenge des Abschnittes und dir
% Fliessgeschwindigkeit in m und m/s angegeben.

verlauf(lieser, lieser_drau, 90000, 4).
verlauf(drau, lieser_drau, 10000, 4).
verlauf(lieser_drau, spittal, 90000, 8).
verlauf(spittal, millstaettersee, 10000, 3).

verlauf(riegerbach, millstaettersee, 100000, 10).
verlauf(millstaettersee, millstaettersee_end, 12000, 0.1389).

verlauf(inn, inn_donau, 5000, 5).

verlauf(millstaettersee_end, linz, 2000, 5).
verlauf(linz, inn_donau, 3000, 5).
verlauf(inn_donau, wien, 10000, 2).
verlauf(wien, donau_meer, 100000, 2).

verlauf(millstaettersee_end, gail_mur, 13000, 6).
verlauf(gail_mur, hermagor, 2000, 6).
verlauf(hermagor, mur_glan, 1000, 6).
verlauf(mur_glan, st_veit, 10000, 4).
verlauf(st_veit, maibachl_mur, 30000, 4).
verlauf(maibachl_mur, gurk_mur, 30000, 3).
verlauf(gurk_mur, graz, 10000, 3).
verlauf(graz, mur_meer, 100000, 3).

verlauf(maibachl, maibachl_mur, 10000, 5).
verlauf(gurk, gurk_mur, 10000, 5).
verlauf(gail, gail_mur, 10000, 5).

verlauf(mur_glan, glanstadt, 10000, 4).
verlauf(glanstadt, glan_meer, 100000, 4).

verlauf_hilfe(A, B) :-
    verlauf(A, B, _, _).

% Cut ist notwendig um Backtracking zu verhindern
my_div(0, _, 0) :-
    !.

my_div(XX, YY, ZZ) :-
    ZZ \== 0,
    nonvar(YY),
    !,
    XX is YY / ZZ.


my_div(XX, YY, ZZ) :-
    nonvar(XX),
    ZZ \== 0,
    !,
    YY is XX * ZZ.


my_mal(0, _, 0) :-
    !.

my_mal(XX, YY, ZZ) :-
    nonvar(YY),
    ZZ \== 0,
    !,
    XX is YY * ZZ.


my_mal(XX, YY, ZZ) :-
    ZZ \== 0,
    nonvar(XX),
    !,
    YY is XX / ZZ.


wassermenge(PUNKT, MENGE) :-
% Ueberpruefung, ob der aktuelle Knoten
% eine Flussgabelung ist

    abfluss(PUNKT),
    my_setof(Z, verlauf_hilfe(Z, PUNKT), LIST),
    vorher(LIST, MENGEN),
    my_div(MENGE, MENGEN, 2).


wassermenge(PUNKT, MENGE) :-
% Ueberpruefung, ob es sich bei dem
% aktuellen Knoten um eine Stadt handelt

    stadt(PUNKT, _),
    my_setof(Z, verlauf_hilfe(Z, PUNKT), LIST),
    vorher(LIST, MENGEN),
    MENGE is MENGEN.


wassermenge(PUNKT, MENGE) :-
    see_(PUNKT, _),
    my_setof(Z, verlauf_hilfe(Z, PUNKT), LIST),
    my_setof(XX, verlauf_hilfe(PUNKT, XX), LISTE),
    len(LISTE, LEN),
    vorher(LIST, MENGEN),
    my_div(MENGE, MENGEN, LEN).


wassermenge(PUNKT, MENGE) :-
    fluss(PUNKT, MENGE),
    MENGE \== 0.


wassermenge(PUNKT, MENGE) :-
    my_setof(Z, verlauf_hilfe(Z, PUNKT), LIST),
    vorher(LIST, MENGE).


vorher([], 0).
vorher([H|T], MENGE) :-

    vorher(T, MENGE1),
    wassermenge(H, MENGE2),
    MENGE is MENGE1 + MENGE2.


len([], 0).
len(L, A) :-

    L=[_|T] ,
    len(T, AN),
    A is AN + 1.


my_setof(X, Y, Z) :-
    setof(X, Y, Z),
    !.


my_setof(_, _, []).

verschmutzung(PUNKTA, PUNKTB, MENGEA, MENGEB, ZEIT) :-

    godown(PUNKTA, PUNKTB, FAKTOR, ZEITN),
    my_mal(MENGEB, MENGEA, FAKTOR),
    my_div(ZEIT, ZEITN, 60).


godown(PUNKTB, PUNKTB, 1, 0).

godown(PUNKTA, PUNKTB, FAKTOR, ZEIT) :-

    verlauf(PUNKTA, NEXT_, WEG, SPEED),
    godown(NEXT_, PUNKTB, FAKTORN, ZEITN),
    schmutz(PUNKTA, FAKTOR_),
    my_mal(FAKTOR, FAKTOR_, FAKTORN),
    my_div(ZEIT_, WEG, SPEED),
    ZEIT is ZEIT_ + ZEITN.


schmutz(PUNKTA, FAKTOR) :-
    see_(PUNKTA, MENGE),
    !,
    my_setof(XX, verlauf_hilfe(PUNKTA, XX), LISTE),
    len(LISTE, LEN),
    my_div(FAKTORN, 1, LEN),
    my_div(FAKTOR, FAKTORN, MENGE).


schmutz(PUNKTA, FAKTOR) :-
    abfluss(PUNKTA),
    !,
    FAKTOR = 1/2.


schmutz(_, 1).