- •Предложения в языке Пролог.
- •Термы Пролога.
- •Процедурная семантика и декларативный смысл.
- •Списки. Базовые операции над списками.
- •Операция сопоставления.
- •Перебор в Прологе. Механизм прямой трассировки и механизм возврата.
- •Отсечение в прологе, виды отсечений.
- •Арифметические действия в прологе.
- •Операторная запись.
- •Типовые предикаты Пролога.
- •Работа с базами данных.
- •Пролог и искусственный интелект.
- •Экспертные системы.
- •Двоичные деревья, двоичные справочники.
- •Решение логических задач, головоломок.
- •Представления графов в Прологе.
- •Как Пролог-система отвечает на вопросы пользователя.
- •Понятие строго функционального языка.
- •Определение функции. Безымянная лямбда функция.
- •Списки, операции над списками.
- •Внутреннее представление списков.
- •Символ, значение символа, свойства символа.
- •Рекурсия в Прологе, рекурсия по значению и аргументу.
- •Виды рекурсий в Лиспе.
- •Функции более высокого порядка. Применяющие и отображающие функционалы.
- •Замыкания.
- •Лисп в искусственном интеллекте.
Функции более высокого порядка. Применяющие и отображающие функционалы.
в Лиспе принята единообразная скобочная форма записи S-выражений, что позволяет сделать вывод, что смысл любого выражения зависит от его контекста. Другими словами, одно и то же выражение в одном случае может выступать как данное, а в другом – как функция.
Аргумент функции, значением которого является функция, называется функциональным аргументом, а функция, имеющая функциональный аргумент – функционалом. Функция, которая возвращает в качестве результата другую функцию, называется функцией с функциональным значением.
Одним из основных классов функционалов являются те, которые применяют функциональный аргумент к параметрам. Такие функционалы называются применяющими. Они родственны универсальной функции Лиспа – EVAL, которая вычисляет значение произвольной формы, а не только функции. В Лиспе имеются применяющие функционалы APPLY и FANCALL.
Формат функционала APPLY следующий:
(apply fn list),
где fn – функция; list – список аргументов, к которому применяется функция.
Например,
> (apply '* '(2 3))
6
>.
Следующий применяющий функционал – FUNCALL по своему действию аналогичен APPLY, но аргументы для вызываемой функции получает не списком, а по отдельности. Его формат следующий:
(funcall fn ar1 ar2 … arn).
Можно сказать, что он применяет функцию к последовательности аргументов, например,
> (funcall '+ 2 3)
5.
Отображающие функционалы определенным образом отображают список (последовательность) в новую последовательность или порождают побочный эффект, связанный с исходной последовательностью
Различают два вида MAP-функционалов, первый из которых применяет функциональный аргумент к CAR-последовательностям списка, а второй – к CDR-последовательностям. Наиболее распространенные из MAP-функционалов – MAPCAR и MAPLIST.
Формат MAPCAR следующий:
(mapcar fn ’(ar1 ar2 … arn)).
Функционал работает следующим образом: вначале применяется функция к CAR-элементу, затем к CADR-элементу и так далее, до конца списка. Результатом функции будет являться список результатов от применения функционального аргумента ко второму параметру MAPCAR, например,
(mapcar 'atom '(a s d f))
(T T T T).
Для работы хвостовыми частями списков используют функционал MAPLIST, его формат следующий:
(maplist fn list),
где – fn – функциональный аргумент;
– list – список.
MAPLIST работает подобно MAPCAR, но только не над элементами списка, а над CDR-последовательностями списка, причем исходно полагается, что исходный список является собственным хвостом. Например,
>(maplist 'cdr '(a b c))
((B C) (C) NIL).
Разновидностью MAPCAR и MAPLIST являются функционалы MAPCAN и MAPCON, которые строят новые списки из результатов, используя структуроразрушающую функцию NCONC.
Примеры использования этих функционалов:
> (mapcon 'reverse '(a s d))
(D S A D S D)
>(mapcan '(lambda(n)((minusp n))(list n)) '(3 -7 4 0 -5 1))
Замыкания.
Замыкание - это связь свободных переменных в некотором контексте.
Замыкание - это функция и контекст его применения. Сформированный на время вычисления контекст после окончания ее вычисления пропадает, и на него невозможно позже сослаться или вернуться к нему. Часто бывает полезным и необходимым, чтобы функция для продолжения вычислений могла запомнить связи и состояние более раннего контекста. Это достигается с помощью таких функциональных объектов, в которых вместе с самим описанием вычислений сохраняется контекст момента определения функционального объекта, защищённый от более позднего контекста вызова. Пару, состоящую из функции (лямбда-выражения) и контекста, называют замыканием или лексическим замыканием. Замыкание, как и имя функции или лямбда-выражение, можно использовать в качестве функционального аргумента
> (defun generate-even (*evenum*)
(function
(lambda()
(setq *evenum* (+ *evenum* 2)))))
> (setq gen-even-1 (generate-even 0))
> (funcall gen-even-1)
2
> (funcall gen-even-1)
4
> (funcall gen-even-1)
6
