Prolog rekursion durch heads der heads von listen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Prolog rekursion durch heads der heads von listen

    Hallo,

    ich habe ein Problem, da ich eine Liste die aus vielen Listen besteht durchlaufen möchte.
    Diese sieht so aus:
    [[2, f(eins),f(zwei)],[6,f(drei),f(vier)],[2,f(fünf),f(n)]].
    Dabei soll der Head des Heads der Liste ([[H|_]|_]) jeweils mit dem Head der 2, und
    der 3. Liste verglichen werden(die Integer). Es soll dann der höchste Wert festgestellt werden
    und dann dieser ausgegeben werden.
    Ich habe allerdings Probleme bei der Abbruchbedingung der Rekursion, da leere Liste ([]) nicht funktioniert. Wie durchlaufe ich den nur jeweils die Heads einer Liste rekursiv? Wie lautet denn die Abbruchbedingung?
    Kann mir da jemand helfen und das eine oder andere Prädikat (Prüfprädikat) nennen?
    Sorry, wenn diese Frage ein wenig trivial ist, aber ich bin noch unerfahren in Prolog.
    Vielen Dank schonmal..

    % Hier nur so in etwa:
    laufe([]). % wie sieht die Abbruchbedingung aus?
    laufe([[H|_]|_]):-
    I=H,
    laufe([[ .. ]]) % wie rufe ich jetzt den Tail auf, der wieder den nächsten Head hat?
  • OK, ich versuche es mal. *kramt sein altes Logik-Buch raus*

    Erstmal die Regeln um das Maximum zweier Zahlen zu bestimmen:

    Quellcode

    1. getmaximum(X, X, Y) :- X >= Y.
    2. getmaximum(Y, X, Y) :- X < Y.


    Dann die Regeln um mir von einer Liste den Header ausgeben zu lassen (Typüberprüfung spaar ich mir):

    Quellcode

    1. getheader(0, []).
    2. getheader(Header, [Header|Rest]).


    Bei einer leeren Listenmenge ist das Ergebnis 0.

    Quellcode

    1. getbigestheader(0, []).


    Das Ergebnis ergibt sich aus dem Maximum von A und B.
    A wird ermittelt, indem man sich den Header der ersten Liste ausgeben lässt.
    B wird ermittelt, ind demm man den ganzen Spass rekursiv mit den restlichen Listen aufruft.

    Quellcode

    1. getbigestheader(Ergebnis, [ErsteListe|RestListen]) :- getmaximum(Ergebnis, A, B), getheader(A, ErsteListe), getbigestheader(B, RestListen).



    Das Programm ist NICHT GETESTET, da ich mir kein Prolog installieren will. :D
    Nimm es als gedanklichen Ansatz (habe 4 Jahre kein Prolog mehr gemacht).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Hafner ()