
- •Лабораторная работа №1
- •((Height 72) (weight 175) (hair blond)) элемент 175
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Редактор muLisp.
- •Загрузка редактора
- •Команды редактора
- •Краткое описание функций muLisp
- •1. Функции выборки
- •2. Конструирующие функции
- •3. Функции распознавания
- •4. Функции сравнения
- •7. Примитивы определения функций
Лабораторная работа №3
I. Определение функций и их вычисление в Лиспе основано на исчислении Черча. В Лиспе -выражение имеет вид
(lambda (x1 x2 ... xn) fn),
где символ lambda означает, что мы имеем дело с определением функции, xi - формальные параметры, которые представлены в виде имен аргументов в описывающем вычисления теле функции fn. -выражение является определением безымянной функции, она не может быть вычислена без фактических параметров. После вычисления функция пропадает, ее нельзя вызвать по имени (в отличие от defun-определения функции).
Примеры:
1. $((lambda (x y)
(+ x y)) ; лямбда-определениие
2 3) ; аргументы
5 ; результат
-
Телом лямбда-выражения является лямбда-выражение (вложенные вызовы):
$((lambda (y) ; тело (внешнего) лямбда-вызова вновь
((lambda (x) ; (внутренний) лямбда-вызов
(list y x)) ; и его тело.
‘ВНУТРИ)) ; аргумент
‘ВНЕ) ; аргумент (внешнего вызова)
(ВНЕ ВНУТРИ) ; результат
-
Имя и значение символа
Значением константы является сама константа
Символ может обозначать произвольное выражение
SET - вычисляет имя и связывает его
SETQ - связывает имя, не вычисляя его
SETF - обобщенная функция присваивания
EVAL - вычисляет значение значения.
Примеры:
-
$(set ‘функции ‘(car cdr cons atom eq))
/* Между символом функции и значением образована связь */
(CAR CDR CONS ATOM EQ)
$(set (car функции) ‘(поговорим немного))
/* вычисляется car от ранее вычисленного значения функции. Это есть CAR. Этому вычисленному значению присвоен список (поговорим немного) */
(ПОГОВОРИМ НЕМНОГО)
$(car функции)
CAR
$car
(ПОГОВОРИМ НЕМНОГО)
$функции
(CAR CDR CONS ATOM EQ)
-
$(setq функции ‘(car cdr cons atom eq)) ;
/* Установлена связь между символом функции и значением (car cdr cons atom eq ), но вычисление символа функции автоматически блокировано */
(CAR CDR CONS ATOM EQ)
-
$(‘(+ 2 3))
(+ 2 3)
(eval ‘(+ 2 3))
5
-
Управляющие структуры в Лиспе.
Последовательное исполнение: предложения
(PROG1 форма1 форма2 ... формаN) и
(PROGN форма1 форма2 ... формаN).
Переменное число аргументов этих форм вычисляются последовательно, возвращается значение первого аргумента для PROG1 и последнего - для PROGN.
Пример:
$(progn (setq x 2) (setq y (* 3 x)))
6
$x
2
Разветвление вычислений: условное предложение
(COND (p1 a1)
(p2 a2)
...
(pN aN))
Проверяется истинность выражений pi, вычисляется то выражение ai, для которого истинно условие (предикат) pi, вычисленное значение возвращается в качестве значения COND. Если ни одно из условий не выполняется, то значением COND будет NIL.
Условное предложение (IF условие то-форма иначе-форма)
$(if (atom t) ‘атом ‘список)
АТОМ
Циклическое выражение (LOOP m1 m2 ...) реализует цикл, в котором формы m1, m2, ... вычисляются снова и снова , пока в одной из форм не встретиться оператор завершения RETURN или другая форма, завершающая вычисления.
$(setq num 5)
$(loop ((zerop num)) ;zerop возвращает t, если num=0, иначе nil
(prin1 num) ;выводит на печать num, в той же строке
(space 2) ;в выходном потоке пропускает 2 озиции
(print (* num num)) ; выводит в выходной поток аргумент
; с переходом на новую строку
(decq num)) ;уменьшает значение аргумента на 1
Задание к выполнению лабораторной работы
1. Определить с помощью лямбда-выражения функцию, вычисляющую x+y-x*y
2. С помощью предложения COND определить функцию, которая возвращает в качестве значения столицу заданного аргументом государства.
-
С помощью предложения PROGN реализовать следующий алго-ритм:
переменная n1 связана с суммой двух целых чисел, переменная n2 связана с произведением двух других чисел. Если n1<n2, то если n1 отрицательное число, то утраивается n2, иначе выдается сумма n1 и n2, иначе - разность n1 и n2.
-
Определить функцию (ПРОИЗВЕДЕНИЕ n m), вычисляющую произведение целых положительных чисел.
5. Определить функцию expt2 (x n), вычисляющую возведение в степень n числа x. Определение осуществить с помощью цикла LOOP.
Замечание. Для п.3 используйте предикаты: (< n1 n2), вычисляющий Т, если n1<n2 , иначе NIL; (minusp n1) - T, если n1<0.