Hallo Franz,
letztes_element(X,[X]). /* 1 Regel */
letztes_element(X,[Y|YS]) :- letztes_element(X,YS). /* 2 Regel */?- letztes_element(X,[5,3,1]).
Am besten kann dir das sicherlich Prolog selber erklären:
| ?- trace.
|
| Yes
| [trace] ?- letztes_element(X,[5,3,1]).
| Call: (7) letztes_element(_G504, [5, 3, 1]) ? creep
| Call: (8) letztes_element(_G504, [3, 1]) ? creep
| Call: (9) letztes_element(_G504, [1]) ? creep
| Exit: (9) letztes_element(1, [1]) ? creep
| Exit: (8) letztes_element(1, [3, 1]) ? creep
| Exit: (7) letztes_element(1, [5, 3, 1]) ? creep
|
| X = 1
|
| Yes
Wenn du letztes_element(X,[5,3,1]) als Abfrage eingibst, dann versucht Prolog das ganze so zu matchen, dass er für X etwas passendes einsetzt, so dass dein Prädikat erfüllt wird. Dabei geht Prolog Backtracking-mäßig von oben nach unten durch und probiert so lange rum, bis entweder was passt oder alles fehlschlägt.
Also probiert er erst Regel 1, die klappt nicht, weil [5, 3, 1] nicht auf [X] passt, Regel 2 kann aber angewandt werden und besagt, dass deine Abfrage dann klappt, wenn letztes_element(X,[3, 1]) wahr ist. Jetzt geht die Sache wieder von oben los, Rgegel zwei passt und besagt, dass dies der Fall ist, wenn letztes_element(X,[1]) wahr ist.
Bei dem dritten Durchlauf von oben passt die Aussage auf den Kopf von Regel 1, wenn die Substitution [1/X] angwendet wird. Da Regel 1 ein Faktum ist, kann deine Eingabe also für X = 1 erfüllt werden, und das gibt dir Prolog auch aus.
Solltest du noch ein paar Prolog Aufgaben suchen, dann darfst du übrigens gerne unter http://eins2003.info.uni-karlsruhe.de/uebungsblaetter.php gucken.
Wie kommst du eigentlich auf Prolog? So zum Spaß? Ich darf recht bald meine Info 1 Klausur schreiben, mag sein, dass es da auch dran kommt.
Viele Grüße,
Stefan