Bahnauskunftssystem in Prolog

3. Lösungsschritt

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

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

Das Prädikat auskunft/2 hat in dieser Lösung die Funktion des Starts der Auskunft. Für ein zweistelliges Prädikat lassen sich viel einfacher und benutzerfreundlicher Anfragen formulieren. Es ruft mit der Übergabe des Start- und Zielortes und einer Liste, in der der Startort eingetragen ist, das rekursive Prädikat verbindung/4 auf.
Die Listenprädikate element/2 und append/3 wurden in die Lösung mit aufgenommen. Ersteres überprüft, ob ein Element in einer gegebenen Liste enthalten ist. Mit dem Prädikat append/3 fügt man zwei Listen zu einer Gesamtliste zusammen. Falls in der zweiten Liste nur ein einziges Element enthalten ist, wird also nur dieses an die 1. Liste angehängt.
Rekursion ist zur Lösung also doch notwendig. Ohne Verwaltung der besuchten Orte in einer Liste und ohne ständigem Überprüfen, ob ein Ziel- oder Umsteigebahnhof schon in der Liste enthalten ist, funktioniert das Auskunftssystem jedoch nicht korrekt.

eine erweiterte Lösung

Zurck