Автор работы: Пользователь скрыл имя, 19 Февраля 2011 в 15:30, лабораторная работа
Цель: Ознакомиться со средой MuLisp. Изучить базовые функции Лиспа, символы и их свойства, а также средства для работы с числами.
1.Основные положения программирования на Лиспе.
2.Загрузка системы, системный редактор.
3.Базовые функции языка. Символы, свойства символов.
4.Средства языка для работы с числами.
5.Задание к лабораторной работе.
6.Вопросы.
(PAIRLIS ‘(три два) ‘(Петров Сидоров)
спис)) р
((три . Петров) (два . Сидоров) (один . Иванов))
ASSOC.
Ассоциативный список можно считать отображением из множества ключей в множество значений. Данные можно получить с помощью функции
(ASSOC
ключ а-список)
которая
ищет в списке пар данные, соответствующие
ключу, сравнивая искомый ключ с ключами
пар слева направо.
_(ASSOC
‘три спис) р
(три . Петров)
ACONS.
Ассоциативный список можно обновлять и использовать в режиме стека. Новые пары добавляются к нему только в начало списка, хотя в списке уже могут быть данные с тем же ключом. Это осуществляется функцией ACONS:
(ACONS x y а-список)
Поскольку ASSOC
просматривает список слева направо и
доходит лишь до первой пары с искомым
ключом, то более старые пары как бы остаются
в тени более новых.
Строки.
Строка состоит из последовательности знаков. В строке знаки записываются в последовательности друг за другом, для ограничения которой с обеих сторон в качестве ограничителя используется знак «».
При вводе строки в интерпретаторе, в качестве результата получаем ту же строку.
CHAR.
Произвольный элемент строки можно прочитать (т. е. сослаться на него с помощью индекса) функцией CHAR:
(CHAR строка n)
(CHAR «строка» 0) р \с
;индексация начинается с 0
Сравнение строк.
(STRING= строка1 строка2)
(STRING< строка1 строка2)
(STRING> строка1 строка2)
(STRING/= строка1 строка2)
Массивы.
Для работы с массивами в MuLisp необходимо загрузить файл ARRAY.LSP.
Массивы создаются формой:
(MAKE-ARRAY
(n1 n2 ... nN) режимы)
Функция возвращает в качестве значения новый объект - массив. n1, n2, ... nN - целые числа, их количество N отражает размерность массива, а значения - размер по каждой размерности. Необязательными аргументами можно задать тип элементов массива, указать их начальные значения или придать самому массиву динамический размер. Общий размер массива в этом случае знать и закреплять не обязательно.
Для вычислений, осуществляемых с массивами, наряду с функцией создания массива используются функции для выборки и изменения элементов массива. Ссылка на элемент N-мерного массива осуществляется с помощью вызова:
(ARREF массив n1 n2 ...nN)
n1, n2, ..., nN - координаты, или индексы,
элемента, на который ссылаются. В качестве
функции присваивания используется обобщенная
функция присваивания SETF.
_(SETQ мас (MAKE-ARRAY ‘(5 4)
:ELEMENT-TYPE ‘ATOM
:INITIAL-ELEMENT A)) р (ARRAY ((A A A A) ... (A A A A) (5 6)))
_(SETF (AREF мас 0 1) B) р B
_мас р (ARRAY
((A
B A A) ... (A A A A )))
Структуры.
Для объединения основных типов данных (чисел, символов, строк, массивов) в комплексы, отображающие предметы, факты используется составной тип, который называется структурами.
Определение
структурного типа осуществляется с помощью
макроса DEFSTRUCT, формой которого является
(DEFSTRUCT класс-структур
поле1
поле2
...)
Определим
структурный тип БАЗА состоящий из компонент
ПРОФИЛЬ, ПЛОЩ и ВМЕСТИМ:
_(DEFSTRUCT база
профиль площ вместим) р БАЗА
Для
каждого нового типа данных генерируется
начинающаяся с MAKE- функция создания структуры
данного типа. Например объект типа БАЗА
можно создать и присвоить переменной
БАЗА1 следующим вызовом:
_(SETQ БАЗА1
(MAKE-БАЗА))
Полю с помощью ключевого слова, которым является имя поля с двоеточием перед ним, присвоить при создании начальное значение.
Вызов MAKE-БАЗА возвращает в качестве значения созданную структуру.
Для копирования структуры генерируется функция, начинающаяся с COPY- (COPY-БАЗА).
Для
каждого поля определяемой структуры
создается функция доступа, имя которой
образуется написанием после имени типа
через тире имени поля, например:
_(БАЗА-ПРОФИЛЬ x)
Вызов возвращает значение поля ПРОФИЛЬ для БАЗЫ, задаваемой структурой x.
Для
присваивания значений полям структуры
используется обобщенная функция присваивания SETF:
_(SETF
(БАЗА-ПРОФИЛЬ БАЗА1)
ОВОЩ) р
ОВОЩ
3. Представление знаний.
Продукционные системы
Для представления знаний используют различные формализмы и языки представления данных. Наиболее распространенным и простым для понимания является представление знаний при помощи правил продукции вида:
«ЕСЛИ <условие>, ТО <следствие>»
Условия
и следствия - это простые предложения
естественного языка. Такие формализмы
называют продукционными. Эти правила
похожи на условные операторы IF-THEN
языков программирования, однако совершенно
по другому интерпретируются.
(ЕСЛИ на лампочку подано напряжение
и лампочка не горит
то лампочка перегорела)
Через правила можно определить, как программа должна реагировать на изменение данных. При этом не нужно заранее знать блок-схему управления обработкой данных. В обычной программе схема передачи управления и использования данных предопределения самой программой. Ветвление в таких программах возможно только в заранее выбранных точках. Для задач, ход решения которых управляется самими данными, где ветвление скорее норма, чем исключение, этот способ малоэффективен.
Фреймы.
Это частный случай семантических сетей. Это метод представления знаний, который связывает свойства с узлами , представляющими понятия и объекты. Свойства описываются атрибутами (называемыми слотами) и их значениями.
[f(<v1 , g1> , <v2 , g2> , ...)]
где f - имя
фрейма; <vi , gi> - слот; v - имя слота;
g - его значение.
Использование фреймов с их атрибутами и взаимосвязями позволяет хранить знания о предметной области в структурированном виде, представлять в БЗ абстракции и аналогии. Система знаний представляется в виде сети под фреймом или субфреймом. Каждый из фреймов отражает определенные свойства, понятия, т. е. позволяет удовлетворять требованию структурированности и связности.
С операциями присваивания значений фреймам и другими операциями можно сочетать сложные побочные действия и взаимовлияния.
Одной из важнейших концепций формализма фреймов является наследование. Можно дать указание, что если значение слота в одном из фреймов не задается, то фрейм должен унаследовать умалчивамое значение этого слота из фрейма более высокого уровня. Наследование фреймами значений слотов будет осуществляться в том случае, если в фрейме будет присутствовать слот РАЗНОВИДНОСТЬ, в котором содержится имя другого фрейма.
Используются и другие связанные с конкретным применением способы представления, но они менее распространены и, как правило, не годятся для использования в общем случае.
Не
всегда можно однозначно сказать, какой
формализм представления использован
в системе. В рамках одной и той же системы
для представления различных видов знаний
могут быть использованы различные формализмы.
Пример1.
В
качестве примера представления знаний
в виде продукций рассмотрим программу
хранящуюся в файле EXSIS.LSP.
;EXSIS.LSP - пример представления знаний в виде продукций
;определим предложения
являющиеся правилами в виде структур,
состоящих из имени правила, условий и
выводов, представленных в виде списка
фактов
(defstruct
prav имя условия выводы) ;определение структурного
типа PRAV
;создание структур типа PRAV и присваивание их переменным PRAV1 ... PRAV5
(setq prav1 (make-prav :имя 'prav1 ;присвоение полю имя значения
:условия '((жив имеет шерсть))
:выводы
'((жив млекопитающее))))
(setq prav2 (make-prav :имя 'prav2
:условия '((жив кормит детенышей молоком))
:выводы
'((жив млекопитающее))))
(setq prav3 (make-prav :имя 'prav3
:условия '((жив имеет перья))
:выводы
'((жив птица))))
(setq prav4 (make-prav :имя 'prav4
:условия '((жив умеет летать)
(жив несет яйца))