Prolog язык программирования декларативный

Prolog — удивительный язык программирования

— Чем же он удивительный? Я знаю пару десятков языков и для меня не проблема изучить еще один новый, я просто уже не вижу необходимости.

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

Пролог — уникален по своей природе, он появился благодаря счастливому совпадению (таинственному устройству мира). Когда-то в 60-х годах очень бурно развивалась теория автоматического доказательства теорем и Робинсоном был предложен алгоритм резолюций, который позволял доказать любую верную теорему (вывести из аксиом) за конечное время (за какое не известно). Как оказалось позже, это наилучшее решение общей задачи, невозможно доказать теорему за ограниченное число операций. Простыми словами, алгоритм представляет собой обход (в общем случае бесконечного) графа в ширину, естественно, что предсказуемость работы алгоритма практически равно 0, соответственно для Языка Программирования — это абсолютно не подходит. И в этот момент Кальмэроу нашел блестящее сужение задачи, благодаря которому доказательство некоторых теорем выглядело как процедурное исполнение программы. Стоит отметить, что класс доказуемых теорем достаточно широк и очень хорошо применим для класса программируемых задач. Вот так в 1972 появился Prolog.

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

Читайте также:  Пульт ditec gol4 программирование

Главной чертой Prolog является то, что его можно легко читать, но очень тяжело писать, что принципиально отличается от всех mainstream языков, которые так и говорят писать стало еще легче еще один шаг и можно будет писать на планшете, перетягивая рабочие модули как друзей в Google+, от этого все мы знаем очень сильно страдает само качество кода. Вроде бы каждая строчка понятна, но как система работает за гранью понимания даже для разработчиков, как говорится наиндусили. Мне кажется во всех книгах по обучению Prolog, делают одну и ту же ошибку, начиная рассказ о фактах, отношениях, запросах и у человека складывается отношение к языку как к Экспертной Системе или Базе Данных. Гораздо важнее научится правильно читать программы и почитать так с десяток 🙂

Как правильно читать программы на прологе

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

Понятия

В языке существует 2 понятия предикаты (условия) и объекты (они же переменные и термы). Предикаты выражают некоторое условие, например объект зеленый или число простое, естественно что условия имеют входные параметры. Например green_object(Object), prime_number(Number) . Сколько в предикате параметров, такова и арность предиката. Объектами — являются термы, константы и переменные. Константы — это числа и строки, переменные — выражают неизвестный объект, возможно искомый, и обозначаются как строчки с большой буквы. Оставим пока термы и рассмотрим простейшую программу.

Читайте также:  Разработка интерактивных приложений smart learning suite online
Программа

Программа — это набор правил, вида Если условие1 и условие2 и… то верно условие. Формально эти правила объединяются через И, но противоречие получить невозможно, так как в Прологе отсутствует логическое отрицание, а в связке То может присутствовать только один предикат (условие).

A :- B_1, B_2. % правило читается как : Если B_1 и B_2, то A
нечетное_простое(Число) :- простое(Число), нечетное(Число).
% Если «Число» — простое и нечетное, то «Число» — нечетное_простое

Как видно имя переменной имеет область видимости — это правило. Математически верно, правило звучит: для любой переменной — «Число», если оно простое и нечетное, то оно простое_нечетное. Аналогично, можно перефразировать так: Если существует «Число», что оно нечетное и простое, то оно нечетно_простое. Поэтому имя переменной очень важно! Если в левой части (до :- ) заменить Число на Число2, то правило поменяет смысл: Для любого Число2 и Число, если Число — простое и нечетное, то Число2 — простое нечетное. Получается все числа простые_нечетные! Это самая распространенная ошибка в Прологе.

A :- B_1, B_2. % правило читается как : Если B_1 и B_2, то A нечетное_простое(Число) :- простое(Число), нечетное(Число). % Если "Число" - простое и нечетное, то "Число" - нечетное_простое 
Пример — совершенные числа
совершенное_число(Ч) :- число(Ч), сумма_делителей_без_числа(Ч, СуммаДелителей), равно(СуммаДелителей, Ч). совершенное_число(1). равно(Объект, Объект). сумма_делителей_без_числа(1, 1). сумма_делителей_без_числа(Число, Сумма) :- число_предыдущее(Число, Предыдущее), сумма_делителей_числа_до_числа(Число, Сумма, Предыдущее). сумма_делителей_числа_до_числа(Число, 1, 1). сумма_делителей_числа_до_числа(Число, Сумма, Делитель) :- делится_на(Число, Делитель), число_предыдущее(Делитель, Предыдущее), сумма_делителей_числа_до_числа(Число, СуммаПред, Предыдущее), сложить(СуммаПред, Делитель, Сумма). сумма_делителей_числа_до_числа(Число, Сумма, Делитель) :- не_делится_на(Число, Делитель), число_предыдущее(Делитель, Предыдущее), сумма_делителей_числа_до_числа(Число, Сумма, Предыдущее). 
  1. Если «Ч» — число и для «Ч» и «СуммаДелителей» выполняется условие сумма_делителей_без_числа, проще говоря СуммаДелителей есть сумма делителей числа «Ч», и «Ч» равно «СуммаДелителей», то «Ч» совершенное число.
  2. 1 — совершенное число. Правила могут не иметь условий, в этом случае они называются фактами.
  3. Всякий объект «О» равен «О». В принципе существует, стандартный предикат » tm-article-presenter__meta»>

Источник

Prolog (Пролог) — декларативный язык

Первоначально способ решения задачи на ЭВМ заключался в составлении программ на «естественном языке» ЭВМ, т.е. в машинных кодах. Имея полностью в своем распоряжении память и центральный процессор ЭВМ, программисты, использовавшие машинные языки, должны были задавать машине способ решения задачи в виде последовательности шагов, которые должна выполнить машина, и способы обработки данных.

Программы на машинных языках были императивными, то есть они диктовали шаги решения задачи (алгоритм) и способы обработки данных.

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

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

Транслируемые команды, заданные в символической форме, представляют собой языки высокого уровня, такие, например, как Фортран и Кобол. Создание языков высокого уровня существенно увеличило скорость разработки программ и сократило потребность в программистах, хорошо знакомых с архитектурой ЭВМ. Но программы, написанные на языках высокого уровня, все еще оставались императивными по своей природе, так как все еще в них было необходимо указывать шаги обработки и манипулирования данными.

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

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

Prolog (Пролог), как и Лисп, является декларативным языком. Программа на декларативном языке являет собой набор логический описаний, определяющих цель, ради которой она написана.

Таким образом в Prolog (Пролог) отсутствуют такие явные управляющие структуры, как DO WHILE и IF … THEN. Вместо расписывания шагов выполнения программы программист должен определить логический метод для достижения цели программы. Мощные внутренние унификационные процедуры будут затем искать решение поставленной задачи.

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

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

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

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

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

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

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

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

Логические предикаты и правила — это основные средства программирования для всех версий Prolog (Пролог).

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

Вы также можете оставить свои комментарии в разделе «Обсуждение» внизу страницы.

Рекомендуем оформить подписку на новости данного раздела. Для этого нажмите на кнопку «Подписаться», расположенную внизу каждой страницы.

Вернуться на Оглавление

project/prolog/prolog_-_deklarativnyj_jazyk.txt · Последние изменения: 2011/09/20 01:17 (внешнее изменение)

Источник

Оцените статью