Sabrina: Prolog Problem

Hallo zusammen,
ich habe ein kleines Problem mit Prolog, ich möchte den folgendem Code mit einem Prädikat ergänzen, "laengeDesKuerzestenWegs/2" das dann in der Liste mit Ergebnisses die kleinste Längenangabe ermittelt. Aber ich stecke an der Stelle ganz schön fest und weiss nicht, wie ich dieses Prädikat in meinen Code sinnigerweise einbinden kann, vielleicht ist jemadem hier so ein Problem schonmal begegnet!? Ich bin für jede Hilfe dankbar.

Gruß
Sabrina

weg(ort(bahnhof), ort(krieg,friedrich)).    wegsuche2(X, Y, [Y], 1) :-
weg(ort(bahnhof),                             weg(X, Y).
    ort(lautenschlager,kronen)).            wegsuche2(X, Y, [Z|Weg1], L) :-
weg(ort(krieg,friedrich),                     weg(X, Z),
    ort(friedrich,kronen)).                   wegsuche2(Z, Y, Weg1, L1),
weg(ort(lautenschlager,kronen),               L is L1 + 1.
    ort(friedrich,kronen)).                 wegsuche(X, Y, [L, X|Weg]) :-
weg(ort(friedrich,kronen),                    wegsuche2(X, Y, Weg, L1),
    ort(krieg,kronen)).                       L is L1 + 1.
weg(ort(friedrich,kronen), ort(uni)).
weg(ort(krieg,kronen), ort(krieg,keppler)). findeWeg(X, Y) :-
weg(ort(krieg,keppler), ort(uni)).            bagof(Weg1, wegsuche(X, Y, Weg1), Wege),
                                              write(Wege).
 findeWeg(X, Y) :-
               bagof(Weg1, wegsuche(X, Y, Weg1), Wege),
                                              laengeDesKuerzestenWegs(Wege, Laenge),
                                              nl, nl,
                                              write('Der kürzeste Weg ist '),
                                              write(Laenge), write(' Stationen lang.'),
                                              nl.

  1. Hi,

    also das laengeDesKuerzestenWegs Prädikat bekommt ja quasi eine liste von listen, wo jeweils an erster stelle die länge des weges abgespeichert ist, soweit ich den prolog quellcode nachvollziehen konnte also würde ich jetzt das Prädikat so gestallten, das du rekursiv durch die liste durchläufst und jedesmal das erste element anschaust ob es das grösste ist. eine andere schnellere lösung ist, du schreibst deine bagof zeile so um, dass sie nur das erste element nimmt also nur die länge und dann wenn du z.b. swi prolog verwendest max_list/2 auf die liste anwendest

    das sehe dann ungefähr so aus
    findeWeg(X, Y) :-
      bagof(Laenge, wegsuche(X, Y, [Laenge | _]), Laengen),
      max_list(Laengen, Max),
      write(Max).

    ich hab leider keine prolog hier um es zu testen aber so müsste es funktionieren

    grüsse flo