Почти все современные компьютеры основаны на ранних, разработанных в 40-х годах идеях фон Неймана и его коллег. Машина фон Неймана содержит большую память и процессор, снабженный локальной памятью, ячейки которой называются регистрами. Процессор может загружать данные из памяти в регистры, выполнять арифметические и логические операции над содержимым регистров и отсылать значения регистров в память. Программа машины фон Неймана представляет собой последовательность команд выполнения перечисленных операций вместе с дополнительным множеством команд управления, влияющих на выбор очередной команды. Хотя компьютеры предназначены для использования людьми, возникающие при их создании трудности были столь значительны, что язык описания проблемы и инструкций для их решения на компьютере разрабатывался применительно к инженерным решениям, заложенным в конструкцию компьютера.
По мере преодоления технических проблем построения компьютеров накапливались проблемы, связанные с их использованием. Трудности сместились из области выполнения программ компьютера в область создания программ для компьютера. Начались поиски языков программирования, пригодных для человека. Начиная с языка, воспринимаемого компьютером (машинного языка), стали появляться более удобные формализмы и системы обозначений. И хотя степень абстракции языков возрастала, начиная с языка ассемблера и далее к Фортрану, Алголу, Паскалю и Аде, все они несут печать машины с архитектурой фон Неймана. Характерные особенности программирования на компьютерах фон Неймана приводят к разделению труда: есть люди, которые думают, как решить задачу, и разрабатывают соответствующие методы, а есть люди-кодировщики, которые пишут тексты программ, т.е. выполняют прозаическую и утомительную работу по переводу инструкций разработчиков в команды, воспринимаемые компьютером.
И в логике, и в программировании требуется явное выражение знаний и методов в некотором подходящем формализме. Явная формулировка каких-либо сведений является утомительной работой. Однако формализация в логике часто является интеллектуально благодарной работой, поскольку при этом приходит большее понимание задачи. В отличие от этого формализация задачи и метода решения в виде набора инструкций машины фон Неймана редко приводит к подобному полезному эффекту.
Истоки логики связаны с исследованием научного мышления. Логика представляет точный язык для явного выражения целей, знаний и предположений. Логика даёт основание, позволяющее выводить следствия из исходных положений. Логика позволяет, исходя из знания об истинности или ложности некоторых утверждений, сделать заключение об истинности или ложности других утверждений. Логика позволяет обосновывать непротиворечивость утверждений и проверять истинность приведенных доводов.
ИСТОРИЯ РАЗВИТИЯ КОМПЬЮТЕРОВ
... историю развития и историю изобретений вычислительной техники, а также сделаем краткий обзор о возможностях применения современных вычислительных систем и дальнейшие тенденции развития персональных компьютеров. Глава 1. Исторические предшественники компьютерам Начало развития ... определенную последовательность инструкций (такую последовательность действий впоследствии стали называть программой). Но ...
Компьютерам ещё далеко до достижения цели – стать равным партнёром человека в его интеллектуальной деятельности. Однако, с исторической точки зрения использование логики в качестве подходящей ступени на этом длинном пути является естественным и плодотворным, поскольку именно логика сопровождает процесс мышления человека с момента зарождения интеллекта.
логическим программированием
целевым утверждением.
Успехи в технологии реализации также в значительной мере способствовали представлению логики как практической формальной системы программирования. Первый экспериментальный интерпретатор был реализован Русселом и Колмероэ и другими в университете Экс – Марсель в 1972 году. Ему было дано имя Пролог (“программирование на языке логики” – PROgramming in LOGic), и он оказал сильное влияние на разработку последующих систем.
Термины “логическое программирование” и “программирование на языке Пролог” часто употребляются как равнозначные, однако подразумеваемая стратегия управления в Прологе отнюдь не является единственной стратегией, имеющейся для исполнения логических программ.
Несмотря на обилие теоретических работ, и волнующих идей, концепция логического программирования казалась нереалистичной. В этот период в результате исследования, проведённого в США, были обнаружены серьёзные недостатки “языков искусственного интеллекта следующего поколения”. Основные претензии к таким языкам программирования заключались в следующем: они были неэффективны и очень трудны в реализации.
В такой атмосфере появление компилятора с Пролога-10 стало почти фантастическим явлением. Компилятор был почти полностью написан на Прологе, что наводило на мысль о том, что сила логического программирования может принести выигрыш и в классических программистских задачах, а не только в изощрённых проблемах искусственного интеллекта.
Может быть, позже логическое программирование и покинуло бы задворки программистских исследований, если бы не японский проект пятого поколения. Именно с этого момента произошел переход Пролога от юности к зрелости.
Зрелость языка означает то, что он больше не является доопределяемой и уточняемой научной концепцией, а становится реальным объектом.
Глава 1. Что же представляют собой языки логического программирования?
1.1. Чистый Полог.
чистом Прологе.
При построении на основе абстрактного интерпретатора некоторого интерпретатора для конкретного языка программирования необходимо принять два решения. Во-первых, следует ограничить произвол в выборе редуцируемой цели в резольвенте, т.е. уточнить метод расписания. Во-вторых, нужно реализовать недетерминированный выбор предложения программы, используемого в редукции.
Существуют разные языки программирования, использующие различные способы выбора. Грубо говоря, они делятся на два класса. Пролог и его расширения основаны на последовательном выполнении. Другие языки, такие, как Parlog, Параллельный Пролог и GHC, основаны на параллельном выполнении. Последовательные языки отличаются от параллельных методом реализации недетерминизма. Отличие Пролога от его версий состоит в методе выбора редуцируемой цели.
Информатика программирование : Системы управления базами данных
... элементы базы данных 1.2. Классификация баз данных Многообразие характеристик и видов баз данных порождает многообразие классификации. Рассмотрим основные виды классификации. По технологии обработки данных, Централизованная база данных, Распределенная база данных, По способу доступа к данным Системы централизованных баз данных с ...
Выполнение программ на Прологе заключается в работе абстрактного интерпретатора, при которой вместо произвольной цели выбирается самая левая цель, а недетерминированный выбор предложения заменяется последовательным поиском унифицируемого правила и механизма возврата.
Другими словами, в Прологе используется стековый метод расписания. В Прологе резольвента используется как стек – для редукции выбирается верхняя цель, производные цели помещаются в стек резольвенты.
В дополнение к методу стека Пролог моделирует недетерминированный выбор редуцирующего правила с помощью последовательного поиска и механизма возврата. При попытке редуцировать цель выбирается первое предложение, заголовок которого унифицируем с данной целью. Если не существует правила, унифицируемого с выбранной целью, то вычисление восстанавливается на стадии последнего сделанного выбора и выбирается следующее унифицируемое предложение.
1.2. Сравнение с традиционными языками программирования.
Язык программирования характеризуется присущими ему механизмами управления и обработки данных. Пролог как универсальный язык программирования можно рассматривать и с этих точек зрения.
При успешном выполнении вычисления средства управления программ на языке Пролог подобны средствам управления в обычных процедурных языках. Обращение к некоторой цели соответствует вызову процедуры, порядок целей в теле правила соответствует последовательности операторов. Точнее, правило А = В 1 ,В2 ,…,Вn можно рассматривать как определение процедуры:
Procedure A
Call B 1
Call B 2
Call B n
End.
Рекурсивный вызов цели в Прологе в последовательности действий и в реализации подобен тому же вызову в обычных рекурсивных языках. Различие возникает при реализации возврата. В обычных языках, если вычисление не может быть продолжено (например, все ветви в операторе case ложны), возникает ошибка выполнения. В Прологе вычисление просто возвращается к последнему выбору и делается попытка продолжить вычисления по новому пути.
Структуры данных, которыми оперируют логические программы, — термы – соответствуют общим структурам записей в обычных языках программирования. Пролог использует очень гибкую систему организации структур данных. Подобно языку Лисп, Пролог является бестиповым языком, не содержащим объявления данных.
Другие особенности использования структур данных в языке Пролог связаны с природой логических переменных. Логические переменные соотносятся с объектами, а не с ячейками памяти. Если переменной сопоставлен конкретный объект, то эта переменная уже никогда не может ссылаться на другой объект. Иными словами, логическое программирование не поддерживает механизм деструктивного присваивания, позволяющий изменять значение инициализированной переменной.
В логическом программировании обработка данных полностью заключена в алгоритме унификации. В унификации реализованы:
- однократное присваивание,
- передача параметров,
- доступ к полям записей для одновременных чтения/записи.
Традиционные языки, как правило, содержат различной степени сложности средства обработки ошибочных и исключительных ситуаций. Чистый Пролог не содержит механизма обработки ошибок и исключительных ситуаций, встроенного в описание языка. В отличие от традиционных языков ситуации, приводящие к ошибке (например, отсутствие нужной ветви в операторе case , деление на нуль), в чистом Прологе приводят к “отказу”.
Языка программирования Delphi. Разработка практических заданий
... (тип TTimer) и компоненты доступа и управления базами данных. 1.1 Структура среды программирования Внешний вид среды программирования Delphi отличается от многих других из тех, что можно ... все остальные окна среды программирования, освободив место для работы других программ. 1.1.1 Главные составные части среды программирования Ниже перечислены основные составные части Delphi: 1. Дизайнер Форм ( ...
1.3 Программирование на чистом Прологе.
Основная цель логического программирования – создать возможность разработки программ на языке высокого уровня. В идеале программист должен записать аксиомы, определяющие требуемые отношения, полностью игнорируя, каким образом эти аксиомы будут использоваться в процессе выполнения. Имеющиеся языки логического программирования, и, в частности Пролог, всё ещё далеки от этого идеала декларативного программирования. Нельзя игнорировать конкретный, четко определённый способ моделирования абстрактного оператора в реализации каждого языка. Эффективное логическое программирование требует знания и использования этого способа.
1.3.1. Порядок правил.
порядок правил,
Порядок правил определяет порядок поиска решений.
Изменение порядка правил в процедуре приводит к перестановке ветвей в любом дереве поиска цели, использующей данную процедуру. Обход дерева поиска происходит в глубину. Поэтому перестановка ветвей дерева изменяет порядок обхода дерева и порядок нахождения решений. Этот эффект очевиден при использовании фактов для нахождения ответов на экзистенциальный вопрос.
Порядок, в котором находятся ответы на вопросы при работе рекурсивной программы, определяется порядком предложений.
Порядок предложений в программах на общепринятом Прологе важнее, чем порядок предложений в программах на чистом Прологе.
1.3.2. Проблема завершения программ.
Используемый в Прологе принцип обхода дерева в глубину приводит к серьёзным проблемам. Если дерево поиска цели относительно некоторой программы содержит бесконечную ветвь, то вычисление не завершится. Пролог может не найти решение цели, даже если существует конечное вычисление, решающее вопрос.
левыми рекурсивными
Лучшее решение этой проблемы – отказаться от использования левой рекурсии. В общем случае невозможно избавиться от всех появлений левой рекурсии. Однако соответствующий анализ позволяет определить вопросы, решение которых относительно рекурсивных программ приводит к результату. Другой, не всегда замечаемый случай, который заведомо приводит к не завершающимся вычислениям – это порочный круг. Ввиду порочного круга дерево поиска обязательно содержит бесконечную ветвь.
1.3.3. Порядок целей.
Порядок целей более существен, чем порядок предложений. Порядок целей имеет решающее значение при определении последовательности действий в программе на Прологе.
Причина, по которой порядок целей в предложении влияет на порядок решений, отличается от причины, по которой порядок правил в процедуре влияет на порядок решений. Изменение порядка правил не изменяет дерево поиска, которое используется при решении данной цели. Просто обход дерева производится в ином порядке. Изменение порядка целей приводит к изменению дерева поиска.
Программы циклической структуры. Массивы данных
... удобства и эффективности программирования. Массив позволяет сохранять и манипулировать многими элементами данных посредством единственной переменной. циклический программа массив Предмет исследования. Программирование циклических структур и массивов данных Объект исследования. Теория циклических структур и массивов данных. Целью в данной работе является решение ...
Порядок целей определяет дерево поиска.
Существенен не порядок правил, а порядок целей. Программа будет завершающейся, если первый аргумент цели – полный список. Цели, у которых первый аргумент – неполный список приводят к бесконечным вычислениям.
1.3.4. Избыточные решения.
При построении программ на Прологе следует обратить внимание на важную характеристику программы, не имеющую аналогов в логическом программировании, — отсутствие избыточных решений. Значением логической программы является множество выводимых из программы основных целей. Здесь не существенно, выводится ли цель единственным образом или существует несколько различных выводов; однако это существенно в Прологе, поскольку от этого зависит эффективность поиска решений. Каждый возможный вывод означает дополнительную ветвь в дереве поиска, чем больше дерево поиска, тем дольше продолжается вычисление. В общем случае желательно сохранить размер дерева поиска по возможности минимальным.
Наличие избыточных решений из-за возвратов может вызвать в предельном случае экспоненциальный рост времени работы программы. При решении конъюнкции n целей, каждая из которых имеет одно избыточное решение, в случае возвратов может быть порождено 2 n решений, что приводит к изменению оценки времени работы программы от полиноминальной (или даже линейной) к экспоненциальной.
Одна из причин появления избыточных решений в программах на Прологе состоит в наличии различных правил, пригодных для одного и того же случая.
Другая причина, приводящая к избыточным решениям, состоит в рассмотрении слишком большого числа специальных случаев. Иногда подобное рассмотрение мотивируется стремлением к эффективности.
Для исключения избыточных решений можно добавить дополнительный факт, что позволит сократить рекурсивные вычисления, когда существует аргумент – пустой список. Каждое предложение должно применяться лишь к спискам с ненулевым вторым аргументом.
1.4.Практические рекомендации.
При практическом программировании следует заботиться об эффективности программ, учитывать ограничения, связанные с конкретной реализацией, используемой системой программирования и другими факторами.
Технология программирования для логических языков имеет тот же смысл, что и для процедурных языков. Методология разработки и сопровождения больших программных комплексов для Пролога так же необходима, как и для любого другого языка программирования. Не меньшую важность представляет хороший стиль программирования.
1.4.1 Эффективность программ на Прологе.
В практическом программировании на Прологе необходимо обращать внимание на эффективность программ. Установим критерии оценки программ. Основной оцениваемый параметр – число выполняемых унификаций и число попыток унификации в процессе вычисления. Этот параметр связан со временем работы программы. Ещё один параметр – глубина вложенной рекурсии. Если в процессе вычислений глубина станет больше максимально допустимой, то вычисления прервутся. На практике эта проблема является основной. Третий параметр – число порождённых структур данных. Рассмотрим последовательно эти параметры.
Доклад: Язык SQL: общая характеристика, интерфейс с традиционными ...
... также операторы структурного программирования (цикла, ветвтеления и т.д.). Также эти языки допускают определение структур, соответствующих записям таблиц обрабатываемой базы данных. В исходный текст программы включаются операторы языка SQL, которые во ...
Можно предположить, что при разумной записи детерминированного последовательного алгоритма в виде программы на Прологе ожидаемая эффективность алгоритма сохранится. Обычно результирующие программы на Прологе не основываются на унификациях общего вида или глубоких возвратах.
Сложности могут возникнуть при реализации алгоритмов, связанных с существенной перестройкой структур данных, например используя деревья, при этом затраты будут возрастать логарифмически. Однако во многих случаях более естественно было бы модифицировать сам алгоритм, приспосабливая его к принципу однократного присваивания, присущему логическим переменным.
Для указанных алгоритмов применимы обычные методы анализа сложности вычислений. Если не используется полная унификация, то можно показать, что время выполнения редукции цели с помощью предложения программы ограничено константой. Величина константы зависит от программы. Поэтому число выполняемых в программе редукций, как функция от размера её входа, является хорошей оценкой временной сложности программы.
При программировании на Прологе средства, представляемые языком, могут использоваться полностью. Можно писать недетерминированные программы и программы, использующие полную унификацию. Анализ сложности таких программ представляет собой трудную задачу и требует оценки затрат на просмотр при поиске и размера унифицируемых термов.
Один из основных способов повышения эффективности программ – совершенствование алгоритма. Хотя речь идёт о декларативном языке, понятие алгоритма в Прологе остаётся тем же, что и в других языках программирования.
число логических выводов в секунду.
1.4.2. Разработка программ.
Программирование на Прологе настолько близко к записи спецификаций, насколько это доступно для практического языка программирования. Поэтому кому-нибудь может показаться, что в программах на чистом Прологе не бывает ошибок. Но это не так. Уже процесс аксиоматизации понятий и алгоритмов может привести к широкому спектру ошибок, совершенно аналогичных ошибкам в обычных языках программирования.
Другими словами, при любом формализме найдётся достаточно много сложных задач, для которых нет правильных записей решения. Таким образом, грань между языками низкого и высокого уровня определяется лишь тем, достаточно или нет простой проверки для правильности программы.
Существуют два подхода к анализу правильности программы. При “верификационном” подходе предполагается, что сложные программы можно проверить, доказав, что они корректны относительно некоторой абстрактной спецификации. Непонятно, как подобный подход может быть использован при анализе логических программ, так как для таких программ различие между спецификацией и программой существенно меньше по сравнению с другими языками программирования. Если программа на Прологе не очевидна, то мало надежды на очевидность спецификации, на каком языке она ни была бы записана.
В случае Пролога можно предложить использовать в качестве языка записи спецификации полный язык логики первого порядка. Очень редко бывает такое, что спецификации на полном языке логики первого порядка короче, проще или понятнее простейшей программы на Прологе, определяющей то же отношение.
В подобной ситуации имеются менее радикальные решения. Одно из них состоит в доказательстве того, что одна программа на Прологе, возможно более эффективная, хотя и более сложная, эквивалентна более простой программе на Прологе, которая, уступая в эффективности, может служить спецификацией первой. Другое решение состоит в доказательстве того, что программа удовлетворяет некоторому ограничению типа “инвариант цикла”, которое хотя и не гарантирует корректность программы, однако повышает уверенность в её правильности.
Строковый тип данных в языке Pascal
... работы – строковые данные и текстовые файлы. Объект исследования – строковый тип данных и текстовые файлы в языке Pascal. Глава I. Строковый тип данных в языке Pascal Тип данных – понятие, используемое в языках программирования для характеристики данных (переменных, массив и др.) в программах. ...
В некотором смысле программы на Прологе являются выполняемыми спецификациями. Вместо того чтобы разглядывать программы, пытаясь убедиться в их правильности, программы можно запустить и проверить, работают ли они так, как нам хотелось. Существуют обычные приёмы тестирования и отладки, применяемые при разработке программ во всех прочих языках программирования. Все классические приёмы и подходы, используемые при тестировании и отладке программ, в равной степени применимы и на Прологе.
Один из ответов на вопрос в чём разница в разработке программ на Прологе и на обычных языках программирования состоит в том, что, хотя, программирование на Прологе – это “просто” программирование, в случае Пролога имеется преимущество в простоте записи и скорости отладки по сравнению с формализмами более низкого уровня.
Другой ответ состоит в том, что декларативное программирование проясняет мышление. Другими словами, вообще программирование некоторых понятий, а программирование на декларативном языке и языке высокого уровня в особенности, позволяет уточнить соответствующие концепции и идеи. Для опытных программистов Пролог – это не просто формализм для “кодирования” машинных команд, но формализм, позволяющий записывать и реализовывать идеи, т.е. инструмент мышления.
Третий ответ заключается в том, что особенности логического формализма высокого уровня могут, в конце концов, привести к набору средств практической разработки программ, существенно более мощных, чем существующие в настоящее время. Примерами таких средств являются автоматический преобразователь программ, частично вычисляющая программа, программа типового вывода и алгоритмический отладчик.
Имеющиеся средства и системы программирования не навязывают и не поддерживают, какую либо специфическую методику разработки программ. Однако, как и в других символьных языках программирования, наиболее естественной стратегией разработки программ является стратегия быстрой смены прототипов. При такой стратегии на каждой стадии разработки имеется лучше работающий прототип программы. Разработка происходит путём переделки или расширения прототипа. Другой подход к разработке программ, иногда комбинируемый с первым, состоит в “нисходящем анализе и восходящей реализации”. Хотя проектирование системы следует проводить нисходящим способом, основываясь на анализе цели, реализацию системы лучше всего строить “снизу вверх”. В процессе восходящего программирования каждый написанный фрагмент программы может быть немедленно отлажен. Глобальные проектные решения, такие, как представление, могут быть проверены на небольших сегментах системы, которые будут приведены в порядок и очищены от ошибок на начальной стадии программирования. Кроме того, эксперименты с одной подсистемой могут привести к изменению проектных решений, относящихся к другим подсистемам.
Часть текста, которую следует целиком написать и отладить, может иметь разную длину. Она возрастает по мере того, как программист приобретает опыт. Опытный программист, пишущий на Прологе, может сразу написать программу, текст которой занимает несколько страниц. При этом он знает, что после записи текста осталось выполнить лишь весьма простую и прозаическую отладку. Для менее опытного программиста может оказаться сложным следить за функциональностью и взаимодействием одновременно большого числа процедур.
Роль языка в жизни человека — (5, 6, 7, 8, 9, 11 класс)
... человека и его родину. Роль языка в жизни человека (стр. 2 из 3) 4. Функция основания искусственных языков проявляется в том, что все искусственные языки — от химических и математических номенклатур до языков компьютерного программирования и языков ...
В заключение хотелось бы сказать, что независимо от языка программирования найдутся программисты, пишущие на этом языке неестественные, нечитаемые программы. Пролог не составляет исключения. Но нужно отметить, что эстетика и практичность не обязательно должны конфликтовать.
1.5. Другие языки логического программирования.
Пролог не единственный язык логического программирования. Кроме него существует ряд других языков, не получивших такого широкого признания в кругах программистов. Рассмотрим два таких языка.
1.5.1 Язык логического программирования KL0.
KL0 (от англ. “kernel-language version 0” – ядро-язык версии 0) – язык, в основу которого положено расширение языка логического программирования Пролог. Среди особенностей, новых в KL0 по отношению к Прологу, можно выделить:
- более гибкую структуру управления.
- многопроцессовость
- операции с побочным эффектом
- машинно-ориентированные операции.
К наиболее существенным механизмам Пролога, не поддерживаемым в KL0, относятся:
- средства управления базой данных
- средства управления таблицей имён.
Так как KL0 мало, чем отличается от Пролога, ограничимся лишь рассмотрением типов данных.
1.5.2 Типы данных KL0.
Рассмотрим в общих чертах некоторые базовые типы данных языка. К ним относятся символы, целые и действительные числа, строки и др.
Символы в основном предназначены для представления символьных атомов Пролога и, как правило, никак не связаны ни со строками символов, используемыми для текстуального представления программ, ни с определениями предикатов, в которых символы задают имена предикатов. Такие атрибуты при необходимости могут быть приписаны символам средствами ESP . KL0 более прост и не поддерживает подобных механизмов. В этом отношении он только обеспечивает структуры данных прямого доступа и стандартную функцию хеширования для доступа к определениям атрибутов в хеш-таблице. Символы в KL0 можно проверять только на идентичность.
Целые и действительные числа введены для эффективного выполнения арифметических операций. Арифметические операции в KL0 не обладают свойством двойственности: сложение и вычитание, здесь различные предикаты. Аппаратно поддерживаются только числа фиксированной длины, определяемой разрядной сеткой. Целые числа произвольной длины (bignums), действительные числа произвольной точности и, возможно, рациональные числа могут быть реализованы с помощью обработчика исключений. Исключение возбуждается, если операндами встроенных арифметических предикатов (машинных инструкций в традиционном смысле) являются, например, нечисловые данные. Обработчик исключения может проверить аргументы и, если они соответствуют ожидаемым, выполнить предписанные операции; в противном случае вызывается обработчик ошибок. После обработки исключения дальнейшее выполнение программы может быть возобновлено.
Строки представляются одномерными массивами небольших положительных целых. Размер элементов массива зависит от диапазона значений элементов строки и может изменяться от одной строки к другой. Для представления битовых массивов, используемых для хранения образов графических изображений в памяти, введены строки с однобитовыми элементами. Для представления символов в коде ASCII используются строки с размером элемента 8 бит.
Проблемы перевода музыкально-поэтических текстов с английского языка на русский
... слова в конкретном случае; диалог и монолог (скрытое значение) [Мукаржовский, 1994]. Исследователь отмечает, что язык, в составе которого находятся вышеперечисленные элементы, является ... в переводе их текстов на другие языки. Темой данной дипломной работы является проблемы перевода ... привычной музыки. Поэтическая музыка стиха зарождается не в абстрагированном звучании поэтического слова, а в ...
1.5.3. Язык программирования ShapeUp.
ShapeUp — ещё один язык логического программирования, в основу которого положен Пролог, расширенный средствами сопоставления строк.
В ShapeUp образцы строк рассматриваются так же, как и термы Пролога, и их сопоставление возложено на процесс унификацию. Таким образом, программы на ShapeUp значительно проще, чем аналогичные программы на Прологе, их легче писать и понимать. Сокращается значительно и размер программ.
Прологу присущи недетерминированность и сопоставление с образцом. Эти свойства очень полезны для разработки систем обработки информационных знаний. К таким системам можно отнести системы понимания естественного языка и другие системы интеллектуальной обработки текстов. Для подобных приложений очень важна операция сопоставления строк. Однако механизм сопоставления с образцом в таком виде, как он существует в Прологе, недостаточен для сопоставления строк. Причина заключена в “терм-терм” механизме сопоставления. ShapeUp – попытка разработать более практический, свободный от присущего Прологу недостатка инструмент программирования. Характерной чертой ShapeUp, отличающей его от традиционных Пролог-систем, является выполняемая при унификации функция сопоставления строк. В ShapeUp включено несколько операторов сопоставления строк. Язык позволяет конструировать образцы строк, представляемые как термы Пролога. Образцы могут унифицироваться с различными строковыми объектами: расширена унификация для выполнения сопоставления строк. В результате ShapeUp-программы проще и имеют более прозрачную семантику, их легче писать.
Список языков логического программирования можно продолжать ещё долго. Кроме перечисленных выше, к языкам логического программирования относятся также: Дейталог, LogLisp и множество других. Но хотелось бы ещё остановиться на таком языке, как Лисп (от англ. Lisp – list processing – обработка списков).
Глава 2. Lisp – язык функционального программирования.
логическое программирование.
2.1. Лисп в истории программирования.
Лисп является наиболее важным языком программирования, используемым в исследованиях по искусственному интеллекту и в математической лингвистике.
Лисп, ни в каком смысле не является младенцем в программировании. Скорее, он старик среди языков программирования. Лисп был разработан в 50-х годах и является вслед за Фортраном старейшим ещё используемым языком программирования. Но в отличие, от Фортрана будущее Лиспа ещё впереди.
Как уже упоминалось выше, Лисп представляет собой язык так называемого функционального программирования. Он основан на алгебре списочных структур, лямбда-исчислений и теории рекурсивных функций. Благодаря неразвитости традиционной вычислительной техники, отличающемуся от других языков программирования характеру и из-за наличия элементарных средств обработки списков Лисп долгое время являлся основным инструментом исследования искусственного интеллекта и средством теоретического подхода к анализу программирования. Однако в 80-х годах Лисп, наконец, вышел из лабораторий и нашел применение в прикладных проблемах.
Обычно языки не изобретают, а проектируют. Однако по отношению к Лиспу можно говорить об изобретении. Первоначальная версия языка, в частности, содержала множество понятий и принципов, которые сначала казались очень странными, но многие из которых позже оказались существенным нововведением. Кроме этого, возможность добавления в Лисп в течение десятилетий многих новых черт подтвердила свойство расширяемости этого языка. Вокруг Лиспа возникла широкая культура, охватывающая многочисленные школы и разнообразные диалекты языка, различные системы и методы программирования, программные среды и Лисп-машины.
2.2. Логическое программирование на Лиспе.
Лисповские функции, как и написанные на традиционных языках программы, обрабатывают данные в порядке, задаваемом описанием алгоритма, несмотря на то, что эту последовательность можно в Лиспе отобразить весьма гибкими и общими формами. Такие языки назовём процедурными.
В процедурных языках и формализмах программирование сводиться к разработке алгоритма, выполняющего действия. В логических языках алгоритмы в таком смысле не используются. Если функциональные и операторные языки описывают, каким образом решается некоторая задача, то в логических языках для её решения достаточно точного логического описания. Языки, в которых решение задачи получают из описания структуры и условий задачи, называют декларативными.
Чтобы в декларативном языке можно было выполнять разумные вычисления, для него наряду с декларативным смыслом определяется интерпретация в виде действий, или процедурная семантика.
При необходимости добиться от Лиспа возможности логического программирования необходимо запрограммировать алгоритм доказательства.
Построим такой алгоритм доказательства. Для этого доказываемый в настоящий момент предикат-теорему назовём целью. Цель можно доказать следующим алгоритмом:
1. Найти для доказательства цели первое предложение, значение которого унифицируется с целью.
2. Если предложение с таким заключением не найдено, то доказательство не удалось. Если предложение найдено и его тело пусто, то цель доказана. Если у предложения не пустое тело, то надо доказать его предикаты в качестве новых целей рекурсивно слева направо.
3. Если алгоритм зашёл в тупик, т.е. доказательство не удалось, то надо вернуться (backtrack) в предыдущее место, где можно выбрать другую цель (если такая имеется) и продолжить доказательство.
Подбор связей переменных основан на методе проб и ошибок и на поиске. Доказываемый в настоящий момент предикат пытаются унифицировать первым возможным способом. Если решение окажется неверным, т.е. некоторый предикат позже не удастся унифицировать, то происходит возврат к предыдущей унификации, выбирается следующая из ещё имеющихся возможностей, и делается попытка унифицировать оставшиеся предикаты другим способом.
Реализовав описанный алгоритм на Лиспе можно добиться возможности логического программирования на этом языке.
Так как возможное в Прологе реляционное и логическое программирование завоёвывало всё большее количество сторонников, многие Лисп-системы стали оснащаться встроенным интерпретатором Пролога. Основанное на логике программирование с помощью правил в будущем может таким же образом войти в Лисп, как, например, вошло объектно-ориентированное программирование Смолтолка.
Заключение.
Логическое программирование хорошо подходит для решения проблем, для работы с формальными и естественными языками, для баз данных, запросных и экспертных систем и для других дискретных невычислительных задач. Пользователя привлекает ясность, содержательность программ и их нетехнический характер. В программе не нужно описывать, каким образом решается задача. Достаточно описания самой задачи и того, что желательно узнать.
Однако логическое программирование с использованием лишь хорновских предложений было бы слишком узконаправленным. Поэтому, кроме этого, используются другие методы программирования. Некоторые задачи по своему характеру процедурные, и программировать их чисто декларативными языками непрактично. Нужны более развитые типы данных. Пролог и логическое программирование непрерывно расширяются, охватывая все новые методы программирования и формы изображения именно в направлении процедурного и объектно-ориентированного программирования, а также в направлении параллельных вычислений.
1. И. Братко «Программирование на языке Пролог для искусственного интеллекта». М: Мир 1990г.
2. «Язык Пролог в пятом поколении ЭВМ». Сборник статей под редакцией Ильинского. М: Мир 1988г.
3. Клоксин, Меллиш «Программирование на языке Пролог». М: Мир 1987г.
4. Дж. Стобо «Язык программирования Пролог». М: Радио и связь 1993г.
5. Э. Хювёнен, Й. Сеппянен «Мир Лиспа» в 2-х томах. М: Мир 1990г.
6. Хоггер «Введение в логическое программирование». М: Мир 1988г.
7. Л. Стерлинг, Э. Шапиро «Искусство программирования на языке Пролог». М: Мир 1990г.
ESP – язык логического программирования. К особенностям этого языка, отличающим его от Пролога можно отнести;
- модульность,
- макросредства,
- глобальные данные.