
- •(Конспект лекций)
- •Список сокращений
- •Введение
- •Лекция 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
- •Вопросы для самоконтроля
- •Вопросы на самостоятельную проработку
- •Литература
Функции с функциональным результатом вычислений и частичные вычисления
Замыкание можно трактовать как функцию, вычисление которой выполнено частично, окончательное вычисление функции отложено на момент ее вызова.
Пример
(defun remainder_x (x) (function (lambda (y) (rem y x))))
Функция rem вычисляет остаток от деления y на x. Функция remainder_x возвращает в качестве результата функцию, которая настроена на вычисление остатка от деления параметра на заданное число.
Пример
(funcall (remainder_x 2) 3) –> 1
(eval (list (remainder_x 2) 3)) -> 1
(setq rem_5 (remainder_x 5)) -> (LEXICAL_CLOSURE…)
;; переменная rem_5 связана с замыканием
(setq y 6) –> 6
(funcall rem_5 y) -> 1
Функциональные абстракции
Функциональные абстракции реализуются на основе:
определения функционалов с функциональными аргументами,
параметризованных функций, возвращающих функциональное значение.
Абстракции на основе функционалов. Сходные по структуре программы функции заменяются функционалом. Параметр определяет требуемый тип обработки.
Пример
(defun copy_list (x) ;; копирование списка
(if (null x) x
(cons (car x) (copy_list (cdr x)))) )
(defun append (x y) ;; объединение списков
(if (null x) y
(cons (car x) (append (cdr x) y))) )
(defun sort_app (x y) ;; объединение сортированных списков
(if (null x) y
(insert (car x) (sort_app (cdr x) y))) )
В представленных выше функциях выделяется общая часть – форма if и отличия, - вызов cons или insert. Определим функционал следующим образом:
(defun abst_fun (x y fn) ;; абстрактный функционал
(if (null x) y
(funcall fn (car x) (abst_fun (cdr x) y fn))) )
Применение функционала:
(setq lst1 ‘(d e k)) -> (d e k)
(abst_fun lst1 ‘(a b c) ‘insert) -> (a b c d e k)
(abst_fun ‘(4 10 6) nil ‘cons) -> (4 10 6)
Во втором случае применения abst_fun происходит простое копирование списка, поскольку 2-й аргумент nil.
Параметризованные функции. Применяются либо функции либо функционалы, возвращающие в качестве результата их применения функции или функционалы.
Пример
Функция comptn возвращает в качестве результата ее аппликации композицию функций:
(defun comptn (f g)
#’(lambda (x)
(funcall f (funcall g x)))
) -> comptn
(setq ff ‘comptn) -> comptn
Применим функцию comptn в выражении для вычислений:
(funcall (comptn ‘add_1 ‘reverse) ‘(1 2 3)) -> (4 3 2),
или (funcall (funcall ff ‘add_1 ‘reverse) ‘(1 2 3)) -> (4 3 2),
где add_1 и reverse, соответственно, увеличивает числовые значения списка на 1 и обращает список.
Автофункции
Класс автофункций объединяет автоаппликативные и автореппликативные функции. Автоаппликативные функции представляют собой функционал, выполняющий аппликацию себя к собственной копии в качестве аргумента. Автореппликативные функции возвращают собственную копию в качестве результата собственной аппликации.
Автоаппликативные функции
Автоаппликативные функции находят применение в функциональном программировании.
Пример
(defun rev (lst) (reverse ‘reverse lst nil))
(defun reverse (fn lst rez)
(if (null lst) rez
(funcall fn fn (cdr lst) (cons (car lst) rez))))
Функция reverse использует себя (а вернее свою исполняемую копию) в качестве аргумента. Выполняется обращение поверхностной копии списка.
Автореппликативные функции
Автореппликативные функции рассматриваются только теоретически (как представления неопределенных значений).
Процедурное программирование
В процессе разработки и совершенствования языка Лисп в него были включены элементы процедурного программирования. Это было связано с необходимостью дать возможность работать с языком тем пользователям, которые имели опыт работы с процедурными языками, но не имели возможности ознакомиться с функциональным подходом к разработке приложений и решению задач. К процедурным понятиям относятся все те элементы, которые непосредственно воздействуют на контекст вычислений, такие как – операторы присваиваний и циклов, ввода и вывода, связи с операционной системой и пр. Кроме того, процедурные элементы это единственная возможность воздействия на контекст вычислений такой как файлы, в том числе библиотечные, БД-х, запоминания состояния рабочего пространства и т.п.