Nochmal Prolog Rekursion

Hiho - ich schon wieder! :smile:

Hier mal ein etwas komplizierteres Beispiel.
Gegebene DB:

directTrain(lueneburg, hamburg).
directTrain(bremen, lueneburg).
directTrain(braunschweig, hannover).
directTrain(hannover, lueneburg).
directTrain(hamburg, kiel).
directTrain(magdeburg, braunschweig).
directTrain(berlin, magdeburg).
directTrain(moskau, krakau).

Es soll eine Regel definiert werden, die prüft, ob man von einer Stadt zu einer anderen Reisen kann. Das kann anhand der vorhandenen Fakten geschehen:

travel(A,B) :- directTrain(A,B).

Auch wenn kein Fakt dafür definiert ist - über Umwege kommt man auch von Berlin nach Hamburg. Dazu brauche ich wieder Rekursion - gibt es eine andere Stadt C, zu der A fährt und kann man von dieser Stadt C nach B reisen:

travel(A,B) :- directTrain(A,C), travel(C,B).

So nun zum Problem:
?- travel(lueneburg, hamburg). gibt true zurück. Das ist soweit korrekt - es gibt ja einen Fakt, der das belegt.
?- travel(hamburg, lueneburg). gibt allerdings false zurück - es ist zwar die gleiche Verbindung, aber A und B sind ja hier vertauscht.

Ich hab also die erste Regel erweitert:
travel(A,B) :- directTrain(A,B); directTrain(B,A).

Jetzt gibt auch meine zweite Anfrage true zurück.
Es geht weiter - folgende Anfrage ist gültig:
?- travel(magdeburg, bremen).

Diese jedoch nicht:
?- travel(bremen, magdeburg).

Wo liegt das Problem? Welche weitere Regel brauche ich, damit ich alle Verbindungen korrekt abfragen kann? Eine Erklärung dazu wäre auch sehr hilfreich.

Dankö und
mfG Christoph

Hi.

Es soll eine Regel definiert werden, die prüft, ob man von
einer Stadt zu einer anderen Reisen kann. Das kann anhand der
vorhandenen Fakten geschehen:

travel(A,B) :- directTrain(A,B).

Auch wenn kein Fakt dafür definiert ist - über Umwege kommt
man auch von Berlin nach Hamburg. Dazu brauche ich wieder
Rekursion - gibt es eine andere Stadt C, zu der A fährt und
kann man von dieser Stadt C nach B reisen:

travel(A,B) :- directTrain(A,C), travel(C,B).

[…]

Ich hab also die erste Regel erweitert:
travel(A,B) :- directTrain(A,B); directTrain(B,A).

Jetzt gibt auch meine zweite Anfrage true zurück.
Es geht weiter - folgende Anfrage ist gültig:
?- travel(magdeburg, bremen).

Diese jedoch nicht:
?- travel(bremen, magdeburg).

Wo liegt das Problem? Welche weitere Regel brauche ich, damit
ich alle Verbindungen korrekt abfragen kann? Eine Erklärung
dazu wäre auch sehr hilfreich.

Meine Prolog-Zeiten sind lange vorbei, kann also sein, dass ich falsch liege.
Deine erste Regel
travel(A,B) :- directTrain(A,B); directTrain(B,A).
erlaubt als Direktverbindung beide Richtungen. Das ist schonmal gut. Deine 2. Regel
travel(A,B) :- directTrain(A,C), travel(C,B).
setzt als erste (Teil-)Etappe aber auf jeden Fall eine Verbindung A -> C voraus, da ist die Gegenrichtung also nicht erlaubt.
Helfen würde meiner Meinung nach eine 3. Regel
travel(A,B) :- directTrain(C,A), travel(C,B)

Sebastian.

travel(A,B) :- directTrain(C,A), travel(C,B)

Hm… Ich vermute, das scheint eine Art Endlosschleife zu sein.
Ich bekomme den Fehler „Out of local stack“.

So ähnlich habe ich es auch schon versucht - ich habe die 2. Regel erweitert, doch auch das führte zum „Out of local stack“ error:

travel(A,B) :-
(
directTrain(A,C);
directTrain(C,A)
),
travel(C,B).