1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Probleme bei Prolog Aufgabe

    • Frage
  • timmytime
  • 25. Mai 2014 um 13:33
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • timmytime
    Punkte
    15
    Beiträge
    2
    • 25. Mai 2014 um 13:33
    • #1

    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 :)

  • emptyvi
    Punkte
    2.037
    Beiträge
    374
    • 25. Mai 2014 um 14:05
    • #2
    Zitat von timmytime

    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 :)

    Alles anzeigen

    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]

    2 Mal editiert, zuletzt von emptyvi (25. Mai 2014 um 14:11)

  • timmytime
    Punkte
    15
    Beiträge
    2
    • 25. Mai 2014 um 14:24
    • #3

    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:/

  • emptyvi
    Punkte
    2.037
    Beiträge
    374
    • 25. Mai 2014 um 15:29
    • #4
    Zitat von timmytime

    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]

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum