- •Лабораторная работа №1
- •((Height 72) (weight 175) (hair blond)) элемент 175
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Редактор muLisp.
- •Загрузка редактора
- •Команды редактора
- •Краткое описание функций muLisp
- •1. Функции выборки
- •2. Конструирующие функции
- •3. Функции распознавания
- •4. Функции сравнения
- •7. Примитивы определения функций
Лабораторная работа №4
Оперативная память, в которой работает Лисп-система, логически разбивается на маленькие области. Эти области называются списочными ячейками. Списочная ячейка состоит из двух частей – полей СAR и CDR. Каждое из полей содержит указатель. Указатель может ссылаться на другую списочную ячейку. Указателем списка является указатель на первую ячейку списка. На ячейку могут указывать не только поля СAR и CDR, но и используемый в качестве переменной символ. Например, следующий вызов создает списочную структуру:
$(setq список ‘(a b c))]
CONS - это неатомный объект данных , который указывает на два других объекта данных. CONS создает ячейку и возвращает на нее указатель. Допустим, что у нас есть два списка:
$(setq голова ‘(b c)) и
$(setq хвост ‘(a b c).
Вызов функции
$(cons голова хвост)
строит список из ранее построенных списков ГОЛОВА и ХВОСТ:
Каждый CONS имеет только 2 "ветви", поэтому такие диаграммы называются бинарными деревьями. Вместо бинарных деревьев чаще используют представление в виде точечной пары . Например : (cons ‘a ‘b) соответствует точечная пара (A . B). Левый элемент CONS - это CAR от CONS, правый - CDR от CONS.
В результате вычислений в памяти могут возникнуть структуры, на которые нельзя сослаться. Это происходит тогда, когда вычисленная структура не сохраняется с помощью setq или когда теряется ссылка на старое значение. Говорят, что эти ячейки стали мусором. Мусор возникает и тогда, когда результат вычисления не связывается с какой-нибудь переменной. Например, значение вызова
$(cons ‘a (list ‘b))
(A B)
лишь печатается, после чего соответствующая ему структура остается в памяти мусором.
В Лиспе с символом можно связать именованные свойства. Свойства символа записываются в хранимый вместе с символом список свойств. Формат списка свойств имеет вид:
(имя1 значение1 имя2 значение2... имяn значениеn).
Назначение свойств символу может осуществляться с помощью функций присваивания SETQ или определения функции DEFUN. Эти же функции используются для изменения значений свойств. Для чтения свойств символа используется функция GET:
(get символ свойство)
Присваивание свойства или изменение значения существующего свойства осуществляется с помощью функции PUTPROP:
(putprop символ свойство значение)
Удаление свойства:
(remprop символ свойство)
Чтение списка свойств:
(symbol-plist символ)
Примеры:
$(put ‘ягода-рябины ‘вкус ‘кислый)
КИСЛЫЙ
$(put ‘ягода-рябины ‘цвет ‘красный)
КРАСНЫЙ
$(put ‘ягода-рябины ‘вес ‘((2 г)))
((2 Г))
$symbol-plist ‘ягода-рябины)
((ВЕС (2 Г)) (ВКУС . КИСЛЫЙ) (ЦВЕТ . КРАСНЫЙ))
$(remprop ‘ягода-рябины ‘вкус)
ВКУС
$(get ‘ягода-рябины ‘вкус)
NIL
Ассоциативный список (а-список) – это структура данных, основанная на списках и точечных парах. Для работы с а-списком имеются встроенные функции. Ассоциативный список состоит из точечных пар, поэтому его называют списком пар:
((a1 . d1)(a2 . d2) ... (an . dn)).
Первый элемент пары (CAR) называют ключом (key), а второй (CDR) – связанным с ключом данным (datum). С помощью а-списка можно объединять разнотипные данные, поименованные ключами компоненты данных. Таким образом можно легко создавать базы данных, из которых информация просто и быстро выбирается, модифицируется. Для работы с а-списками используются следующие функции. Перед использованием обрабатывающих а-список функций необходимо его инициализировать, например функцией setq.
(assoc ключ а-список ) – ищет пару, соответствующую ключу.
(putassoc ключ данные а-список) – изменяет а-список.
(rassoc данные а-список) – ищет по данным значение ключа (обратная функция assoc).
(acons ключ данные а-список) – добавляет точечную пару в начало а-списка.
Пример. Создать словарь.
$(setq словарь ‘((один . one)))
(ОДИН . ONE)
$(putassoc ‘два ‘two словарь)
(ДВА . TWO)
$словарь
((ОДИН . ONE)(ДВА . TWO))
$(assoc ‘два словарь)
(ДВА . TWO)
$(rassoc ‘two словарь)
(ДВА . TWO)
$(acons ‘нуль ‘zero словарь)
((НУЛЬ . ZERO)(ОДИН . ONE)(ДВА . TWO))
Задание к выполнению работы.
-
Создать список столиц государств.
-
Показать возможность добавления и удаления элементов списка.
-
Создать список, содержащий свойства воды как химического соединения.
-
Добавить к созданным свойствам воды свойство состояния
(жидкость).
-
Ввести новый список, определяющий свойства льда. Этот список
должен включать свойства воды и новое свойство - температуру.
-
Добавить к полученному списку свойство льда - цвет в начало
списка.
-
Использовать функции доступа к полям списка по ключу и по
значению данных.
Приложение 1
Краткое введение в систему muLISP.
Интерпретатор содержится в файле mulisp.com .
После загрузки программы на экран выводится таблица:
-
1 = Other generic MS-DOS computer
2 = IBM PC or "look-alike" computers
3 = ANSI.SYS screen or VT-100 Terminal
4 = TI Professional Computer
5 = Zenith Z-100 Computer or VT-52 Terminal
6 = Hewlett-Packard HP-150 Computer
7 = Hewlett-Packard HP-110 Computer
8 = NEC Advanced Personal Computer or ADM-3A Terminal
Please enter your computer type number
Если здесь не указан тип вашей ЭВМ, выберите тип "2".
После запуска на экран выдается приглашение к диалогу в виде "$". Когда пользователь заканчивает ввод какого-либо выражения или вызов функции, то интерпретатор вычисляет и выдает значение этого выражения:
$ (+ 2 3)
5
$ (* (+ 1 2)(+ 3 4))
21
Для блокировки вычисления выражения используется апостроф ('):
$ '(+ 2 3)
(+ 2 3)
$ ( CAR '(+ 2 3))
+
Для трассировки функций перед их запуском необходимо ввести команду
(rds ‘debug)
(trace <список имен функций, входящих в состав выполняемой функции>),