Implementing "last" in Prolog
===

I am trying to get a feel for Prolog programming by going through Ulle Endriss' [lecture notes][1].  When my solution to an exercise does not behave as expected, I find it difficult to give a good explanation.  I think this has to do with my shaky understanding of the way Prolog evaluates expressions.

Exercise 2.6 on page 20 calls for a recursive implementation of a predicate `last1` which behaves like the built-in predicate `last`.  My attempt is as follows:

>     last1([_ | Rest], Last) :- last1(Rest, Last).
>     last1([Last], Last).

It gives the correct answer, but for lists with more than one element, I have to key in the semicolon to terminate the query.  This makes `last1` different from the built-in `last`.

    ?- last1([1], Last).
    Last = 1.

    ?- last1([1, 2], Last).
    Last = 2 ;
    false.

If I switch the order in which I declared the rule and fact, then I need to key in the semicolon in both cases.

I think I know why Prolog thinks that `last1` may have one more solution (thus the semicolon).  I imagine it follows the evaluation sequence

    last1([1, 2], Last).
    ==>  last1([2], Last).
    ==>  last1([], Last).    OR    Last = 2.
    ==>  false    OR    Last = 2.

That seems to suggest that I should look for a way to avoid matching `Rest` with `[]`.  Regardless, I have no explanation why switching the order of declaration ought to have any effect at all.

**Question 1:**  What is the correct explanation for the behavior of `last1`?

**Question 2:**  How can I implement a predicate `last1` which is indistinguishable from the built-in `last`?

  [1]: http://staff.science.uva.nl/~ulle/teaching/prolog/prolog.pdf