Последний элемент списка на Prolog

      Комментарии к записи Последний элемент списка на Prolog отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 4 мес. назад.

  • Автор
    Сообщения
  • #3227

    В SWI Prolog для получения последнего элемента списка есть встроенная функция last(List, Element). В Visual Prolog и Turbo Prolog эту функцию можно написать вручную.

    Сначала опишем типы данных — элемент списка и список, а также прототип нашей функции — она принимает два аргумента — список и элемент:

    domains
      element_d = integer
      list_d = element_d*
    predicates
      last(list_d, element_d)
    

    Функция должна обрабатывать список рекурсивно, при этом завершать работу если он состоит из одного элемента. Если же в списке большее число элементов, то первый элемент пропускается, а остальные рекурсивно обрабатываются, полученный при этой обработке результат нужно вернуть.

    Этот процесс можно изобразить в виде следующей блок-схемы:
    last-element-prolog

    Обратите внимание, в ней не учитывается случай, когда на вход подан пустой список. В Prolog в этом случае попытка разделения списка на голову и хвост завершится неудачей, а значит наш предикат вернет false (это корректный результат, т.к. пустой список не содержит последнего элемента).

    По блок-схеме можно написать код на Prolog:

    clauses
      last([Element], Element):-!.
      last([_|Tail], Element):-
      	last(Tail, Element).
    

    Для запуска программы в Turbo Prolog, можно описать следующие цели в разделе goal:

    goal 
      last([1,2,4], X). % -> 4
      %last([1], X). -> 1
      %last([], X). -> false

    Вы можете прочитать более общую статью про обработку списков в Prolog.

Для ответа в этой теме необходимо авторизоваться.