Логическое программирование на Лиспе

Логическое программирование на Лиспе. Лисповские функции, как и написанные на традиционных языках программы, обрабатывают данные в порядке, задаваемом описанием алгоритма, несмотря на то, что эту последовательность можно в Лиспе отобразить весьма гибкими и общими формами.

Такие языки назовм процедурными. В процедурных языках и формализмах программирование сводиться к разработке алгоритма, выполняющего действия.

В логических языках алгоритмы в таком смысле не используются. Если функциональные и операторные языки описывают, каким образом решается некоторая задача, то в логических языках для е решения достаточно точного логического описания. Языки, в которых решение задачи получают из описания структуры и условий задачи, называют декларативными. Чтобы в декларативном языке можно было выполнять разумные вычисления, для него наряду с декларативным смыслом определяется интерпретация в виде действий, или процедурная семантика. При необходимости добиться от Лиспа возможности логического программирования необходимо запрограммировать алгоритм доказательства.

Построим такой алгоритм доказательства. Для этого доказываемый в настоящий момент предикат-теорему назовм целью. Цель можно доказать следующим алгоритмом 1. Найти для доказательства цели первое предложение, значение которого унифицируется с целью. 2. Если предложение с таким заключением не найдено, то доказательство не удалось.

Если предложение найдено и его тело пусто, то цель доказана. Если у предложения не пустое тело, то надо доказать его предикаты в качестве новых целей рекурсивно слева направо. 3. Если алгоритм зашл в тупик, т.е. доказательство не удалось, то надо вернуться backtrack в предыдущее место, где можно выбрать другую цель если такая имеется и продолжить доказательство. Подбор связей переменных основан на методе проб и ошибок и на поиске. Доказываемый в настоящий момент предикат пытаются унифицировать первым возможным способом.

Если решение окажется неверным, т.е. некоторый предикат позже не удастся унифицировать, то происходит возврат к предыдущей унификации, выбирается следующая из ещ имеющихся возможностей, и делается попытка унифицировать оставшиеся предикаты другим способом. Реализовав описанный алгоритм на Лиспе можно добиться возможности логического программирования на этом языке.

Так как возможное в Прологе реляционное и логическое программирование завовывало вс большее количество сторонников, многие Лисп-системы стали оснащаться встроенным интерпретатором Пролога. Основанное на логике программирование с помощью правил в будущем может таким же образом войти в Лисп, как, например, вошло объектно-ориентированное программирование Смолтолка. 4. Заключение. Логическое программирование хорошо подходит для решения проблем, для работы с формальными и естественными языками, для баз данных, запросных и экспертных систем и для других дискретных невычислительных задач.

Пользователя привлекает ясность, содержательность программ и их нетехнический характер. В программе не нужно описывать, каким образом решается задача. Достаточно описания самой задачи и того, что желательно узнать. Однако логическое программирование с использованием лишь хорновских предложений было бы слишком узконаправленным. Поэтому, кроме этого, используются другие методы программирования.

Некоторые задачи по своему характеру процедурные, и программировать их чисто декларативными языками непрактично. Нужны более развитые типы данных. Пролог и логическое программирование непрерывно расширяются, охватывая все новые методы программирования и формы изображения именно в направлении процедурного и объектно-ориентированного программирования, а также в направлении параллельных вычислений.