- •Функциональное и логическое программирование
- •Глава 1. Классификация языков и стилей программирования 3
- •Глава 2. Программирование на языКе лисп 16
- •Глава 3. Программирование на языке пролог 89
- •Глава 1. Классификация языков и стилей программирования
- •Основные парадигмы программирования
- •Процедурное (императивное, директивное) программирование.
- •Объектно-ориентированное программирование.
- •Декларативное программирование
- •Логическое программирование.
- •Функциональное программирование.
- •Классификация языков программирования
- •Функциональные языки
- •Логические языки
- •Глава 2. Программирование на языКе лисп
- •История создания языка Лисп
- •Диалекты языка Лисп
- •Лисп-машины
- •Область применения языка Лисп
- •Особенности языка Лисп Одинаковая форма данных и программ
- •Хранение данных, не зависящее от места
- •Автоматическое и динамическое управление памятью
- •Функциональная направленность
- •Динамическая проверка типов
- •Интерпретирующий и компилирующий режимы работы;
- •Пошаговое программирование
- •Единый системный и прикладной язык программирования
- •Основы языка Лисп
- •Понятие функции.
- •Quote блокирует вычисления
- •Базовые функции языка.
- •Функция car возвращает в качестве значения первый элемент списка.
- •Функция cdr - возвращает в качестве значения хвостовую часть списка, т. Е. Список, получаемый из исходного списка после удаления из него головного элемента:
- •Функция cons включает новый элемент в начало списка:
- •Предикат equal проверяет идентичность записей:
- •Предикат equalp проверяет наиболее общее логическое равенство:
- •Другие простейшие встроенные функции Лиспа. Функция null проверяет, является ли аргумент пустым списком:
- •Комбинации вызовов car и cdr позволяют получить любой элемент списка:
- •Наиболее общая функция, выделяющая n-й элемент списка (при этом индексация начинается с 0):
- •Функция last позволяет выделить последний элемент списка:
- •Функция list - создает список из элементов:
- •Функция setq – невычисляющее присваивание:
- •Функция setf - обобщенная функция присваивания:
- •Функции, обладающие побочным эффектом, называются псевдофункциями.
- •С символом можно связать именованные свойства:
- •Функция get - возвращает значение свойства, связанного с символом:
- •Псевдофункция remprop удаляет свойство и его значение:
- •Вызов интерпретатора eval вычисляет значение выражения.
- •Ввод и вывод.
- •Использование файлов.
- •Определение функций
- •Задание параметров в лямбда-списке.
- •Передача параметров и область их действия.
- •Вычисления в лисПе.
- •Предложение let создает локальную связь внутри формы:
- •Последовательные вычисления.
- •Разветвление вычислений.
- •Циклические вычисления.
- •Передача управления.
- •Другие циклические структуры.
- •Динамическое управление из другого контекста
- •Внутреннее представление списков
- •Функциональное программирование Рекурсия. Различные виды рекурсии.
- •Функции более высокого порядка.
- •Применяющие функционалы.
- •Отображающие функционалы.
- •Макросы
- •Типы данных
- •Основные типы данных:
- •Глава 3. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Глава 3. Программирование на языке пролог
Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
Программирование при помощи конструкций некоторого языка требует мышления в терминах семантики этих конструкций. В соответствии с природой семантики языки программирования можно разбить на три категории:
процедурные языки (конструкции процедурного языка определяют поведение компьютера при выполнении этой конструкции; поведение может быть либо внешним (например, вывод сообщения на терминал), либо внутренним (например, изменение значения переменной);
функциональные языки (смысл конструкции в функциональном языке, например, вызова функции, определяется в терминах значения, которое она вырабатывает; вызов функции можно рассматривать, как объявление вырабатываемого ею значения.);
реляционные языки (смысл конструкции в реляционном языке определяется как отношение между отдельными сущностями или классами сущностей, т.е. реляционная конструкция декларирует, что существует отношение между аргументами, представленное именем этого отношения).
Если имеется логическая спецификация, описывающая структуру системы, которую необходимо смоделировать программным образом, тогда для решения задачи лучше всего подходят реляционные языки, так как семантика их конструкций очень близка к логической спецификации задачи, и поэтому преобразование спецификации в программу на реляционном языке потребует минимума усилий.
Язык Пролог достаточно близок к идеальному реляционному языку, что позволяет программисту воспользоваться упомянутыми выше преимуществами подобных языков, т.е. при использовании языка Пролог взгляд программиста на мир может подняться до уровня логической спецификации.
Само название Пролог есть сокращение, означающее программирование в терминах логики. Идея использовать логику в качестве языка программирования возникла впервые в 70-х годах. Первоначальный вариант Пролога был разработан Алэном Колмероэ в Марсельском университете. Написанный им на Фртране интерпретатор языка Пролог работал крайне медленно. Сегодняшней своей популярности язык Пролог обязан эффективной реализации этого языка, полученной в Эдинбурге Дэвидом Уорреном. Использованный им алгоритм при написании компилятора языка Пролог для ЭВМ DEC-10 получил название «машина Уоррена» и послужил прототипом при создании многих последующих реализаций Пролога. Пролог быстро завоевал популярность в Европе. В США этот язык получил признание несколько позднее в силу нескольких исторических факторов. В США имелся отрицательный опыт использования языка Микропленнер, близкого к логическому, но реализованному неэффективно, в силу чего язык Лисп долгое время не имел серьезных конкурентов в области искусственного интеллекта в исследовательских центрах США. Однако, после того, как в 1981 г. Министерство внешней торговли и промышленности Японии объявило о том, что японский проект создания ЭВМ 5-го поколения будет основываться на методах логического программирования, Пролог стал привлекать внимание специалистов из США. Хотя до сих пор американские специалисты по искусственному интеллекту отдают предпочтение языку Лисп, их выбор обусловлен скорее привычностью Лиспа, чем недостатками языка Пролог. В настоящее время язык Пролог применяется в Европе, США и Японии не только для решения задач искусственного интеллекта (экспертные системы, системы обработки естественного языка), но и многих традиционных прикладных задач (программная инженерия, интерфейсы баз данных, системы помощи в принятии решений). Существуют различные версии языка Пролог: микроПролог, СиПролог для UNIX и т.д.
Кроме Пролога, существуют и другие языки логического программирования, хотя Пролог наиболее известный из них.
В общем смысле, логическое программирование - это один из подходов к информатике, в котором в качестве языка высокого уровня используется логика предикатов первого порядка в форме фраз Хорна.
Логика предикатов первого порядка - это ветвь формальной логики, получившая развитие в основном в нынешнем веке. Это - универсальный абстрактный язык, предназначенный для представления знаний и для решения задач. Его можно рассматривать как общую теорию отношений.
Логическое программирование дает возможность программисту:
описывать ситуацию при помощи формул логики предикатов,
для выполнения выводов из этих формул, применить автоматический решатель задач, основанный обычно на правиле вывода путем резолюции, предложенном Робинсоном.
При использовании языка логического программирования основное внимание уделяется описанию структуры прикладной задачи, а не выработке предписаний компьютеру о том, что ему следует делать.
Сущность Пролога состоит в программировании в терминах целей: вместо того, чтобы во всех деталях описывать способ решения задачи, дается определение ситуации и формулируются цели. Таким образом, Пролог основан на описательной (декларативной) точке зрения на программирование.
