16.05.2000 |
С момента появления языка программирования Пролог прошло более 30 лет, и сейчас он уже вступил в пору своей зрелости. В то время как в мире интерес к нему возрастает, в России уделяется незаслуженно мало внимания популяризации этого уникального и сейчас самого технологичного языка программирования.
Возможности начинающих программистов, желающих постичь красоту и изящество Пролога, в нашей стране крайне ограниченны, поскольку насчитывается не более десятка публикаций на русском языке, посвященных методам программирования на Прологе, да и те появились лишь в конце 80-х —- начале 90-х годов [1—8].
Пролог — язык программирования, в котором основные конструкции заимствованы из логики, начавшей свое развитие еще во времена Аристотеля более 2,2 тыс. лет назад. Логика же предоставляет точный язык для явного выражения целей, знаний и предположений. Она позволяет сделать заключение об истинности или ложности одних утверждений исходя из знаний об истинности или ложности других. Однако положения традиционной логики при создании языков программирования стали использовать сравнительно недавно. Долгое время считалось, что компьютер способен выполнять только алгоритмы, т. е. последовательность детерминированных формальных действий директивного характера. Именно осознание того, что алгоритм — лишь аксиоматическое задание функции, а его выполнение (вычисление) — частный случай логического вывода, и привело к возникновению логического программирования. Суть логического подхода заключается в том, что машине в качестве программы предлагается не алгоритм, а формальное описание предметной области и решаемой проблемы (функции) в виде аксиоматической системы. Тогда поиск решения с помощью вывода в этой системе можно поручить самому компьютеру. Главная же задача программиста — удачно представить предметную область системой логических формул и таким множеством отношений на ней, которые наиболее полно описывают задачу.
Идею логического программирования можно сформулировать в двух метафорических равенствах:
программа = множество аксиом; вычисление = конструктивный вывод целевого утверждения из программы.
Реализация парадигмы логического программирования оказалась бы нереальной, если бы не существовало эффективных методов организации автоматического поиска доказательств. В 1973 г. группа исследователей из Марсельского университета под руководством Алана Колмероэ, опираясь на исследования Джона Робинсона, посвященные методу резолюций («Машинно-ориентированная логика, основанная на принципе резолюции», 1965), создала программу для доказательства теорем, которая была реализована на языке Фортран. Впоследствии этот продукт получил название Пролог (Prolog — от Programmation en Logique).
Главный компонент интерпретатора этого языка — универсальный механизм решения задач. Чтобы воспользоваться им, программист должен четко описать проблему с помощью фраз Хорна (хорновских дизъюнктов) на языке Пролог. Каждая такая конструкция формулирует некоторое отношение между сущностями из исследуемой предметной области. Для того чтобы запустить механизм решения задачи, нужно написать запрос. После его обработки выясняется, истинный он или ложный. Простейшей фразой Хорна может быть некоторый факт, состоящий из заключения, за которым не следует никаких условий, например
программист(Сергей).
Это выражение можно прочесть как Сергей — программист.
Сконструированные подобным образом факты используются для констатации того, что выполнено некоторое отношение между объектами, а конечное множество фактов образует простейшую логическую программу.
Правило — иная форма реализации фразы Хорна, показывающая зависимость одного факта от других. Например, конструкцию языка
знать_пролог(Сергей) :- программист(Сергей).
можно интерпретировать так: Сергей знает Пролог, если он программист.
Приведенное правило и факт содержат явные знания, относящиеся только к человеку по имени Сергей. Однако, развивая конструкцию, правило «знать_пролог» можно обобщить и на всех программистов, если константу <Сергей> заменить переменной X:
знать_пролог(X):-программист(X).
Это выражение можно прочитать следующим образом: Если X — программист, то он знает Пролог. А можно и так: Все программисты знают Пролог.
Следует заметить, что это выражение, безупречное с точки зрения синтаксиса Пролога, неверно отражает знания о предметной области. Очевидно, не все даже высококвалифицированные программисты владеют Прологом как инструментальным средством, а многие даже не знают о его существовании. Приведенный пример лишь подчеркивает, что эффективное применение этого языка требует глубокого понимания теории логического программирования.
Рассмотренные выше фразы являются просто объявлениями отношений между сущностями, а Пролог-программы состоят практически исключительно из таких конструкций и не используют управляющих структур, известных из алгоритмических языков программирования, как-то: do, while, for, case и т. д.
В течение ряда последующих лет новорожденный, как это обычно и бывает, интересовал в основном своих родителей да специалистов-экспериментаторов. В этот период совершенствовалась теория логического программирования, заметный вклад в развитие которой внесла работа Р. Ковальского «Логика предикатов как язык программирования». А в 1976 г. Ковальский вместе с М. ван Эмденом предложил два подхода к прочтению текстов логических программ — процедурный и декларативный. Однако, несмотря на обилие теоретических работ и передовых идей, концепция логического программирования казалась нереалистичной, безнадежно неэффективной и трудной в осуществлении. Поэтому создание Д. Уорреном и Ф. Перейрой в 1977 г. в университете Эдинбурга интерпретатора/компилятора языка Пролог для ЭВМ DEC-10 полностью развеяло миф о непрактичности логического программирования. Почти весь компилятор написан на Прологе, а алгоритм, использованный при его реализации, послужил прототипом для многих последующих реализаций языка. И наконец, в 1980 г. К. Кларк и Ф. Маккейб в Великобритании разработали версию Пролога для персональных ЭВМ.
Так Пролог вступил в пору юности. В октябре 1981 г. скептикам Пролога был нанесен сокрушительный удар — была широко распространена информация о японском проекте создания ЭВМ пятого поколения. Многих специалистов удивило, что в основу методологии разработки программных средств было положено логическое программирование. Целью проекта декларировалось создание систем обработки информации, базирующихся на знаниях. Тогда же появляется множество коммерческих реализаций Пролога практически для всех типов компьютеров. К наиболее известным можно отнести CProlog, Quintus Prolog, Silogic Knowledge Workbench, Prolog-2, Arity Prolog, Prolog-86, Тurbo Prolog и др.
Наибольшую популярность в нашей стране получила система программирования Turbo Prolog — коммерческая реализация языка для IBM-совместимых ПК. Его первая версия была разработана датской компанией Prolog Development Center (PDC) в содружестве с фирмой Borland International в 1986 г. Система создавалась с серьезными отступлениями от неофициального стандарта языка [5], самым существенным из которых было введение строгой типизации данных, но это позволило значительно ускорить трансляцию и выполнение программ. Новый компилятор сразу же был по достоинству оценен праграммистами-практиками, хотя и вызвал критику в академических кругах.
В 1988 г. вышла значительно более мощная версия Turbo Prolog 2.0, включающая усовершенствованную интегрированную среду разработки программ, быстрый компилятор и средства низкоуровневого программирования. Кроме того, она предоставляла возможность работы с собственными внешними БД, dBase III и Reflex, интегрированным пакетом Lotus 1-2-3, графическим пакетом Paint Brush и другими приложениями. Фирма Borland распространяла эту версию до 1990 г., а затем компания PDC приобрела монопольное право на использование исходных текстов компилятора и дальнейшее продвижение системы программирования на рынок под названием PDC Prolog. В июне 1992 г. появилась версия 3.31 — эффективный универсальный инструмент профессиональных программистов, который вскоре стал одним из наиболее широко используемых. PDC Prolog 3.31 работал в среде MS DOS, OS/2, UNIX, XENIX, PharLap DOS Extender, MS Windows. Эта версия была хорошо совместима с традиционными языками программирования, в первую очередь с Си. В ней были расширены возможности создания приложений с интерфейсом GUI (Graphical User Interface), принятым в MS Windows и OS/2.
Хотя версия PDC Prolog 3.31 уже включала средства для написания программ, работающих под управлением графических операционных систем, процесс разработки подобных приложений все еще носил рутинный характер. Для того чтобы сделать более простыми, удобными и быстрыми процессы написания, тестирования и модификации приложений на языке PDC Prolog, специалисты Prolog Development Center создали систему программирования под названием Visual Prolog 4.0, выпущенную 7 января 1996 г. В этой работе участвовал коллектив российских программистов под руководством Виктора Юхтенко, который позже стал техническим директором компании «Пролог-Софт», представляющей интересы PDC в России.
Рис. 1. Среда разработки Visual Prolog 4.0 |
В Visual Prolog входят различные элементы: прежде всего, интерактивная среда визуальной разработки (VDE — Visual Develop Environment), которая включает текстовый и различные графические редакторы, инструментальные средства генерации кода, конструирующие управляющую логику (Experts), а также являющийся расширением языка интерфейс визуального программирования (VPI — Visual Programming Interface), Пролог-компилятор, набор различных подключаемых файлов и библиотек, редактор связей, файлы, содержащие примеры и помощь.
Visual Prolog поддерживается различными ОС, в том числе MS-DOS PharLap-Extended DOS, всеми версиями Windows, 16- и 32-битовыми целевыми платформами OS/2, а также некоторыми другими системами, требующими графического пользовательского интерфейса.
Рис. 2. Редактирование исходного текста программы |
По желанию программиста генераторы кода могут отобразить любую часть первичного текста программы в окне редактора для просмотра и дополнения в соответствии с логикой приложения, а также для преобразования «скелета» в полноценное приложение. Этот процесс реализуется с помощью различных функций: редактирования, выбора, поиска, перемещения и вставки, как показано на рис 2.
Рис. 3. Редактор для создания окон и диалогов |
Рис. 4. Окно вызова редактора пиктограмм |
С помощью VPI можно создать мобильный исходный текст, а затем перекомпилировать его для работы как в 16-битовом режиме под управлением MS DOS или Windows, так и в 32-битовом режиме под управлением Windows NT, OS/2 PM и других ОС.
В декабре 1997 г. фирма PDC выпустила Visual Prolog 5.0, а с
января 1999 г. приступила к распространению версии 5.1. В настоящее
время все желающие могут бесплатно скопировать через Internet
последнюю версию системы Visual Prolog 5.1 Personal Edition,
функционирующую в средах Windows 3.1/95/98, NT, OS/2, SCO UNIX и
Linux. Ее загрузочный файл объемом 20 Мбайт можно найти по адресам:
Вариант Personal Edition предназначен для некоммерческого использования, и сообщения об этом постоянно имеются во всех приложениях, созданных с его помощью. Кроме того, владельцы Personal Edition не обеспечиваются бесплатной технической поддержкой и на них не распространяются льготы и скидки при приобретении новых версий. В последней версии появились такие усовершенствования, как отладчик, специальный инструментарий и примеры разработки Web-узлов. Следует отметить, что разрабатывали среду программирования всего три человека.
Все продукты PDC, включая Visual Prolog, — это системы, порождающие исполняемый код (EXE или DLL), что еще раз подтверждает высокую эффективность Пролога.
В заключение хочу отметить, что Пролог — это язык, который до сих пор находится в развитии. Область его применения постоянно расширяется, в него вносятся новые дополнительные функциональные возможности, призванные удовлетворить возрастающие потребности пользователей. В настоящее время его поклонники с нетерпением ожидают появления Visual Prolog 6.0.
Достиг ли Пролог своего расцвета? На этот вопрос лучше всего ответили Л. Стерлинг и Э. Шапиро, авторы фундаментального труда по языку Пролог [7]: «Зрелость языка означает, что он больше не является доопределяемой и уточняемой научной концепцией, а становится реальным объектом со всеми присущими ему пороками и добродетелями. Настало время признать, что хотя Пролог и не достиг высоких целей логического программирования, но тем не менее является мощным, продуктивным и практически пригодным формализмом программирования».
*Генезис — момент зарождения и процесс последующего развития, приведший к определенному состоянию, виду, явлению.
Врезки: