comp :- consult('FloydWarshall.pl').

:- consult('lib.pl').

:- nl,write('***********************************************************'),nl,nl,
   write('Um eine Distanzmatrix einzugeben, muss man den Befehl'),nl,
   write('"einlesen." eingeben. Danach kann man die Kantenlaengen'),nl,
   write('zwischen Punkten I und J eingeben. Beachte: man muss je-'),nl,
   write('de Eingabe mit einem "." abschlissen!'),nl,nl, 
   write('***********************************************************'),nl,nl.          

einlesen:- nl,write('Wie viele Knoten hat der Graph? '),
           read(N),integer(N),N>0,init_dist(N,L),assert(list(L)),nl,
           write('Gib nun die Distanzen ein und zwar "I. J. Dist." '),nl,
           write('Abbruch erfolgt bei "falscher" Eingabe.'),nl,nl,
           eingabe(L).

eingabe(L):- !, write('I: '),read(I),!,in_list(I,L),
             write('J: '),read(J),!,in_list(J,L),
             write('D: '),read(D),!,integer(D),nl,
             retract(d(I,J,_)),assertz(d(I,J,D)),!,eingabe(L).
      
init_dist(N,L):- make_list(N,[],L),
                 in_list(I,L),in_list(J,L),assertz(d(I,J,u)),fail.
init_dist(N,L):- make_list(N,[],L).

make_list(0,L,L):- !.
make_list(N,L1,L):- append([N],L1,L2), M is N-1, make_list(M,L2,L).

short_way:- list(L), 
            in_list(J,L),in_list(I,L),in_list(K,L),
            nit(I is J), nit(K is J),
            d(I,K,DIK),d(I,J,DIJ),d(J,K,DJK),
            add(DIJ,DJK,D),
            minu(DIK,D,DD),retract(d(I,K,DIK)),assert(d(I,K,DD)),fail.

short_way:- list(L),
            in_list(I,L),nl,in_list(J,L),d(I,J,D),write(D),fail.

short_way.

add(u,_,u):- !.
add(_,u,u):- !.
add(N,M,D):- D is N+M.

minu(u,u,u):- !.
minu(u,X,X):- !.
minu(X,u,X):- !.
minu(N1,N2,M):- N1 >= N2, M is N2.
minu(N1,N2,M):- N1 < N2, M is N1.


/* EOF */