/* Datenbank */
/* nur aus Fakten bestehend */
/* strecke(Anfangsort,Endort,Laenge). */
strecke(erfurt,weimar,21).
strecke(weimar,apolda,16).
strecke(weimar,bad_berka,15).
strecke(weimar,jena,23).
strecke(apolda,naumburg,23).
strecke(naumburg,halle,43).
strecke(halle,leipzig,41).
strecke(naumburg,leipzig,54).
strecke(naumburg,camburg,13).
strecke(camburg,jena,14).
strecke(jena,stadtroda,15).
strecke(stadtroda,hermsdorf,11).
strecke(hermsdorf,gera,19).
strecke(jena,kahla,15).
strecke(kahla,orlamuende,5).
strecke(orlamuende,rudostadt,12).
strecke(orlamuende,poessneck,14).
strecke(rudolstadt,saalfeld,11).
strecke(saalfeld,probstzella,25).
strecke(erfurt,soemmerda,25).
strecke(soemmerda,sangerhausen,45).
strecke(sangerhausen,eisleben,22).
strecke(eisleben,halle,38).
/* Regel, die sichert, dass die Verbindung reflexiv wird. */
direkte_verbindung(Von,Nach,Laenge):-
strecke(Von,Nach,Laenge);
strecke(Nach,Von,Laenge).
auskunft(Anfang,Ziel):-verbindung(Anfang,Ziel,Weg,[Anfang]),
write('Laenge der Strecke: '),
write(Weg),nl.
start:-write(' Bahnauskunftssystem in Prolog'),
nl,
write(' ==============================='),
nl,nl,
write(' Die Eingaben mÅssen mit einem Punkt und RETURN abgeschlossen werden.'),
nl,
write(' Abbruch durch Eingabe von "ende." '),
nl,
write(' Geben Sie bitte den Startbahnhof ein: '),
nl,
read(Start),write(Start),nl,
start(Start).
start(ende):-!.
start(Start):-write(' Geben Sie bitte den Zielbahnhof ein: '),
read(Ziel),write(Ziel),
nl,nl,
write(' Die folgenden Verbindungen wurden gefunden. '),
nl,
auskunft(Start,Ziel).
start(Start):- write(' Es gibt keine weiteren Verbindungen.'),
start.
/* Der direkte Fall: Anfangs- und Zielort sind Nachbarorte. */
verbindung(Anfang,Ziel,Weg,Liste1):-direkte_verbindung(Anfang,Ziel,Weg),
not element(Ziel,Liste1),
append(Liste1,[Ziel],Liste2),
write(Liste2),nl.
/* Der allgemeine Fall:
1. vom Anfagsort zu einem direkt benachbarten Umsteigeort und
2. von diesem Umsteigeort eine Verbindung zum Zielort suchen */
verbindung(Anfang,Ziel,Weg,Liste1):-
direkte_verbindung(Anfang,Umsteige,Weg1),
not element(Umsteige,Liste1),
append(Liste1,[Umsteige],Liste2),
verbindung(Umsteige,Ziel,Weg2,Liste2),
Weg is Weg1 + Weg2.
element(X,[X|Ls]).
element(X,[Kopf|Rest]):-element(X,Rest).
append([],L2,L2).
append([Kopf|Rest1],L2,[Kopf|Rest3]):-append(Rest1,L2,Rest3).
|