Логическое программирование. 2
Содержание
Введение.
Почти все
современные компьютеры
По мере преодоления технических проблем построения компьютеров накапливались проблемы, связанные с их использованием. Трудности сместились из области выполнения программ компьютера в область создания программ для компьютера. Начались поиски языков программирования, пригодных для человека. Начиная с языка, воспринимаемого компьютером (машинного языка), стали появляться более удобные формализмы и системы обозначений. И хотя степень абстракции языков возрастала, начиная с языка ассемблера и далее к Фортрану, Алголу, Паскалю и Аде, все они несут печать машины с архитектурой фон Неймана. Характерные особенности программирования на компьютерах фон Неймана приводят к разделению труда: есть люди, которые думают, как решить задачу, и разрабатывают соответствующие методы, а есть люди-кодировщики, которые пишут тексты программ, т.е. выполняют прозаическую и утомительную работу по переводу инструкций разработчиков в команды, воспринимаемые компьютером.
И в логике, и в программировании требуется явное выражение знаний и методов в некотором подходящем формализме. Явная формулировка каких-либо сведений является утомительной работой. Однако формализация в логике часто является интеллектуально благодарной работой, поскольку при этом приходит большее понимание задачи. В отличие от этого формализация задачи и метода решения в виде набора инструкций машины фон Неймана редко приводит к подобному полезному эффекту.
Истоки логики
связаны с исследованием
Основание
символьной логики были
Компьютерам
ещё далеко до достижения цели
– стать равным партнёром
Конечно, логика давно используется и при проектировании компьютеров, и при анализе компьютерных программ. Однако непосредственное использование логики в качестве языка программирования, называемого логическим программированием, возникло сравнительно недавно.
Логическое программирование, так же как и родственное ему направление – функциональное программирование, радикально отклоняется от основного пути развития языков программирования. Логическое программирование строится не с помощью некоторой последовательности абстракций и преобразований, отталкивающейся от машинной архитектуры фон Неймана и присущего ей набора операций, а на основе абстрактной модели, которая никак не связана с каким-то типом машинной модели. Логическое программирование базируется на убеждении, что не человека следует обучать мышлению в терминах операций компьютера (на некотором историческом этапе определённые учёные и инженеры считали подобный путь простым и эффективным), а компьютер должен выполнять инструкции, свойственные человеку. В своём предельном и чистом виде логическое программирование предполагает, что сами инструкции даже не задаются, а вместо этого явно, в виде логических аксиом, формулируются сведения о задаче и предположения, достаточные для её решения. Такое множество аксиом является альтернативой обычной программе. Подобная программа может выполняться при постановке задачи, формализованной в виде логического утверждения, подлежащего доказательству. Такое утверждение называется целевым утверждением. Выполнение программы состоит в попытке решить задачу, т.е. доказать целевое утверждение, используя предположения, заданные в логической программе.
Создание
логического программирования
А, если В1 и В2 и … и Вn
может рассматриваться и выполняться в качестве рекурсивного языка программирования.
Логическое
программирование возникло
Успехи в технологии реализации также в значительной мере способствовали представлению логики как практической формальной системы программирования. Первый экспериментальный интерпретатор был реализован Русселом и Колмероэ и другими в университете Экс – Марсель в 1972 году. Ему было дано имя Пролог ("программирование на языке логики” – PROgramming in LOGic), и он оказал сильное влияние на разработку последующих систем.
Термины "логическое программирование” и "программирование на языке Пролог” часто употребляются как равнозначные, однако подразумеваемая стратегия управления в Прологе отнюдь не является единственной стратегией, имеющейся для исполнения логических программ.
Возникновение Пролога покрыто тайной. Известно только то, что два создателя языка – Роберт Ковальский, в то время работавший в Эдинбурге, и Алан Колмероэ из Марселя – разрабатывали в начале 70-х сходные идеи и даже работали вместе в течение одного лета. В результате были сформулированы основные положения логического программирования и вычислительная модель, описан и реализован первый язык логического программирования – Пролог.
Возникали версии языка Пролог, содержащие дополнительные средства управления, например IC-Пролог, однако было показано, что их нельзя рассматривать в качестве альтернативы Прологу. Другую ветвь языков логического программирования составляют параллельные логические языки программирования. Сначала появился Реляционный Пролог, далее последовали: Параллельный Пролог и несколько других версий.
Несмотря на обилие теоретических работ и волнующих идей, концепция логического программирования казалась нереалистичной. В этот период в результате исследования, проведённого в США, были обнаружены серьёзные недостатки "языков искусственного интеллекта следующего поколения”. Основные претензии к таким языкам программирования заключались в следующем: они были неэффективны и очень трудны в реализации.
В такой
атмосфере появление
Может быть,
позже логическое
Зрелость языка означает то, что он больше не является доопределяемой и уточняемой научной концепцией, а становится реальным объектом.
Глава 1. Общие сведения.
1.1 Чистый Пролог.
Взаимосвязь
логического программирования
При построении на основе абстрактного интерпретатора некоторого интерпретатора для конкретного языка программирования необходимо принять два решения. Во-первых, следует уточнить метод расписания. Во-вторых, нужно реализовать недетерминированный выбор предложения программы, используемого в редукции.
Существуют разные языки программирования, использующие различные способы выбора. Грубо говоря, они делятся на два класса. Пролог и его расширения основаны на последовательном выполнении. Другие языки, такие, как Parlog, Параллельный Пролог и GHC, основаны на параллельном выполнении. Последовательные языки отличаются от параллельных методом реализации недетерминизма. Отличие Пролога от его версий состоит в методе выбора редуцируемой цели.
Выполнение
программ на Прологе
Другими
словами, в Прологе
В дополнение
к методу стека Пролог
1.2. Сравнение с традиционными языками
программирования
Язык программирования
характеризуется присущими ему
механизмами управления и
При успешном выполнении вычисления средства управления программ на языке Пролог подобны средствам управления в обычных процедурных языках. Обращение к некоторой цели соответствует вызову процедуры, порядок целей в теле правила соответствует последовательности операторов. Точнее, правило А = В1,В2,…,Вn можно рассматривать как определение процедуры:
Procedure A
Call B1
Call B2
.
.
.
Call Bn
End.
Рекурсивный
вызов цели в Прологе в
последовательности действий и
в реализации подобен тому
же вызову в обычных
Структуры данных, которыми оперируют логические программы, - термы – соответствуют общим структурам записей в обычных языках программирования. Пролог использует очень гибкую систему организации структур данных. Подобно языку Лисп, Пролог является бестиповым языком, не содержащим объявления данных.
Другие особенности использования структур данных в языке Пролог связаны с природой логических переменных. Логические переменные соотносятся с объектами, а не с ячейками памяти. Если переменной сопоставлен конкретный объект, то эта переменная уже никогда не может ссылаться на другой объект. Иными словами, логическое программирование не поддерживает механизм деструктивного присваивания, позволяющий изменять значение инициализированной переменной.
В логическом программировании обработка данных полностью заключена в алгоритме унификации. В унификации реализованы:
• однократное присваивание,
• передача параметров,
• размещение записей,
• доступ к полям
записей для одновременных
Традиционные языки, как правило, содержат различной степени сложности средства обработки ошибочных и исключительных ситуаций. Чистый Пролог не содержит механизма обработки ошибок и исключительных ситуаций, встроенного в описание языка. В отличие от традиционных языков ситуации, приводящие к ошибке (например, отсутствие нужной ветви в операторе case, деление на нуль), в чистом Прологе приводят к "отказу”.
Глава 2. Программирование на чистом Прологе.
Основная
цель логического
2.1 Порядок правил.
Два синтаксических понятия, несущественные в логических программах, важны при создании программ на Прологе. В каждой процедуре должен быть принят порядок правил, или порядок предложений. Кроме того, в теле каждого предложения должен быть определён порядок целей. Последствия этих решений могут оказаться колоссальными: эффективность программирования на Прологе может измениться в десятки раз. В крайних и тем не менее распространённых случаях корректные логические программы вообще не приведут к решению вследствие не завершающегося вычисления.
Порядок
правил определяет порядок
Изменение порядка правил в процедуре приводит к перестановке ветвей в любом дереве поиска цели, использующей данную процедуру. Обход дерева поиска происходит в глубину. Поэтому перестановка ветвей дерева изменяет порядок обхода дерева и порядок нахождения решений. Этот эффект очевиден при использовании фактов для нахождения ответов на экзистенциальный вопрос.
Порядок, в котором находятся ответы на вопросы при работе рекурсивной программы, определяется порядком предложений.
Порядок
предложений в программах на
общепринятом Прологе важнее, чем
порядок предложений в
2.2. Проблема завершения программ.
Используемый
в Прологе принцип обхода
Бесконечные вычисления появляются при использовании рекурсивных правил. Рекурсивные правила, в которых рекурсивная цель является первой целью в теле правила, называются левыми рекурсивными правилами. Левые рекурсивные правила в Прологе приносят немало хлопот. В случае несоответствующих аргументов использование этих правил приводит к бесконечным вычислениям.
Лучшее решение
этой проблемы – отказаться
от использования левой
2.3. Порядок целей.
Порядок
целей более существен, чем
порядок предложений. Порядок
целей имеет решающее значение
при определении
Причина, по которой порядок целей в предложении влияет на порядок решений, отличается от причины, по которой порядок правил в процедуре влияет на порядок решений. Изменение порядка правил не изменяет дерево поиска, которое используется при решении данной цели. Просто обход дерева производится в ином порядке. Изменение порядка целей приводит к изменению дерева поиска.
Порядок
целей определяет дерево
Существенен не порядок правил, а порядок целей. Программа будет завершающейся, если первый аргумент цели – полный список. Цели, у которых первый аргумент – неполный список приводят к бесконечным вычислениям.
2.4. Избыточные решения.
При построении программ на Прологе следует обратить внимание на важную характеристику программы, не имеющую аналогов в логическом программировании, - отсутствие избыточных решений. Значением логической программы является множество выводимых из программы основных целей. Здесь не существенно, выводится ли цель единственным образом или существует несколько различных выводов; однако это существенно в Прологе, поскольку от этого зависит эффективность поиска решений. Каждый возможный вывод означает дополнительную ветвь в дереве поиска. чем больше дерево поиска, тем дольше продолжается вычисление. В общем случае желательно сохранить размер дерева поиска по возможности минимальным.
Наличие
избыточных решений из-за
Одна из причин появления избыточных решений в программах на Прологе состоит в наличии различных правил, пригодных для одного и того же случая.
Другая причина,
приводящая к избыточным
Для исключения
избыточных решений можно
Глава 3. Практические рекомендации.
При практическом
программировании следует
Технология
программирования для
3.1 Эффективность программ на Прологе.
В практическом программировании на Прологе необходимо обращать внимание на эффективность программ. Установим критерии оценки программ. Основной оцениваемый параметр – число выполняемых унификаций и число попыток унификации в процессе вычисления. Этот параметр связан с временем работы программы. Ещё один параметр – глубина вложенной рекурсии. Если в процессе вычислений глубина станет больше максимально допустимой, то вычисления прервутся. На практике эта проблема является основной. Третий параметр – число порождённых структур данных. Рассмотрим последовательно эти параметры.
Можно предположить,
что при разумной записи детерминированного
последовательного алгоритма в
виде программы на Прологе ожидаемая
эффективность алгоритма
Сложности могут возникнуть при реализации алгоритмов, связанных с существенной перестройкой структур данных, например используя деревья, при этом затраты будут возрастать логарифмически. Однако во многих случаях более естественно было бы модифицировать сам алгоритм, приспосабливая его к принципу однократного присваивания, присущему логическим переменным.
Для указанных
алгоритмов применимы обычные
методы анализа сложности
При программировании
на Прологе средства, представляемые
языком, могут использоваться
Один из
основных способов повышения
эффективности программ –
Помимо выбора наиболее удачного алгоритма можно использовать ещё несколько способов для увеличения эффективности программ на Прологе. Один из них состоит в выборе наилучшей реализации. Эффективная реализация характеризуется исходной скоростью, возможностью индексирования, применением оптимизации остатка рекурсии и методом сборки мусора. Единицей измерения скорости выполнения программы на языке логического программирования обычно служит LIPS – число логических выводов в секунду. При вычислениях логический вывод соответствует редукции.
3.2. Разработка программ.
Программирование
на Прологе настолько близко
к записи спецификаций, насколько
это доступно для
Другими
словами, при любом формализме
найдётся достаточно много
Существуют
два подхода к анализу
В случае
Пролога можно предложить
В подобной ситуации
имеются менее радикальные
В некотором
смысле программы на Прологе
являются выполняемыми

- Логическое проектирование
- Логическое следствие результатов социологических исследований
- Логістична стратегія управління запасами підприємства
- Логістичний підхід до забезпечення конкурентоздатності підприємства на зовнішньому ринку
- Логічні докази софістів і їх значення у становленні філософського значення
- Логічні етапи процесу ухвалення рішення при покупці соку ТМ «Сандора»
- Логічні помилки в засобах масової інформації
- Логическое завершение теории потребления и спроса
- Логическое и чувственное познание
- Логическое мышление
- Логическое отрицание и умножение
- Логическое программирование
- Логическое программирование
- Логическое программирование