Автор работы: Пользователь скрыл имя, 11 Января 2011 в 14:09, курсовая работа
Почти все современные компьютеры основаны на ранних, разработанных в 40-х годах идеях фон Неймана и его коллег. Машина фон Неймана содержит большую память и процессор, снабженный локальной памятью, ячейки которой называются регистрами. Процессор может загружать данные из памяти в регистры, выполнять арифметические и логические операции над содержимым регистров и отсылать значения регистров в память. Программа машины фон Неймана представляет собой последовательность команд выполнения перечисленных операций вместе с дополнительным множеством команд управления, влияющих на выбор очередной команды.
Введение 3
Глава 1. Что же представляют собой языки логического программирования? 6
1.1. Чистый Полог. 6
1.2. Сравнение с традиционными языками программирования. 8
1.3 Программирование на чистом Прологе. 9
1.3.1. Порядок правил. 10
1.3.2. Проблема завершения программ. 11
1.3.3. Порядок целей. 11
1.3.4. Избыточные решения. 12
1.4.Практические рекомендации. 13
1.4.1 Эффективность программ на Прологе. 13
1.4.2. Разработка программ. 15
1.5. Другие языки логического программирования. 18
1.5.1 Язык логического программирования KL0. 18
1.5.2 Типы данных KL0. 19
1.5.3. Язык программирования ShapeUp. 20
Глава 2. Lisp – язык функционального программирования. 21
2.1. Лисп в истории программирования. 22
2.2. Логическое программирование на Лиспе. 23
Заключение. 25
Список литературы 26
Основная
цель логического программирования
– создать возможность
Два синтаксических понятия, несущественные в логических программах, важны при создании программ на Прологе. В каждой процедуре должен быть принят порядок правил, или порядок предложений. Кроме того, в теле каждого предложения должен быть определён порядок целей. Последствия этих решений могут оказаться колоссальными: эффективность программирования на Прологе может измениться в десятки раз. В крайних и тем не менее распространённых случаях корректные логические программы вообще не приведут к решению вследствие не завершающегося вычисления.
Порядок правил определяет порядок поиска решений.
Изменение порядка правил в процедуре приводит к перестановке ветвей в любом дереве поиска цели, использующей данную процедуру. Обход дерева поиска происходит в глубину. Поэтому перестановка ветвей дерева изменяет порядок обхода дерева и порядок нахождения решений. Этот эффект очевиден при использовании фактов для нахождения ответов на экзистенциальный вопрос.
Порядок, в котором находятся ответы на вопросы при работе рекурсивной программы, определяется порядком предложений.
Порядок
предложений в программах на общепринятом
Прологе важнее, чем порядок предложений
в программах на чистом Прологе.
Используемый в Прологе принцип обхода дерева в глубину приводит к серьёзным проблемам. Если дерево поиска цели относительно некоторой программы содержит бесконечную ветвь, то вычисление не завершится. Пролог может не найти решение цели, даже если существует конечное вычисление, решающее вопрос.
Бесконечные вычисления появляются при использовании рекурсивных правил. Рекурсивные правила, в которых рекурсивная цель является первой целью в теле правила, называются левыми рекурсивными правилами. Левые рекурсивные правила в Прологе приносят немало хлопот. В случае несоответствующих аргументов использование этих правил приводит к бесконечным вычислениям.
Лучшее решение этой проблемы – отказаться от использования левой рекурсии. В общем случае невозможно избавиться от всех появлений левой рекурсии. Однако соответствующий анализ позволяет определить вопросы, решение которых относительно рекурсивных программ приводит к результату. Другой, не всегда замечаемый случай, который заведомо приводит к не завершающимся вычислениям – это порочный круг. Ввиду порочного круга дерево поиска обязательно содержит бесконечную ветвь.
Порядок целей более существен, чем порядок предложений. Порядок целей имеет решающее значение при определении последовательности действий в программе на Прологе.
Причина, по которой порядок целей в предложении влияет на порядок решений, отличается от причины, по которой порядок правил в процедуре влияет на порядок решений. Изменение порядка правил не изменяет дерево поиска, которое используется при решении данной цели. Просто обход дерева производится в ином порядке. Изменение порядка целей приводит к изменению дерева поиска.
Порядок целей определяет дерево поиска. По этой причине порядок целей влияет на количество проверок, выполняемых программой при решении.
Существенен не порядок правил, а порядок целей. Программа будет завершающейся, если первый аргумент цели – полный список. Цели, у которых первый аргумент – неполный список приводят к бесконечным вычислениям.
При построении программ на Прологе следует обратить внимание на важную характеристику программы, не имеющую аналогов в логическом программировании, - отсутствие избыточных решений. Значением логической программы является множество выводимых из программы основных целей. Здесь не существенно, выводится ли цель единственным образом или существует несколько различных выводов; однако это существенно в Прологе, поскольку от этого зависит эффективность поиска решений. Каждый возможный вывод означает дополнительную ветвь в дереве поиска, чем больше дерево поиска, тем дольше продолжается вычисление. В общем случае желательно сохранить размер дерева поиска по возможности минимальным.
Наличие избыточных решений из-за возвратов может вызвать в предельном случае экспоненциальный рост времени работы программы. При решении конъюнкции n целей, каждая из которых имеет одно избыточное решение, в случае возвратов может быть порождено 2n решений, что приводит к изменению оценки времени работы программы от полиноминальной (или даже линейной) к экспоненциальной.
Одна из причин появления избыточных решений в программах на Прологе состоит в наличии различных правил, пригодных для одного и того же случая.
Другая причина, приводящая к избыточным решениям, состоит в рассмотрении слишком большого числа специальных случаев. Иногда подобное рассмотрение мотивируется стремлением к эффективности.
Для исключения избыточных решений можно добавить дополнительный факт, что позволит сократить рекурсивные вычисления, когда существует аргумент – пустой список. Каждое предложение должно применяться лишь к спискам с ненулевым вторым аргументом.
При практическом программировании следует заботиться об эффективности программ, учитывать ограничения, связанные с конкретной реализацией, используемой системой программирования и другими факторами.
Технология программирования для логических языков имеет тот же смысл, что и для процедурных языков. Методология разработки и сопровождения больших программных комплексов для Пролога так же необходима, как и для любого другого языка программирования. Не меньшую важность представляет хороший стиль программирования.
В практическом программировании на Прологе необходимо обращать внимание на эффективность программ. Установим критерии оценки программ. Основной оцениваемый параметр – число выполняемых унификаций и число попыток унификации в процессе вычисления. Этот параметр связан со временем работы программы. Ещё один параметр – глубина вложенной рекурсии. Если в процессе вычислений глубина станет больше максимально допустимой, то вычисления прервутся. На практике эта проблема является основной. Третий параметр – число порождённых структур данных. Рассмотрим последовательно эти параметры.
Можно предположить, что при разумной записи детерминированного последовательного алгоритма в виде программы на Прологе ожидаемая эффективность алгоритма сохранится. Обычно результирующие программы на Прологе не основываются на унификациях общего вида или глубоких возвратах.
Сложности могут возникнуть при реализации алгоритмов, связанных с существенной перестройкой структур данных, например используя деревья, при этом затраты будут возрастать логарифмически. Однако во многих случаях более естественно было бы модифицировать сам алгоритм, приспосабливая его к принципу однократного присваивания, присущему логическим переменным.
Для указанных алгоритмов применимы обычные методы анализа сложности вычислений. Если не используется полная унификация, то можно показать, что время выполнения редукции цели с помощью предложения программы ограничено константой. Величина константы зависит от программы. Поэтому число выполняемых в программе редукций, как функция от размера её входа, является хорошей оценкой временной сложности программы.
При программировании на Прологе средства, представляемые языком, могут использоваться полностью. Можно писать недетерминированные программы и программы, использующие полную унификацию. Анализ сложности таких программ представляет собой трудную задачу и требует оценки затрат на просмотр при поиске и размера унифицируемых термов.
Один из основных способов повышения эффективности программ – совершенствование алгоритма. Хотя речь идёт о декларативном языке, понятие алгоритма в Прологе остаётся тем же, что и в других языках программирования.
Помимо выбора наиболее удачного алгоритма можно использовать ещё несколько способов для увеличения эффективности программ на Прологе. Один из них состоит в выборе наилучшей реализации. Эффективная реализация характеризуется исходной скоростью, возможностью индексирования, применением оптимизации остатка рекурсии и методом сборки мусора. Единицей измерения скорости выполнения программы на языке логического программирования обычно служит LIPS – число логических выводов в секунду. При вычислениях логический вывод соответствует редукции.
Программирование на Прологе настолько близко к записи спецификаций, насколько это доступно для практического языка программирования. Поэтому кому-нибудь может показаться, что в программах на чистом Прологе не бывает ошибок. Но это не так. Уже процесс аксиоматизации понятий и алгоритмов может привести к широкому спектру ошибок, совершенно аналогичных ошибкам в обычных языках программирования.
Другими словами, при любом формализме найдётся достаточно много сложных задач, для которых нет правильных записей решения. Таким образом, грань между языками низкого и высокого уровня определяется лишь тем, достаточно или нет простой проверки для правильности программы.
Существуют
два подхода к анализу
В случае Пролога можно предложить использовать в качестве языка записи спецификации полный язык логики первого порядка. Очень редко бывает такое, что спецификации на полном языке логики первого порядка короче, проще или понятнее простейшей программы на Прологе, определяющей то же отношение.
В подобной ситуации имеются менее радикальные решения. Одно из них состоит в доказательстве того, что одна программа на Прологе, возможно более эффективная, хотя и более сложная, эквивалентна более простой программе на Прологе, которая, уступая в эффективности, может служить спецификацией первой. Другое решение состоит в доказательстве того, что программа удовлетворяет некоторому ограничению типа “инвариант цикла”, которое хотя и не гарантирует корректность программы, однако повышает уверенность в её правильности.
В некотором смысле программы на Прологе являются выполняемыми спецификациями. Вместо того чтобы разглядывать программы, пытаясь убедиться в их правильности, программы можно запустить и проверить, работают ли они так, как нам хотелось. Существуют обычные приёмы тестирования и отладки, применяемые при разработке программ во всех прочих языках программирования. Все классические приёмы и подходы, используемые при тестировании и отладке программ, в равной степени применимы и на Прологе.
Один из ответов на вопрос в чём разница в разработке программ на Прологе и на обычных языках программирования состоит в том, что, хотя, программирование на Прологе – это “просто” программирование, в случае Пролога имеется преимущество в простоте записи и скорости отладки по сравнению с формализмами более низкого уровня.
Другой ответ состоит в том, что декларативное программирование проясняет мышление. Другими словами, вообще программирование некоторых понятий, а программирование на декларативном языке и языке высокого уровня в особенности, позволяет уточнить соответствующие концепции и идеи. Для опытных программистов Пролог – это не просто формализм для “кодирования” машинных команд, но формализм, позволяющий записывать и реализовывать идеи, т.е. инструмент мышления.