Основные понятия, возникающие при написании программ – это
X N Variable1 Переменная2 LongSong ДолгаяПесня
CONS CAR CDR ATOM EQ
Формат:
(функция аргумент1 аргумент2 ... )
(CONS 1 2 )
Обычно кроме базовых средств в язык включается и набор наиболее употребимых базовых операций над числами и другими данными. Если введены числа, то введены и традиционные арифметические операции, но форма их применения подчинена общим правилам:
(+ 1 2 3 4) ;; = 10
Формат:
(функция1 (функция2 аргумент21 аргумент22 ... ) аргумент2 ... )
(CAR (CONS 1 2 ) ) (CONS (CAR (CONS 1 2 ) ) (CDR (CONS 3 4 ) ))
Этих правил достаточно, чтобы более ясно выписать CAR, CDR, CONS, ATOM, EQ над S-выражениями:
(CAR (CONS x y)) = x (CDR (CONS x y)) = y (ATOM (CONS x y)) = Nil (CONS (CAR x) (CDR x)) = x для неатомарных x. (EQ x x) = T если x атом (EQ x y) = Nil если x и y различимы
Любые композиции заданного набора функций над конечным множеством произвольных объектов можно представить таким способом, но класс соответствующих им процессов весьма ограничен и мало интересен. Организация более сложного класса процессов требует более детального представления в программах соответствия между именами и их значениями или определениями, изображения
QUOTE в виде списка:(QUOTE (C O N S T ))
Используется и сокращенная запись – апостроф перед произвольным данным.
'(C O N S T )
В зависимости от контекста одни и те же объекты могут выполнять роль QUOTE, предохраняющая свой аргумент от вычисления.
(QUOTE A) |
Константа A объявлена. |
(QUOTE (A B C) ) |
Константа (A B C) объявлена. |
(ATOM (QUOTE A)) = T |
Аргументом предиката "ATOM" является константа – атом "А" |
(ATOM (QUOTE (A B C) )) = Nil |
Аргументом предиката является константа - список (A B C) |
(ATOM A) |
Аргументом предиката "ATOM" является |
(третий (QUOTE (A B C))) |
Применение новой функции к значению, не требующему вычисления, - константа (A B C). |
Упражнение. Запишите
(LAMBDA (x) (CAR (CDR (CDR x))) )
| |_____________________|_____определение функции
| ___________________________ параметр функции
При вызове такой
((LAMBDA (x) (atom x)) 123) ; = T
X получит значение 123 на время применения построенной
Связанную Lambda, а значение она получит при вызове функции.
DEFUN, первый аргумент которого - имя функции, второй – собственно именуемое определение функции. DEFUN является ее первый аргумент, который становится объектом другой категории. Он меняет свой статус – теперь это (DEFUN третий (x) (CAR (CDR (CDR x))) )
| | |__________________|_______ определение функции
| |_____________________________ параметры функции
|___________________________________ имя новой функции
Новая функция "третий" действует так же как " Caddr " в таблице 3.4.
Именование функций работает подобно заданию значений
Обычно в рассуждениях о
Представления функции могут вычисляться и передаваться как параметры или результаты других функций.
Соответствие между именем функции и ее определением может быть изменено, подобно тому, как меняется соответствие между именем
COND (condition). Ее аргументами являются ветви, представленные как двухэлементные списки, содержащие предикаты и соответствующие им (COND (p1 e1) (p2 e2) ... (pk ek) )
|______|________|__________ предикаты для выбора ветви
|______|____ ___|__________ ветви условного выражения
Каждый предикат pi или ветвь ei может быть любой формы: переменная,
Обычное условное выражение (if Predicate Then Else) или (если Predicate то Then иначе Else) может быть представлено с помощью функции COND следующим образом:
(COND (Predicate Then)(T Else))
Или более наглядно:
(COND (Predicate Then )
(T Else )
)
Вычисление ряда форм в определении может быть обусловлено заранее заданными предикатами.
(COND ((EQ (CAR x) (QUOTE A)) (CONS (QUOTE B) (CDR x))) (T x) )
Атом " T " представляет тождественную истину. Значение всего условного выражения получается заменой первого элемента из значения переменной x на B в том случае, если (CAR x) совпадает с A.
Объявленные здесь специальные функции QUOTE, COND, LAMBDA и DEFUN существенно отличаются от элементарных функций CAR, CDR, CONS, ATOM, EQ правилом обработки аргументов. Обычные функции получают значения аргументов, предварительно вычисленные системой программирования по формулам фактических параметров функции.
Специальные функции не требуют такой предварительной обработки параметров.
Они сами могут выполнять все необходимое, используя представление фактических параметров в виде S-выражений.
Как правило рекурсивное применение функций должно быть определено в комплекте с нерекурсивными ветвями процесса. Основное предназначение условных выражений -
Для примера рассмотрим функцию, выбирающую в списке самый левый атом:
Алг Левейший ( список x) арг x
нач
если Atom (x)
то знач := x
иначе знач := Левейший (Car (x))
кон
Новая функция " Левейший " выбирает первый атом из любого данного.
(DEFUN Левейший (x)
(COND ((ATOM x) x)
(T (Левейший (CAR x))) ))
Если x является атомом, то он и является результатом, иначе функцию " Левейший " следует применить к первому элементу значения x, которое получается в результате вычисления формулы (CAR x). На составных x будет выполняться вторая ветвь специальной функции COND, выбираемая по тождественно истинному значению встроенной T.
Определение функции " Левейший " рекурсивно. Эта функция действительно работает в терминах самой себя. Важно, что для любого S-выражения существует некоторое число применений функции CAR, после которого из этого S-выражения обязательно выделится какой-нибудь атом, следовательно процесс вычисления функции всегда определен, детерминирован, завершится за конечное число шагов. Можно сказать, что для определенности рекурсивной функции следует формулировать условие ее завершения.
Введенные обозначения достаточны, чтобы пронаблюдать формирование значений и преобразование форм в процессе исполнения функциональных программ.
Рассмотрим вычисление формы:
(APPLY (DEFUN Левейший (x)
(COND ((ATOM x) x)
(T (Левейший (CAR x))) ))
(QUOTE ((A . B) . C) )
)
Функция " APPLY " применяет функцию " Левейший ", полученную как результат " DEFUN ", к ее аргументам – константе " ((A . B) . C) ".
DEFUN дает имена обычным функциям, поэтому фактический параметр функции " Левейший " будет вычислен до того как начнет работать ее определение и переменная " x " получит значение " (A . B) . C) ".
x = ((A . B) . C))
Имя " Левейший " теперь работает как известное название функции, которое может быть вызвано в форме:
( Левейший ' ((A . B) . C) )
| Вычисляемая форма | Очередной шаг | Результат и комментарии |
|---|---|---|
| Вход в рекурсию | ||
(Левейший (QUOTE ((A . B) . C))) |
Выбор определения функции и | (COND ((ATOM x) x)(T (Левейший (CAR x))) ) |
| Первый шаг рекурсии | ||
| Выделение параметров функции | (QUOTE ((A . B) . C)) | |
(QUOTE ((A . B) . C)) |
Вычисление аргумента функции | X = ((A . B) . C) |
(COND ((ATOM x) x)(T (Левейший (CAR x))) ) |
Перебор предикатов: выбор первого | (ATOM x) |
(ATOM x) |
Вычисление первого предиката | Nil = "ложь",т.к. X – не атом. Переход ко второму предикату |
T |
Вычисление второго предиката | T = "истина" – константа. Переход к выделенной ветви |
| Второй шаг рекурсии | ||
(Левейший (CAR x)) |
выделение параметров функции | (CAR x) |
(CAR x) |
Вычисление аргумента функции | X = (A . B) Рекурсивный переход к редуцированному аргументу |
(COND ((ATOM x) x)(T (Левейший (CAR x))) ) |
Перебор предикатов: выбор первого | (ATOM x) |
(ATOM x) |
Вычисление первого предиката | Nil = "ложь", т.к. X – не атом. Переход ко второму предикату |
T |
Вычисление второго предиката | T = "истина" – константа. Переход ко второй ветви |
| Третий шаг рекурсии | ||
(Левейший (CAR x)) |
выделение параметров функции | (CAR x) |
(CAR x) |
Вычисление аргумента функции | X = A Рекурсивный переход к редуцированному аргументу |
(COND ((ATOM x) x) (T (Левейший (CAR x))) ) |
Перебор предикатов: выбор первого | (ATOM x) |
(ATOM x) |
Вычисление первого предиката | T – т.к. X теперь атом Преход к первой ветви |
X |
Вычисление значений переменной | A Значение функции получено и вычисление завершено |
| Выход из рекурсии | ||
Некоторые определения функций могут быть хорошо определены на одних аргументах, но зацикливаться на других, подобно традиционному определению факториала при попытке его применить к отрицательным числам. Результат может выглядеть как исчезновение свободной памяти или слишком долгий счет без видимого прогресса. Такие функции называют частичными. Их определения должны включать в себя
(Запись на алгоритмической нотации)
алг АБС( цел x) арг x
нач
если (x < 0)
то знач := - x
иначе знач := x
кон
(эквивалентная Лисп-программа)
(DEFUN Абс(LAMBDA (x)
(COND ((< x 0 )(- x))
(T x))))
(Запись на алгоритмической нотации)
алг ФАКТОРИАЛ ( цел N) арг N
нач
если (N = 0)
то знач := 1
иначе знач := N * ФАКТОРИАЛ (N - 1)
кон
(эквивалентная Лисп-программа)
(DEFUN Факториал (N)
(COND ((= N 0 ) 1 )
(T ( * N (Факториал (- N 1 ))) )
))
Это определение не завершается на отрицательных аргументах.
Функция, которая определена лишь для некоторых значений аргументов естественной области определения, называется частичной функцией.
(Запись на алгоритмической нотации)
алг НОД ( цел x, y) арг x, y
нач
если (x < y)
то знач := НОД ( y, x)
инес Остаток (y, x) = 0
то знач := x
иначе знач := НОД (Остаток (y, x), x)
кон
остаток [x, y] - функция, вычисляющая остаток от деления x на y.
(эквивалентная Лисп-программа)
(DEFUN НОД (LAMBDA (x y)
(COND ((< x y) (НОД y x))
((= (остаток y x ) 0 ) x )
(T (НОД (остаток y x) x ))
))
)
Как и любое S-выражение, символьные представления функций могут быть значениями аргументов -
Базис элементарного Лиспа образуют пять функций над S-выражениями CAR, CDR, CONS, ATOM, EQ и четыре специальных функции, обеспечивающие управление программами и процессами и конструирование функциональных объектов QUOTE, COND, LAMBDA, DEFUN.
Далее мы построим определение универсальной функции EVAL, позволяющее вычислять значения выражений, представленных в виде списков, - правило интерпретации выражений.
Формально для перехода к практике нужна несколько большая определенность по механизмам исполнения программ, представленных S-выражениями:
| (Declare Спецификации ) | Специфицирует |
| (Defmacro Название Параметры Определение ) | Глобальное определение макроса |
| (Defun Название Параметры Форма ) | Определение функции |
| (Function Название ) | #’ – выдает названную функцию |
| ( Lambda Параметры Определение ) | Конструирует |
Lambda, а значение она получит при вызове функции.CAR, CDR, CONS, ATOM, EQ и четыре специальных функции, обеспечивающие управление программами и процессами и конструирование функциональных объектов QUOTE, COND, LAMBDA, DEFUN.Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.