
- •ОгЛавление
- •8 Литература 93
- •Лабораторная работа №1 Знакомство с языком логического программирования Пролог
- •1.1 Цель работы
- •1.2 Теоретические сведения
- •1.3 Среда VisualProlog
- •1.4 Выполнение работы
- •1.5 Задание на лабораторную работу
- •2.3 Выполнение работы
- •2.4 Задание на лабораторную работу
- •2.5 Контрольные вопросы
- •Лабораторная работа №3 Рекурсивные структуры данных
- •3.1 Цель работы
- •3.2 Теоретические сведения
- •3.3 Выполнение работы
- •3.4 Задание на лабораторную работу
- •3.5 Контрольные вопросы
- •Лабораторная работа №4 Знакомство с языком списочных структур Лисп
- •4.1 Цель работы
- •4.2 Теоретические сведения
- •4.3 Среда FreeLisp
- •4.4 Выполнение работы
- •4.5 Задание на лабораторную работу
- •4.6 Контрольные вопросы
- •Лабораторная работа №5 Рекурсия и итерация в языке Лисп
- •5.1 Цель работы
- •5.2 Теоретические сведения
- •5.3 Выполнение работы
- •5.4 Задание на лабораторную работу
- •5. 5. Контрольные вопросы
- •6.2.2 Замыкания
- •6.2.3 Макросы
- •6.3 Задание на лабораторную работу
- •6.4 Контрольные вопросы
- •Лабораторная работа №7 Методы поиска решений в пространствах состояний
- •7.1 Цель работы
- •7.2 Теоретические сведения
- •7.4 Выполнение работы
- •7.5 Задание на лабораторную работу
- •7.6 Контрольные вопросы
- •8 Литература
4.4 Выполнение работы
Лисп обычно используется в режиме интерпретации. Интерпретатор Лиспа функционирует следующим образом: когда пользователь заканчивает ввод какого-либо выражения, интерпретатор вычисляет и выдает значение этого выражения. Рассмотрим простейший пример. Введите в окне FreeLisp Listener следующее выражение и нажмите клавишу enter:
CL-USER 1 > 3
3
Мы ввели число 3, которое является атомом и, следовательно, s-выражением. Интерпретатор Лиспа вычисляет значение этого s-выражения и выдает результат. Он совпадает с введенным выражением, поскольку значением числа является само это число. Введем следующее выражение:
CL-USER 2 > (+ 2 5) ; s-выражение
7 ; результат
При вычислении s-выражений интерпретатор Лиспа следует следующим правилам:
Если s-выражение число, то значением этого выражения является само это число.
Если s-выражение список, то значения всех аргументов, исключая первый, вычисляются, а затем передаются как аргументы в функцию, обозначенную первым символом.
Например, при вычислении значения выражения (* (+ 1 2) (- 4 3)) интерпретатор вначале вычислит значения первого и второго аргументов функции «*». Первый и второй аргументы являются списками. В каждом из этих списков аргументы являются числами. Значением числа является само это число. Числа 1 и 2 передаются в качестве аргументов в функцию «+». Числа 4 и 3 передаются в качестве аргументов в функцию «-». Затем результаты вычисления первого и второго выражений (3 и 1) передаются в качестве аргументов в функцию «*».
Пока что мы не рассмотрели как вычисляются s-выражения, которые являются символами. Если мы зададим следующее символьное выражение, то получим сообщение об ошибке.
CL-USER 3 > A
Error: The variable A is unbound
Символы можно использовать как переменные. В этом случае они могут обозначать некоторые выражения. У символов изначально нет какого-нибудь значения как у констант. В нашем примере интерпретатор не может вычислить значение символа, поскольку его у символа нет. Свяжем переменную A с каким-либо значением, используя функцию setf:
CL-USER 4 > (setf A 3)
3
Теперь, когда мы связали значение с переменной A, интерпретатор позволит нам вычислить значение s-выражение:
CL-USER 5 > A
3
Мы можем использовать переменную A в более сложном s-выражении:
CL-USER 6 > (+ A A)
6
Рассмотрим еще несколько примеров применения описанных выше функций:
CL-USER 7 > quote (+ 2 5)
(+ 2 5)
Обратите внимание на использование функции quote, которая просто возвращает переданный ей аргумент. Аналогом функции quote является символ ’.
CL-USER 8 > ’(+ 2 5)
(+ 2 5)
CL-USER 9 > (+ 2 5)
7
Некоторые примеры использования функций работы со списками:
CL-USER 10 > (car ’(1 2 3))
1
CL-USER 11 > (cdr ’(1 2 3))
(2 3)
CL-USER 12 > (nth 1 ’(1 2 3)) ; нумерация с нуля
2
CL-USER 13 > (first ’(1 2 3))
1
CL-USER 14 > (list 1 2 3)
(1 2 3)
CL-USER 15 > (cons 1 ’(2 3))
(1 2 3)
4.5 Задание на лабораторную работу
Записать и вычислить s-выражения для следующих формул:
(3 * 17) + (4 * 19)
Построить диаграммы списочных ячеек для выражений:
(+ 3 5)
(x (a b (c)))
(((nil)))
Вычисление выражения (caadr (cadr ’(a ’(b (c))))) вернет результат b. Если же мы вычислим вторую часть этого выражения, то есть (cadr ’(a ’(b (c)))), то получим ’(b (c)). Вычисление же (caadr ’(b (c))) даст в результате c. Необходимо объяснить, почему так получается.