Bahnauskunftssystem in Prolog

erweiterte Lösung

Diese Lösung zeichnet sich durch eine vereinfachte Eingabe aus.
Start des Bahnauskunftssystems mit der Abfrage ?-start.
Danach ist auch so etwas wie eine Benutzerführung bei den Eingaben zu erkennen. Diese müssen jeweils mit einem Punkt und Betätigung der <Return>-Taste abgeschlossen werden.
Das Auskunftssystem wird durch die Eingabe von "ende." beendet.

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

Zurck