Реализация «последнего» в Прологе

Я пытаюсь почувствовать программирование на Прологе, пройдя Ulle Endriss & apos;конспект лекций, Когда мое решение для упражнения не ведет себя должным образом, я затрудняюсь дать хорошее объяснение. Я думаю, что это связано с моим шатким пониманием того, как Prolog оценивает выражения.

Упражнение 2.6 на стр. 20 требует рекурсивной реализации предикатаlast1 который ведет себя как встроенный предикатlast, Моя попытка заключается в следующем:

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

Он дает правильный ответ, но для списков с более чем одним элементом мне нужно ввести точку с запятой, чтобы завершить запрос. Это делаетlast1 отличается от встроенногоlast.

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

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

Если я поменяю порядок, в котором я объявил правило и факт, то мне нужно ввести точку с запятой в обоих случаях.

Я думаю, я знаю, почему Пролог так думаетlast1 может иметь еще одно решение (таким образом, точка с запятой). Я предполагаю, что это следует за последовательностью оценки

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

Это говорит о том, что я должен искать способ избежать соответствияRest с[], Несмотря на это, у меня нет объяснения, почему изменение порядка объявления должно иметь какой-либо эффект.

Question 1:  Какое правильное объяснение поведенияlast1?

Question 2:  Как я могу реализовать предикатlast1 который неотличим от встроенногоlast?

Ответы на вопрос(3)

Ваш ответ на вопрос