Реализация «последнего» в Прологе
Я пытаюсь почувствовать программирование на Прологе, пройдя 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
?