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

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

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

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

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

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

Файлы: 1 файл

Курсовая..doc

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

Язык программирования ShapeUp.

ShapeUp - ещё один язык логического  программирования, в основу которого  положен Пролог, расширенный средствами  сопоставления строк.

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

Прологу присущи недетерминированность и сопоставление с образцом. Эти свойства очень полезны для разработки систем обработки информационных знаний. К таким системам можно отнести системы понимания естественного языка и другие системы интеллектуальной обработки текстов. Для подобных приложений очень важна операция сопоставления строк. Однако механизм сопоставления с образцом в таком виде, как он существует в Прологе, недостаточен для сопоставления строк. Причина заключена в “терм-терм” механизме сопоставления. ShapeUp – попытка разработать более практический, свободный от присущего Прологу недостатка инструмент программирования. Характерной чертой ShapeUp, отличающей его от традиционных Пролог-систем, является выполняемая при унификации функция сопоставления строк. В ShapeUp включено несколько операторов сопоставления строк. Язык позволяет конструировать образцы строк, представляемые как термы Пролога. Образцы могут унифицироваться с различными строковыми объектами: расширена унификация для выполнения сопоставления строк. В результате ShapeUp-программы проще и имеют более прозрачную семантику, их легче писать.

Список языков логического программирования можно продолжать ещё долго. Кроме перечисленных выше, к языкам логического программирования относятся также: Дейталог, LogLisp и множество других. Но хотелось бы ещё остановиться на таком языке, как Лисп (от англ. Lisp – list processing – обработка списков).

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

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

В этой главе мы рассмотрели языки программирования: ShapeUp,  KL0 и Пролог. Также мы рассмотрели и другие языки логического программирования и императивное программирование, порядок правил, целей и эффективность программ на Прологе.

 

 

 

 

 

Глава 2. Сравнение Декларативного программирования и Императивного программирования.

Итак, две противоположности:

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

Декларативное программирование. Описывает процесс, каково нечто, а не как его создать. Порядок выполнения и способ достижения не важен.

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

 

Базовой операцией при декларативном подходе является операция над множеством или над всеми элементами множества. Причем для последнего случая порядок обработки не важен, так как обрабатывающая функция должна быть чистой. В C#, PHP, Java, Javascript множество реализуется как массив или последовательность, генерируемая итератором. Ниже пример сравнения двух подходов на C#

Императивный подход 

// основной код

int F(int x) { return x*x; }

int sum = 0;

for (int i=0; i<arg.Length; i++)

{

  if (arg[i] > 10) sum += F(arg[i]);}

Декларативный подход.

// основной код

int F(int x) { return x*x; }

 

int sum = arg.Where(x => x > 10).Sum(F);

// код функций над множествами (входит в стандартную библиотеку)

...

IEnumerable<F> Where(this IEnumerable<F> sequence, Func<F, bool> filter)

{

  foreach (F x in sequence) { if (filter(x)) { yield return x; } }

}

int Sum(this IEnumerable<int> sequence, Func<int, bool> func)

{

  int sum = 0;

  foreach (int x in sequence) { sum += func(x); }

  return sum;

}

 

Теперь сравним два решения

    • Связность. В императивном, бизнес-логика перемешана с реализацией. В декларативном, реализация суммирования и фильтрации вынесена в отдельные методы, а в основном коде осталась только бизнес-логика. Это имеет ряд преимуществ
    • Интерпретация. Здесь простой пример, но можно без труда придумать более сложные случаи получения и обработки данных, когда понять код за долю секунды не так просто.
    • Модификация. Чтобы добавить в императивном условие отбора, потребуется перестроить структуру уже существующего кода. В декларативном же надо только добавить очередной вызов метода Where(). Например, int sum = arg.Where(x => x > 10).Where(x => x % 2 == 0).Sum(F);
    • Тестирование. В декларативной функции суммирования и фильтрации легко тестируются отдельно, в императивной это невозможно.
    • Оптимизация. Если мы вдруг заходим использовать многоядерные процессоров, то справа надо будет всего лишь переписать методы Sum, Where и не трогать бизнес-логику.
    • Повторное использование кода. Функции над множествами можно легко использовать повторно для других последовательностей, а если учесть, что многие из них написаны для generic, то и для последовательностей произвольного типа.
    • Производительность. Может показаться, что кажущаяся избыточность кода приводит к потере производительности. Это только кажется, так как накладные расходы при организации итераторов сравнимы с использованием рекурсии (на сохранение локальных переменных в стеке). А это очень мало.

 

 

 

 

 

 

 

Заключение.

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

 

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

 

Декларативное программирование (от англ. Declarative programming).

Согласно первому определению, программа «декларативна», если она описывает каково нечто, а не как его создать. Например, веб-страницы на HTML декларативны, так как они описывают, что должна содержать страница, а не как отображать страницу на экране. Этот подход отличается от языков императивного программирования, требующих от программиста указывать алгоритм для исполнения.

 

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

 

Декларативные языки программирования:

Языки логического программирования (Logic programming): Пролог (Prolog), ShapeUp, KL0.

Функциональные языки программирования‎ (Functional programming): LISP, Haskell‎

SQL - на SQL программист описывает  только то, какие данные нужно  извлечь или модифицировать. То, каким образом это сделать, решает СУБД непосредственно при обработке SQL-запроса.

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

 

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

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

 

 

 

 

Список литературы.

1. И. Братко «Программирование на  языке Пролог для искусственного  интеллекта». М: Мир 1990г.

2. «Язык Пролог в пятом поколении  ЭВМ». Сборник статей под редакцией  Ильинского. М: Мир 1988г.

3. Клоксин, Меллиш «Программирование на языке Пролог». М: Мир 1987г.

4. Дж. Стобо «Язык программирования  Пролог». М: Радио и связь 1993г.

5. Э. Хювёнен, Й. Сеппянен «Мир Лиспа»  в 2-х томах. М: Мир 1990г.

6. Хоггер «Введение в логическое  программирование». М: Мир 1988г.

7. Л. Стерлинг, Э. Шапиро «Искусство программирования на языке Пролог». М: Мир 1990г.

 

 


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