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

Автор работы: Пользователь скрыл имя, 22 Мая 2015 в 12:15, курсовая работа

Описание работы

Целью своей курсовой работы я поставил узнать: что же такое декларативное программирование, в чём заключается его особенности, какие языки созданы на основе декларативного программирования, и сравнить декларативное программирование с противоположным – императивным программированием.
Логическое программирование – это декларативный стиль программирования, где программист говорит, что он хочет вычислить, но не указывает явно, как это вычислить.

Содержание работы

Введение 3.
Основная часть 5.
2.1 Глава 1. 5.
2.2 Глава 2. 21.
Заключение 24.
Список используемой литературы 26.

Файлы: 1 файл

Курсовая..doc

— 112.00 Кб (Скачать файл)

Содержание.

    1. Введение        3.
    2. Основная часть       5.

2.1 Глава 1.         5.

2.2 Глава 2.                 21.

    1. Заключение                      24.
    2. Список используемой литературы            26.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введение.

По мере преодоления технических проблем построения компьютеров накапливались проблемы, связанные с их использованием. Трудности сместились из области выполнения программ компьютера в область создания программ для компьютера. Начались поиски языков программирования, пригодных для человека. Начиная с языка, воспринимаемого компьютером (машинного языка), стали появляться более удобные формализмы и системы обозначений. И хотя степень абстракции языков возрастала, начиная с языка ассемблера и далее к Фортрану, Алголу, Паскалю и Аде, все они несут печать машины с архитектурой фон Неймана. Характерные особенности программирования на компьютерах фон Неймана приводят к разделению труда: есть люди, которые думают, как решить задачу, и разрабатывают соответствующие методы, а есть люди-кодировщики, которые пишут тексты программ, т.е. выполняют прозаическую и утомительную работу по переводу инструкций разработчиков в команды, воспринимаемые компьютером.

И в логике, и в программировании требуется явное выражение знаний и методов в некотором подходящем формализме. Явная формулировка каких-либо сведений является утомительной работой. Однако формализация в логике часто является интеллектуально благодарной работой, поскольку при этом приходит большее понимание задачи. В отличие от этого формализация задачи и метода решения в виде набора инструкций машины фон Неймана редко приводит к подобному полезному эффекту.

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

Целью своей курсовой работы я поставил узнать: что же такое декларативное программирование, в чём заключается его особенности, какие языки созданы на основе декларативного программирования, и сравнить декларативное программирование с противоположным – императивным программированием.

Логическое программирование – это декларативный стиль программирования, где программист говорит, что он хочет вычислить, но не указывает явно, как это вычислить.

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

 

 

Основная часть.

Глава 1. Что же представляют собой языки логического программирования?

В этой главе я рассмотрел примеры языков, основанных на стиле декларативного программирования и их особенности.

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

 Согласно одной из самых  распространенных классификаций  ЯП, декларативный стиль включает в себя функциональные языки (Рефал и Lisp) и логические (Пролог).Существует также другая классификация, в которой Рефал и Пролог относятся к "сентенциальному стилю программирования" (данный термин предложил русский ученый, создатель языка Рефал - В.Ф.Турчин.

Логическое программирование – это декларативный стиль программирования, где программист говорит, что он хочет вычислить, но не указывает явно, как это вычислить. Задача интерпретатора (или компилятора) – самостоятельно построить требуемые вычисления. Такой подход используется, в частности, в языке программирования Prolog (далее мы будем также использовать слово Пролог) и в СУБД на основе языка запросов SQL. В противоположность декларативному стилю, процедурный стиль программирования означает, что программист явно описывает все шаги вычислений.

Идеалистический взгляд на логическое программирование выглядит следующим образом: Логическая программа понимается как коллекция допустимых свойств (записанных в виде логических формул) об окружающем мире (или, скорее, о мире программы). Пользователь в качестве запроса (query) предоставляет логическую формулу, устанавливающую свойство, которое может или не может иметь место в этом мире. Система самостоятельно устанавливает, является ли запрошенное свойство последовательностью допустимых свойств в программе.

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

Язык Пролог.

Взаимосвязь логического программирования и языка Пролог напоминает взаимосвязь лямбда-исчисления и языка Лисп. Оба этих языка являются конкретной реализацией абстрактных вычислительных моделей. Логические программы, исполняемые с помощью вычислительной модели Пролога, называются программами на чистом Прологе. Чистый Пролог представляет собой приближённую реализацию вычислительной модели логического программирования на последовательной машине. Конечно, данная реализация не является единственно возможной. Она является, однако, одной из наилучших с практической точки зрения – совмещения свойств абстрактного интерпретатора с возможностью эффективного выполнения.

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

Существуют разные языки программирования, использующие различные способы выбора. Грубо говоря, они делятся на два класса. Пролог и его расширения основаны на последовательном выполнении. Другие языки, такие, как Parlog, Параллельный Пролог и GHC, основаны на параллельном выполнении. Последовательные языки отличаются от параллельных методом реализации недетерминизма. Отличие Пролога от его версий состоит в методе выбора редуцируемой цели.

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

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

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

 Сравнение с традиционными языками программирования.

Язык программирования характеризуется присущими ему механизмами управления и обработки данных. Пролог как универсальный язык программирования можно рассматривать и с этих точек зрения.

При успешном выполнении вычисления средства управления программ на языке Пролог подобны средствам управления в обычных процедурных языках. Обращение к некоторой цели соответствует вызову процедуры, порядок целей в теле правила соответствует последовательности операторов. Точнее, правило А = В1 ,В2 ,…,Вn можно рассматривать как определение процедуры:

Procedure A

Call B1

Call B2

.

.

.

Call Bn

End.

Рекурсивный вызов цели в Прологе в последовательности действий и в реализации подобен тому же вызову в обычных рекурсивных языках. Различие возникает при реализации возврата. В обычных языках, если вычисление не может быть продолжено (например, все ветви в операторе case ложны), возникает ошибка выполнения. В Прологе вычисление просто возвращается к последнему выбору и делается попытка продолжить вычисления по новому пути.

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

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

В логическом программировании обработка данных полностью заключена в алгоритме унификации. В унификации реализованы:

• однократное присваивание,

• передача параметров,

• размещение записей,

• доступ к полям записей для одновременных чтения/записи.

Традиционные языки, как правило, содержат различной степени сложности средства обработки ошибочных и исключительных ситуаций. Чистый Пролог не содержит механизма обработки ошибок и исключительных ситуаций, встроенного в описание языка. В отличие от традиционных языков ситуации, приводящие к ошибке (например, отсутствие нужной ветви в операторе case , деление на нуль), в чистом Прологе приводят к “отказу”.

Программирование на чистом Прологе.

Основная цель логического программирования – создать возможность разработки программ на языке высокого уровня. В идеале программист должен записать аксиомы, определяющие требуемые отношения, полностью игнорируя, каким образом эти аксиомы будут использоваться в процессе выполнения. Имеющиеся языки логического программирования, и, в частности Пролог, всё ещё далеки от этого идеала декларативного программирования. Нельзя игнорировать конкретный, четко определённый способ моделирования абстрактного оператора в реализации каждого языка. Эффективное логическое программирование требует знания и использования этого способа.

Порядок правил.

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

Порядок правил определяет порядок поиска решений.

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

Порядок, в котором находятся ответы на вопросы при работе рекурсивной программы, определяется порядком предложений.

Порядок предложений в программах на общепринятом Прологе важнее, чем порядок предложений в программах на чистом Прологе.

Проблема завершения программ.

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

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

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

Информация о работе Логическое программирование