Ответ в теме: Удалить предпоследний элемент списка на 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.
Сама функция является рекурсивной. От начала списка отделяются элементы до тех пор, пока задача не станет элементарной – для списка из двух элементов функция должна вернуть список из последнего элемента. На возврате из рекурсии отделенные от начала списка элементы добавляются к результату.