Probleme bei Prolog Aufgabe

  • For englisch version scroll down.

    Guten Tag zusammen,

    ich habe folgendes Prolog program gegeben:

    what([],0).
    what([X],X).
    what([X,Y|R],N):- M is X -Y, what(R,K), N is M + K.


    Gesucht ist das Resultat von
    ?- what(3,1,5,9,7],N).

    Die Antwort darauf ist N = 5

    Jedoch müssen wir das in der Klausur ohne Computer herausfinden.
    Nun meine Frage ans Forum: Wie kommt das Programm auf N = 5 ?

    Given is the following Prolog program:.

    what([],0).
    what([X],X).
    what([X,Y|R],N):- M is X – Y, what(R,K), N is M + K.

    a) What is the result of the question

    ?- what([3,1,5,9,7],N).
    N = 5, but I don't know why :)

  • Das ist einfach nur ein rekursiver Aufruf. Im Prinzip passiert nichts anderes, als dass die ersten beiden Zahlen aus der Liste genommen werden, die zweite von der ersten subtrahiert wird. Und N dann gleich dieser Differenz + der Differenz im nächsten Aufruf ist. Bei ungerader Anzahl an Elementen ist die letzte Differenz (Liste hat nur eine Zahl) einfach die Zahl selbst (man könnte auch sagen die Differenz zwischen der Zahl und 0 --> [3,1,5,9,7,0] wäre das gleiche). Insgesamt läuft's darauf hinaus, dass einfach die Summe der Differenzen alle Zahlenpaare gebildet wird: (7-0) + (5-9) + (3-1). Nachdem das aber alles andere als intuitiv oder "sofort ersichtlich" ist, hilft es, sich das ganze aufzuschreiben:

    Code
    what([3,1,5,9,7],N) --> X = 3, Y = 1, R = [5,9,7], M = 3 - 1 = 2, N = 2 + K --> rekursiver Aufruf what([5,9,7],K)
       what([5,9,7],N) --> X = 5, Y = 9, R = [7], M = 5 - 9 = -4, N = -4 + K --> rekursiver Aufruf (what[7],K)
          what([7],N) --> N = 7
       --> K = 7. --> N = -4 + 7 = 3.
    --> K = 3. --> N = 2 + 3 = [B]5[/B].

    l.g. [icon]http://emptyvi.net:10080/smileys/laugh_pp2.png[/icon]

  • Super vielen Dank!
    Vielleicht kannst du mir auch bei meinem nächsten Problem helfen :lauscher:

    Define Prolog clauses for a predicate delete that deletes an Element E in an upwardly sorted list L of integer numbers (if it is contained).
    Example: -? delete(5,[4,5,7,9,12],L). returns L = [4,7,9,12]


    Ich finde keinen Weg, wie ich auf die Lösung kommen könnte:/

  • Super vielen Dank!
    Vielleicht kannst du mir auch bei meinem nächsten Problem helfen :lauscher:

    Define Prolog clauses for a predicate delete that deletes an Element E in an upwardly sorted list L of integer numbers (if it is contained).
    Example: -? delete(5,[4,5,7,9,12],L). returns L = [4,7,9,12]


    Ich finde keinen Weg, wie ich auf die Lösung kommen könnte:/


    Nachdem da nirgendwo steht, dass du das ganze effizient implementieren sollst (aka, die geordnete Datenstruktur ausnutzen sollst), kannst du es z.B. so machen, dass du immer das erste Element aus der Liste entfernst, und wenn es ungleich dem gesuchten ist, gibst du "erstes Element" + "Rückgabewert des rekursiven Aufrufes mit dem Rest der Liste" aus, oder, wenn das Element gleich ist, und nicht in der Liste vorkommen soll nur "Rückgabewert des rekursiven Aufrufes" zurück. Falls du nicht selber drauf kommst, wie man das schreiben könnte (ACHTUNG: Logikorientiertes Programmieren ist bei mir ein paar Jahre her - habe selber ein wenig im Prolog-Interpreter rumgespielt ^^):

    Spoiler anzeigen


    delete(E,[X|R],L) :- X = E, L = K, delete(E, R, K).
    delete(E,[X|R],L) :- X \= E, L = [X|K], delete(E, R, K).
    delete(_,[],[]).

    Du könntest jetzt noch die Rekursion abbrechen, wenn die Zahlen in der Liste bereits größer als das gesuchte Element sind: Alle Elemente danach sind nur noch größer, und können auf keinen Fall gleich dem gesuchten Element sein (Hint: Mehr als eine Zeile mehr im Code brauchts nicht):

    Spoiler anzeigen


    delete(E,[X|R],[X|R]) :- X > E.
    delete(E,[X|R],L) :- X = E, L = K, delete(E, R, K).
    delete(E,[X|R],L) :- X \= E, L = [X|K], delete(E, R, K).
    delete(_,[],[]).

    l.g. [icon]http://emptyvi.net:10080/smileys/dance_ss.gif[/icon]

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!