
- •(Конспект лекций)
- •Список сокращений
- •Введение
- •Лекция 1. Языки штучного интеллекта и основы логического программирования Некоторые сведения о языках искусственного интеллекта
- •Введение в логическое программирование Историческая справка
- •Базовые объекты данных
- •Вопросы
- •Переменные
- •Правила
- •Зоны видимости имен
- •Логическая программа
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 2. Процедурная семантика интерпретатора Пролога
- •Метод резолюций
- •Унификация и подстановка
- •Композиция подстановок
- •Вычисление резольвенты
- •Алгоритмы Пролога
- •Стратегии доказательств
- •Процедура поиска доказательства в глубину
- •Пример выполнения логической программы с пошаговым анализом
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 3. Основы программирования в среде Турбо-Пролога
- •Разделы программы
- •Опции компилятора
- •Имена переменных
- •Раздел описаний доменов
- •Разделы описания предикатов и правил
- •Рекурсивные процедуры
- •Моделирование итеративных процедур
- •Основные сведения об арифметических предикатах
- •Внелогические предикаты
- •Работа с файлами
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 4. Списки и управление выводом в Турбо-Пролог-программах Списки
- •Описания списков
- •Шаблон для работы со списками
- •Примеры программ работы со списками
- •Управление формированием вывода Отсечение
- •«Зеленые» и «Красные» отсечения
- •Предикаты not и fail
- •«Циклы» управляемые отказом
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 5. Динамическая база данных в Турбо-Пролог-программах Составные области
- •Операции с динамической базой данных
- •Пример построения проекта с динамической базой данных
- •Ограничения Турбо-Пролога
- •«Циклы» с возвратами
- •Лисп – язык функционального программирования
- •Правильные выражения
- •Базовые предикаты и конструкторы
- •Определяющие выражения функций
- •Условные выражения
- •Выражения для представления циклов
- •Встроенные и определяемые пользователем функции
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 7. Функциональное программирование в среде Лиспа
- •Виды рекурсий Рекурсии по значению и по аргументам
- •Простая рекурсия
- •Параллельная рекурсия
- •Взаимная рекурсия
- •Рекурсии высших порядков
- •Метод накапливающих параметров
- •Функционалы
- •Применяющие функционалы
- •Отображающие функционалы
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 8. Функциональные абстракции и процедурное программирование в Лиспе Представление функции в процессе вычислений Понятие замыкания
- •Создание замыканий
- •Функции с функциональным результатом вычислений и частичные вычисления
- •Функциональные абстракции
- •Формы блоков и связывания переменных
- •Присваивание значений переменным
- •Прочие процедурные формы в Лиспе
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 9. Лисп-методы программирования Программирование, управляемое данными
- •Программирование, управляемое событиями
- •Сопоставление с образцом
- •Списочные образцы
- •Переменные в образцах
- •Образцы с предикатами
- •Продукционное и логическое программирование в Лисп-системах
- •Объектное программирование
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 10. Представление знаний в программах на Лиспе Процедурный подход к представлению знаний
- •Представление знаний на основе продукций
- •Представление продукций
- •Интерпретатор продукций
- •Методы поиска решений
- •Функция для загрузки
- •Разрыв командного цикла и отладка
- •Вычисление s-выражений
- •Функции и формы
- •Типы данных
- •Макросы ввода
- •Lambda-списки
- •Функции ввода/вывода
- •Вычисление форм catch и throw
- •Объектное программирование в Xlisp Создание класса
- •Добавление методов в интерактивном режиме
- •Вопросы для самоконтроля
- •Html-документ Инструментарий создания и редактирования
- •Структура документа
- •Html тэги
- •Информация игнорируемая браузерами
- •Свойства страницы в целом
- •Информация для поисковых систем и стандарты
- •Элементы управления размещением текста и графики
- •Ссылки и протоколы
- •Задание цвета в html
- •Подготовка графики и анимация Графические форматы
- •Подготовка изображений для применения в документе
- •Анимация
- •Вопросы для самоконтроля
- •Управление шрифтами
- •Физические текстовые стили
- •Специальные символы
- •Графика
- •Управление взаимным размещением текста и графики
- •Гипертекстовые и графические ссылки Организация ссылок
- •Графические ссылки
- •Расширенная работа с гиперссылками Типы ссылок в документе
- •Якоря (метки)
- •Атрибут target
- •Изображения-карты
- •Списки и таблицы Виды списков
- •Элементы таблиц
- •Вопросы для самоконтроля
- •Элементы создаваемые тэгом input
- •Простые и графические кнопки
- •Списки выбора
- •Текстовые области
- •Приемы для выравнивания элементов
- •Методы передачи данных к серверу
- •Дизайн web-сайтов Типы сайтов
- •Топология и распределение материала
- •Формат страницы
- •Заглавия и заголовки
- •Навигация
- •Блоки текста
- •Средства позиционирования
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 15. Элементы языка css Язык управления структурой и стилями
- •Размещение css-элементов
- •Адресная модель css
- •Содержимое css-файла или style-контейнера
- •Селекторы
- •Комментарии
- •Применение css в оформлении документов Управление визуализацией
- •Схемы позиционирования
- •Текст и шрифты
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 16. Основы языка Java Script Назначение языка программирования Java Script
- •Тэги для программ на Java Script
- •Основные конструкции языка JavaScript
- •Декларации функций
- •Операторы, операции и выражения
- •Массивы
- •Объектная модель документа
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 17. Объекты и скрипты в html-документах Объекты пользователя
- •Создание объектов
- •Добавление новых свойств и методов
- •Проверка наличия свойств и методов
- •Встроенные объекты языка программирования
- •Обработка особых ситуаций в документе
- •Классификация ситуаций
- •Установление реакции на ситуацию
- •Методы объекта String
- •Программирование работы с метками и гиперссылками
- •Динамическое создание меток и гиперссылок
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Лекция 18. Различные аспекты применения скриптов Управление окнами
- •Динамическое формирование документа
- •Управление слоями
- •Объект, соответствующий форме
- •Адресация и именование
- •Свойства и методы
- •Динамическое изменение надписей и изображений на кнопках
- •Форматы документов отличающиеся от html
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Литература
Вычисление форм catch и throw
Назначение форм catch и throw точно такое же, как и в процедурных языках. Формы необходимы в тех случаях, когда какая-нибудь вложенная программа обнаружит ошибку, по которой можно решить, что дальнейшая работа бесполезна, или даже может навредить. Возврат же управления обычным образом приводит к продолжению вычислений на внешних уровнях и требует дополнительных проверок.
Формы синтаксически записываются следующим образом:
(catch выражение-метки выражение1 выражение2 …)
(throw выражение-метки віражение)
Результатом вычисления формы catch является последнее вычисленное выражение, если в качестве одного из выражений не вычислялась форма throw. Если же вычислялась указанная форма, то нормальный ход вычислений формы catch прерывается и результат вычисления выражения формы throw определяет результат вычисления той обрамляющей формы catch, которая имеет ту же метку, что и форма throw.
Пример
>(setq k 2)
2
>(setq z ‘m1)
m1
>(catch ‘m1 (setq x 3)(+ 5 6 x)
(catch ‘m2 (setq y 1)
(if (> k x) (throw ‘m2 y)
(throw z x))
)
)
3
>
Объектное программирование в Xlisp Создание класса
В Xlisp сообщение объекту посылается вычислением выражения следующего вида:
(send объект-адресат :селектор-сообщения e1 e2 …),
где e1 e2 … - выражения аргументов.
Класс создается посылкой сообщения :isnew к классу class. Имя класса в сообщении не указывается и поэтому созданный объект, представляющий класс, будет удален сборщиком мусора, если его не привязать к некоторой переменной. В сообщении :isnew указываются:
список переменных объекта класса (экземпляра),
список переменных класса и
суперкласс (по умолчанию это класс object).
Результатом вычисления сообщения :isnew является объект, представляющий класс.
Пусть требуется создать класс объектов, представляющих словари. Каждый экземпляр этого класса должен хранить некоторые имена-ключи и сопоставляемые им значения. Необходимо, также, обеспечить добавление новых элементов в словари и поиск элементов по ключам.
Для создания класса словарей выполним следующее:
>(setq dictionary (send class :isnew ‘(entries)))
#<object: #485742a8>
Переменные экземпляра представлены единственной переменной entries. Интерпретатор Лиспа выводит стандартное внешнее представление класса, содержащее адрес его размещения. Значением переменной dictionary является объект, представляющий новый созданный класс.
Добавление методов в интерактивном режиме
Когда создается экземпляр посылкой сообщения с селектором :new к классу, Интерпретатор Лиспа формирует сообщение с селектором :isnew к экземпляру с аргументами, которые являются точной копией аргументов из сообщения :new. Поэтому в первую очередь необходимо определить реакцию экземпляра на сообщение :isnew. Для создания новых методов в классе, необходимо к нему послать стандартное сообщение с селектором :answer, аргументами которого являются:
селектор нового метода,
список параметров, представленный лямбда-списком, и
тело метода.
>(send dictionary :answer :isnew ‘() ; селектор и параметры
‘((setq entries nil) ; тело метода
self)
#<object: #485742a8>
В теле метода вначале устанавливается для переменной entries значение nil. Второе выражение представлено self, что означает, что результатом вычисления метода с селектором :isnew является сам объект, которому посылается сообщение. Тело метода обычно представляют списком выражений и такой список не должен вычисляться. Для этого используется quote-выражение (апостроф).
Определим в классе метод с селектором :add, который обеспечит добавление элементов в словарь. В качестве аргументов должны указываться ключ и значение:
>(send dictionary :answer :add ‘(name value) ; селектор и параметры
‘((setq entries
(cons (cons name value) entries))
value)
#<object: #485742a8>
Метод, соответствующий селектору :add, в качестве результата возвращает значение второго параметра. Пара ключ-значение добавляется к списку entries.
Теперь можно создать экземпляр словаря и внести в словарь несколько элементов:
>(setq d (send dictionary :new)) ; создание словаря
#<object: #4857013a>
>(send d :add ‘winston ‘computer-scientist) ; внесение элементов в словарь
‘computer-scientist
>(send d :add ‘mozart ‘composer) ; внесение еще элементов в словарь
composer
Добавим к классу метод для поиска элементов в словаре (поиск по ключу):
>(send dictionary :answer :find ‘(name &aux entry)
‘((cond ((setq entry (assoc name entries))
(cdr entry))
(t nil))))
#<object: #485742a8>
Поиск в словаре:
>(send d :find ‘mozart)
composer
>(send d :find ‘computer-fun)
nil
Для построения иерархии классов в сообщении :isnew к классу class необходимо указать в качестве 3-го параметра имя суперкласса. Класс наследует все переменные и методы суперкласса. В вершине иерархии классов расположен класс object. Если в некотором методе необходимо обратиться к методу суперкласса, то необходимо вычислить следующее выражение:
(send :sendsuper :селектор-сообщения e1 e2 …),
где e1 e2 … - выражения аргументов.
В документации указано на какие стандартные сообщения отвечают классы object и class. В процессе работы можно добавить новые методы в эти классы.