Пролог (язык программирования)

С Сибирьска википедья
Айдать на коробушку Айдать на сыскальник

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

История создания и развитие

Язык был разработан в 1972 году во Франции, в стенах Марсельского университета. Создание Пролога явилось отражением европейской научной традиции, ставящей во главу угла построение строгой теоретической и логической модели системы до начала ее практической реализации. Первый в истории компилятор языка был написан в том же 1972 году с использованием языка Фортран.

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

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

В Советском Союзе Пролог получил широкое признание в академической и университетской среде. Поскольку советская школа информатики тяготела к фундаментальной европейской математической логике, язык стал активно внедряться в образовательные программы. Были созданы русскоязычные интерпретаторы, ориентированные на студентов математических и программистских специальностей (в том числе в Томском государственном системе управления и радиоэлектроники в 1990-е и 2000-е годы).

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

Парадигмы программирования и методология

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

Все структуры данных в языке внутренне представляются в виде ориентированного дерева. Интерпретатор Пролога осуществляет обход этого дерева решений в глубину (depth-first search), пытаясь найти ветвь, которая приводит к истинному значению для заданного запроса.

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

Синтаксис и типы данных

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

Синтаксис Пролога базируется на нескольких фундаментальных элементах:

  • Атомы (константы). Записываются исключительно со строчной (маленькой) буквы. Атом представляет собой минимальный неделимый факт или имя объекта. Если возникает необходимость использовать константу, начинающуюся с заглавной буквы (например, имя собственное), она в обязательном порядке заключается в кавычки.
  • Переменные. Всегда пишутся с заглавной (большой) буквы. В отличие от императивных языков, переменная в Прологе не связана с конкретной физической ячейкой памяти компьютера; она выступает в роли абстрактной математической переменной, которая временно связывается со значением в процессе поиска решения (унификации).
  • Структуры. Представляют собой совокупность термов, заключенных в круглые скобки после имени структуры.
  • Списки. Упорядоченные наборы элементов, которые заключаются в квадратные скобки.

Концептуальный пример записи структуры:

  book(Название, Год_издания, Город_издания)

Программа строится на основе фактов и правил. Факт — это безусловное утверждение об объекте или отношении объектов, констатирующее логическую истину. Например, запись факта, означающего, что Иван является котом, или что Маша является девочкой, не требует дополнительных условий. Если факт занесен в базу, система автоматически считает его истинным.

Правило — это конструкция логического вывода. Правило состоит из заголовка (левой части) и тела (правой части), соединенных знаком вывода. Смысл правила заключается в следующем: заголовок считается истинным тогда и только тогда, когда истинно тело правила (условие). Словесный пример логики правила: Если истинно утверждение «чай горячий», то истинным является и следствие «пить его нельзя». Если же утверждение «чай горячий» ложно, то следствие теряет силу.

Сферы применения

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

Типичным учебным и практическим примером применения языка является создание экспертных систем или генеалогических баз данных. В базу заносятся минимальные родственные связи (например, «А — отец Б», «В — дочь А»). После этого системе задается комплексный запрос: «Чьим внуком является субъект Г?». Пролог самостоятельно обходит иерархическое дерево данных и выводит правильный ответ.

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

Критика и недостатки

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

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

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

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

См. также

Ratfor Рефал

Смотреть видео