
- •(Конспект лекций)
- •Список сокращений
- •Введение
- •Лекция 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
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Литература
Представление знаний на основе продукций
С помощью продукционного программирования можно решать различные задачи связанные с принятием решений, управлением, упрощением, анализом, доказательством. Преимущество метода заключается в том, что продукции в виде набора шаблонов, грамматических правил, множества аксиом или других подобных форм, близких к проблематике решаемой задачи, можно записывать в виде, независимом от программы. Обычно продукции лучше всего применимы для представления простых ассоциаций вида «наблюдение-действие».
Представление продукций
Под продукцией или правилом понимается объект, состоящий из 2-х частей, - условия и следствия: «ЕСЛИ условие ТО следствие».
Интерпретатор продукций (машина вывода) применяет продукции к базе данных, где хранятся факты и строит доказательства для сформулированных гипотез. Для представления условий в продукциях обычно используются образцы, аналогичные тем, которые были рассмотрены в предыдущей лекции. Следствия также представлены образцами. Факты представляют собой некоторые образы и обычно имеют вид списков:
((животное имеет шерсть)
(животное полосатое)
(животное жвачное)).
Гипотеза обычно имеет вид списка, включающего переменные, заменяемые некоторыми значениями в процессе построения вывода. В дальнейшем рассмотрении будем рассматривать простые списковые образцы в правилах, - без переменных, предикатов и заменителей отдельных элементов или сегментов. (Прим. В используемых на практике Лисп-системах символы кодируются буквами латинского алфавита).
Правила необходимо рассматривать с 2-х точек зрения: (1) с точки зрения их определения в программе и удобства анализа и (2) с точки зрения их представления в форме удобной для вычислений (использования машиной вывода). Например, следующая форма достаточно удобна для размещения правил в программе:
(setq rule12 ;; переменная rule12 имеет в качестве значения одну из продукций
¢(if животное жвачное
and животное полосатое
then животное зебра))
Эта форма неудобна для работы машины вывода. Ее преобразуют в такую форму, чтобы условия и следствие были представлены списками, подобно представлению фактов. Так, каждое правило можно представить тройкой, которая будет включать имя правила, список, представляющий условие, и список, представляющий заключение. Для реализации этого, например, в Common Lisp’е можно воспользоваться механизмом структур. Объявление структурного типа выглядит следующим образом:
(defstruct имя-типа
имя-поля1 имя-поля2 …………имя-поляN).
Собственно структурные данные создаются конструктором следующего вида:
(make-имя-типа выражения инициализации полей структуры).
Когда определяется структурный тип данных автоматически создаются:
предикат проверки структурного типа в виде (имя-типа объект-данных),
функции для доступа к полям структурного объекта данных - (имя-типа-имя-поля объект-данных).
Т.о., имеем следующий вариант объявления структур для представления правил и пример выражения создания некоторого правила:
(defstruct rule name cond concl),
где rule – структурный тип данных, name – поле для имени правила, cond – поле для условия (посылки), concl – поле для размещения заключения.
(make-rule :name ¢rule12
:cond ¢((животное жвачное) (животное полосатое))
:concl ¢((животное зебра))
).
Пусть, теперь, в программе имеется следующий набор переменных, которым сопоставлены в качестве значений правила: rule1, rule2,…, rule10,… . Объединим все имена переменных в список, следующим образом:
(setq knowledgebase ¢(rule1 rule2…rule10…))
Исходные правила из формы удобной для анализа преобразуются к структурному виду функцией analyse:
(setq rules (analyse knowledgebase),
которая берет список имен правил, преобразует правила к структурному виду и объединяет их в список.
(defun analyse (rules)
(mapcar ¢do_rule rules))
Преобразование отдельного правила выполняет функция do_rule:
(defun do_rule (oldform)
(prog (rule)
(setq rule (eval oldform) ;; oldform – имя переменной (имя правила)
(return (make-rule
:name oldform
:cond (conditions rule)
:concl (conclusion rule))
))
)
Формирование списков, представляющих условие и следствие, соответственно, выполняют функции conditions и conclusion:
(defun conditions (sent)
(term (cdr sent) nil nil)) ;; атом if пропускается
(defun conclusion (sent)
(term (cdr (member ¢then sent)) nil nil)) ;; все начальные символы
;; включая then пропускаются
Функция member выделяет подсписок из исходного списка, начинающийся атомом, который указывается 2-м параметром. Следующая функция (term) выделяет отдельные предложения из условия и следствия и объединяет их в список.
(defun term (sent part rez) ;; sent-исх.список, part-частично сформир-й список,
(cond ;; rez список списков (результат)
((null sent) ;; весь список обработан
(append rez (list part)))
((eq (car sent) ;; завершена обработка условия
(append rez (list part)))
((eq (car sent) ¢and) ;; завершена обработка части условия до симв. and
(term (cdr sent) nil (append rez (list part))))
(t ;; продолжение обработки исходного списка
(term (cdr sent) (append part (list (car sent))) rez))
))