Ответ в теме: Удалить предпоследний элемент списка на Prolog

      Комментарии к записи Ответ в теме: Удалить предпоследний элемент списка на Prolog отключены
#3049

domains
ilist = integer*
rlist = real*
slist = symbol*
predicates
rem_penult(ilist, ilist)
rem_penult(rlist, rlist)
rem_penult(slist, slist)
clauses
rem_penult([_Penult, Last], [Last]):-!.
rem_penult([Head|Tail], [Head|TailResult]):-
rem_penult(Tail, TailResult).
goal 
RList = [3.14, 5.45, 3.34],
rem_penult(RList, RResult).

Для того, чтобы программа на Visual Prolog работала со списком, соответствующий тип данных нужно объявить в секции domains — мы объявили там списки трех видов.
Чтобы функция могла принимать на вход разные типы аргументов, соответствующие объявления нужно добавить в секцию predicates.
Сама функция является рекурсивной. От начала списка отделяются элементы до тех пор, пока задача не станет элементарной — для списка из двух элементов функция должна вернуть список из последнего элемента. На возврате из рекурсии отделенные от начала списка элементы добавляются к результату.