Aaaalso,
Prolog arbeitet das Prädikat von oben nach unten ab. Dieses Prädikat besteht aus zwei Zeilen. Es wird also geschaut, ob X Teil der Liste [X] ist, also etwa. letztes_element(beispiel,[beispiel]). Dann stoppt Prolog und liefert true.
Wenn aber etwa anderes in der Liste steht, wird die erste Zeile nicht ausgeführt, da sie nicht anwendbar ist, denn letztes_element(beispiel,[wasanderes]) erfüllt nicht die erste Zeile.
In der zweiten Zeile passt hingegen vieles. Etwa passt
letztes_element(beispiel,[kopf|rest]). Daher wird letzes_element mit den Werten aufgerufen. X=beispiel und YS=rest, daher beginnt eine Rekursion. :- signalisiert, dass das gleiche Prädikat wieder aufgerufen wird, eben mit beispiel, rest.
letztes_element(X,[X]).
letztes_element(X,[Y|YS]) :- letztes_element(X,YS).
Wenn Du nun eine Abfrage startest, also beispielweise
letztes_element(X, [Hans, Peter, Ulrike]). abfragst, dann kann das erste Prädikat nicht wirken, da X ungleich Hans, Peter, Ulrike, da X keine Liste ist und daher nur ein Element enthält. Es würde nur X=Ulrike liefern, wenn Du zum Beispiel letztes_element(X, [Ulrike]). abfragen würdest.
Bei der längeren Liste hingegen wird die zweite Zeile wirksam, die sich dann mit letztes_element(X, [Peter, Ulrike]) und in der zweiten Rekursion mit l_e(X, [Ulrike]) aufruft. Hier ist endlich etwas erreicht, was die Abbruchbedingung, also die erste Zeile annehmen kann.
Kapiert?
Heiner