
- •(Конспект лекций)
- •Список сокращений
- •Введение
- •Лекция 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
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Литература
Управление формированием вывода Отсечение
Турбо-Пролог в случае, когда есть больше одного факта или правила для текущей цели, отмечает текущее состояние построения вывода точкой решения, чтобы можно было впоследствии вернуться и продолжить поиск других вариантов формирования вывода. Отсечение ! (cut) является встроенным предикатом. Его действие заключается в том, что для всех целей между головой правила и предикатом ! точка решения не сохраняется.
Пример
Рассмотрим пример общего вида.
primer:- a, b, c, !, d, e, f.
primer.
В данном примере предикаты primer, a, b, c, d, e, f – предикаты с переменными.
Если b согласовано по ходу построения вывода, а c нет, то возможен возврат к другому варианту выбора решений для a, b или primer. Но как только с согласовано, и, таким образом, был согласован и предикат !, то дальнейший возврат к выбору других вариантов решений для c, b, a или primer невозможен. Если цель d не может быть согласована в дальнейшем, то вся задача заканчивается отказом. (not).
Пример
Определение целой части от деления некоторого числа из последовательности 0, 1, 2, … на заданное число. Результатом должно быть наименьшее целое большее, чем некоторое заданное пороговое значение. Оба числа,- делитель и верхняя граница указываются в диалоге.
domains
num = integer
predicates
razdelit(num, num,num)
celoje(num)
clauses
celoje(0). /* генерация чисел */
celoje(X):- celoje(Y), X = Y + 1.
razdelit(_, 0, _):- !, write(“нельзя делить на 0!”), exit.
razdelit(N1, N2, Rez):- celoje(Rez), Prod = (Rez + 1)*N2, Prod > N1,
Prod2 = Rez * N2, Prod2 <= N1, !.
goal
write(“Введите делитель:”), readint(Mod), nl,
write(“Введите верхнюю границу:”), readint(Gr), nl
celoje(N), /* формирование последовательности */
razdelit(N, Mod, X),
X > Gr, write(“ответ:”, X).
Если бы отсечение не располагалось в конце определения предиката razdelit, то в случае ложности условия X > Gr произошел бы возврат к цели celoje(Rez) в определении, что повлекло бы зацикливание программы. Отсечка обеспечивает возврат к цели celoje(N) в конъюнктивном вопросе и генерацию следующего целого из последовательности чисел.
«Зеленые» и «Красные» отсечения
Аккуратное, правильное использование отсечений повышает эффективность программ без нарушения их ясности и изменения смысла. Различать «красные» и «зеленые» отсечения предложил ван Эмден (van Emden M. Red and green cuts. “Logic Programming Newsletter. N2, 1982”). Отсечения, влияющие на декларативный смысл пронраммы, называются «красными», а не влияющие – «зелеными».
Примеры
p:- a, b, c.
p:- d, e.
Декларативный смысл этой программы p (a & b & c) v (d & e). Если правила поменять местами, то смысл программы не изменится.
p:- a, b, !, c.
p:- d, e.
Декларативный смысл этой программы p (a & b & c) v (Øa & d & e) v (a & Øb & d & e) v (Øa & Øb & d & e). Если правила поменять местами, то программа будет иметь другой декларативный смысл: p (d & e) v (a & b & c). Т.о., при использовании отсечений в ряде случаев смысл программы изменяется.
«Зеленые» отсечения. Размещение или удаление отсечения не влияет на смысл программы. Основное назначение – удаление ненужных ветвей вывода, а это означает сокращение времени выполнения программы (сокращается и объем программы, поскольку во время выполнения точки решений не создаются).
Пример
Вычисления минимума.
predicates
minim(real, real, real)
clauses
minim(X, Y, X):- X <= Y, !.
minim(X, Y, Y):- X > Y, !.
Ясно, что если выполняется X <= Y, то альтернативная проверка не X > Y требуется. Значит точка возврата не нужна и можно применить отсечение.
Пример
Слияние упорядоченных списков целых чисел Xs и Ys, и получениеупорядоченного списка Zs: merge(Xs, Ys, Zs).
damains
lst = integer*
predicates
merge(lst, lst, lst)
clauses
merge([], Ys, Ys):- !.
merge(Xs, [], Xs):- !.
merge([X | Xs], [Y | Ys], [X | Zs]):- X < Y, !, merge(Xs, [Y | Ys], Zs).
merge([X | Xs], [Y | Ys], [X | Zs]):- X = Y, !, merge(Xs, Ys, Zs).
merge([X | Xs], [Y | Ys], [X | Zs]):- X > Y, !, merge([X | Xs], Ys, Zs).
Программа будет правильной и без отсечений.
«Красные» отсечения. Удаление отсечения изменяет декларативный смысл программы, т.е. множество выводимых целей.
Пример
predicates
minim(real, real, real)
clauses
minim(X, Y, Z):- X <= Y, !, Z = X.
minim(X, Y, Y).
Если удалить отсечение, то выполнима будет цель minim(2, 5, 5). Если отсечение присутствует, то эта цель не выполнима, т.к. отсечение отменяет точку возврата для minim и альтернатива не рассматривается.
Обычное применение «красных» отсечений – удаление явных условий, как в вышеприведенном примере. Условие X > Y не требуется.
Пример
Удаление всех вхождений элемента X в список Xs: delete(X, Xs, Ys). Результат в Ys.
domains
sm = symbol
lst = sm*
predicates
delete(sm, lst, lst)
clauses
delete(X, [], []).
delete(X, [X | Ys], Zs):- !, delete(X, Ys, Zs).
delete(X, [Y | Ys], [Y | Zs]):- delete(X, Ys, Zs).
Удаление отсечения дает возможность для реализации, напрмер, следующего целевого утверждения: delete(1, [2, 1], [2, 1]), и других утверждений подобного типа, т.е. приведет к получению некорректной программы.