
- •1. Парадигмы императивного и декларативного программирования.
- •2. Основные задачи для функционального и логического программирования.
- •3. Основные понятия систем ии.
- •4. Понятие функционального программирования и основные положения по а.П. Ершову.
- •5. Понятие функциональности.
- •10. Свойства функционального программирования в постановке а. П. Ершова.
- •11. Структура символьного выражения в Лиспе.
- •12. Символы, атомы, константы, t, nil, списки.
- •13. Список как основная структура функционального и логического программирования.
- •14. Префиксная нотация Лиспа, вычисление арифметических выражений.
- •15. Понятие псевдофункции.
- •16. Псевдофункция статического связывания объекта.
- •21. Основные примитивы Лиспа для обработки списка.
- •22. Графическое представление списка.
- •23. Принципы работы с памятью функциональной и логической программы
- •24. Автоматические сборщики мусора
- •25. Старт-стопные сборщики мусора и сборщики мусора реального времени
- •Ключевой параметр optional, key, res.
- •33. Карринговая форма записи функций нескольких переменных.
- •48. Функция принадлежности аргумента списка, декларативное определение
- •56. Генератор в программировании, понятие вычислительного контекста
- •57. Связь дисциплины логического программирования с дисциплиной "базы данных"
- •65. Резолюция, правило резолюции как процедура вывода решений
- •66. Сопоставление в логическом программировании
- •81. Оператор присваивания в прологе
- •82. Детерминированные и недетерминированные предикаты
- •83. Отсечение, операционная модель Пролога в случае применения отсечения.
- •88. Рекурсивное логическое программирование
- •105. Металогические предикаты
- •106. Металогические предикаты для анализа структуры термы
- •107. Металогические предикаты для определения типа переменных
Ключевой параметр optional, key, res.
Виды параметров обозначаются пометкой &optional, &key и &rest соответственно, размещаемой перед параметрами в lambda списке формальных аргументов. При этом серийный параметр должен быть последним в списке.
Ключевые параметры, являясь необязательными, не зависят еще и от порядка вхождения в список аргументов.
33. Карринговая форма записи функций нескольких переменных.
Карринговая форма записи функции - конкатенация нескольких функций. Является частью лямбда-исчислений чёрча. Можно и в ленивых и в энергичных исчислениях. Только в энергичных исчислениях практически ничего не даёт.
Функция двух переменных x и y f(x,y) = x + y может быть рассмотрена как функция одной переменной x, возвращающая функцию одной переменной y, то есть как выражение ?x.?y.x+y Такой приём работает точно так же для функций любой арности. Это показывает, что функции многих переменных могут быть без проблем выражены в ?-исчислении. Описанный процесс превращения функций многих переменных в функцию одной переменной называется карринг (также: каррирование), в честь американского математика Хаскелла Карри.
Формы организации временного контекста (let/let*).
let служит для одновременного присваивания значений нескольким переменным.
Контекстом называется переменная и её связь в данный момент времени.
(let ((p1 f1)(p2 f2)...(pn fn)) F)
(let* ((p1 f1)(p2 f2)...(pn fn)) F)
Последовательная и одновременная передача параметров вычисляемой формы.
В начальный момент времени вычисляются фактические параметры и связываются с формальными а)одновременно c let б)последовательно с let*. Далее вычисляется значение формы F.
>(let ((x 5)(y 10)) (+ x y))
15
>(let ((x 5)(y (*x 2))) (+ x y))
ошибка. x ещё не связан
>(let* ((x 5)(y (*x 2))) (+ x y))
15
Форма организации условных вычислений cond.
cond-выражение - форма организации ветвящихся выражений в лиспе. Каждый аргумент функции COND должен быть списком ровно из двух элементов.
(cond
(p1 f11 f12...f1n)
(p2 f21 f22...f2n)
(pl fl1 fl2...fln)
)
)
)
37. Последовательные вычисления в Лиспе.
Последовательно вычисляются предикаты p1,p2,pl, до тех пор пока значение какого либо предиката не будет отлично от него. Если такой предикат найден не будет, то вернётся NIL. Если предикат p2 найдет, то вычисляется последовательно и значение последней формы возвращается в качестве всего выражения. Последовательность форм может отсутствовать, тогда возвращается
Помимо формы cond в lisp'е существует целый ряд других форм, организующих ветвление. Наиболее популярные формы - форма if, организующая ветвление на 2 направление. Форма case, обеспечивающая порядок между ветвями.
38. Формы организации циклических вычислений do и do*.
Do и Do*
(do
((v1 v10 f1) (v2 v20 f2)...(vn vn0 fn)) v1 - переменная цикла, v10 - начальное значение, f1 - форма изменения переменной v1
(p fp1 fp2 ... fpn) - ветвь выхода из цикла. p - предикат, в случае истинности которого вычисляются fp1, fp2 ... fpn и значение последнего возвращается как результат работы всего выражения
F1 F2 Fk - последовательность форм, тело цикла
39. Принципы работы по организации ввода-вывода в Лиспе.
Изначально интерпретатор создает два потока: ввода и вывод. Они связаны с консолью. Если необходимо связать вывод с файлом, то необходимо перенаправить соответствующий выдоной поток на файл. Программы функциональные и логические работают только с текстовыми файлами соответственно в последовательном режиме ввода-вывода.
(setq p
(open _filename_ :direction)
)
(print p x y)
40. Рекуррентные отношения.
Рекурсивная функция предполагает, что задача, с помощью рекурентных отношений, может быть описана, и известно решение для простых "условий". f(n)->f(m) n>m; f(n)=n*f(n-1) f(1)=1; Простая предполагает наличие явного вызова функции в её теле.
41. Примитивные рекурсивные функции
В качестве исходных функций обычно применяются нуль-функция, функция проецирования и функция последования. Нуль-функция имеет значение ноль на всей области определения. Функция проецирования выделяет элемент последовательности, а функция последования генерирует очередной элемент последовательности.
42. Классификация и виды рекурсии.
предлагается следующая классификация видов рекурсии: явная и взаимная рекурсии. Явная (прямая) рекурсия определяется наличием в теле функции явных обращений к ней самой.
Виды явной рекурсии:
1. Рекурсия по значению.
2. Рекурсия по аргументу.
3. Параллельная рекурсия.
При взаимной (неявной или косвенной) рекурсии функция содержит обращение к себе через цепочку вызовов других процедур. Определение такой рекурсивной функции состоит из определений как минимум двух функций: определения самой рекурсивной функции,
содержащей вызов другой (вспомогательной) функции и определения вспомогательной функции, содержащей вызов определяемой (рекурсивной) функции.
43. Рекурсия по аргументу, пример
Функция называется рекурсией по аргументу, если ее рекурсивные вызовы определяют результат функции.
В Эрланге
nth1(_,L) when L==[] -> [];
nth1(X,[H|_]) when X==0 -> H;
nth1(X,[_|T]) -> nth1((X-1),T).
2> recc:nth1(2,[a,s,d,f,g]).
D
44. Рекурсия по значению, пример
Рекурсия по значению определяется в случае, если рекурсивный вызов является выражением, определяющим результат функции.
На эрланге:
mem (_,[])->false;
mem (x,[x|_])->true;
mem (x,[Y|T))->mem(x,t).
45. Параллельная рекурсия
Рекурсия, определяемая как параллельная, предполагает, что в теле рекурсивной функции содержится вызов другой функции, как минимум от двух аргументов.
46. Косвенная рекурсия, пример
При взаимной (неявной или косвенной) рекурсии функция содержит обращение к себе через цепочку вызовов других процедур
На Эрланге следующее определение:
even1(L) when L==[] -> true;
even1([_|T]) -> number1(T).
number1(L) when L==[] -> false;
number1([_|T]) -> even1(T).
1> recc:even1([1,2,3]).
false
2> recc:even1([1,2,3,4]).
true
3> recc:number1([1,2,3,4]).
False
47. Реализация рекурсивного вызова, функция трассировки в Лиспе
Фреймом активации называется совокупность всех данных, необходимых для одной а активации функции. В выполнении рекурсивного процесса выделяют следующие стадии:
Стадия порождения рекурсивных вызовов: характеризуется тем, что процесс выполнения доходит до рекурсивной ветви, запоминает существующий на данный момент фрейм активации и запускает процесс выполнения этой же функции с новым фреймом активации;
Стадия возврата: начинается, когда в какой-либо i-й ветви будут выполнены какие-то начальные условия. Функция возвращает значение в предшествующий процесс и так до тех пор, пока не будут выполнены все отложенные процессы. Значение 1-го процесса – значение 1-ой функции. За ходом выполнения рекурсивных функций можно следить с помощью трассировки.
Для управления трассировкой в Лиспе введены функции TRACE и UNTRACE.
>(TRACE function)
FUNCTION
>(UNTRACE function) ; отключение трассировки