Prolog — это один из тех языков, которые программисты обычно изучают в самом начале карьеры (например — в школе или в институте). Его, правда, забывают почти сразу же после того, как изучили.
Почему? Ну, лично я виню в этом индустрию разработки ПО. Я работаю в этой сфере последние 17 лет. Я участвовал в самых разных проектах, связанных с веб-разработкой и с большими данными (а именно, это были крупные интернет-площадки, ETL-конвейеры и прочее подобное). Суть в том, что за всё это время я не увидел ни одной строчки кода, написанной на Prolog.
Теперь расскажу о том, что случилось на прошлой неделе. Это был совершенно обычный вторник, я проводил собеседование с начинающим программистом. Когда я спросил его о том, на каких ещё языках программирования он может писать, он ответил так: «Я учил Prolog в университете, но им уже никто не пользуется».
Это заставило меня задуматься о том, насколько подобное заявление соответствует действительности.
Конечно, не может быть такого, чтобы совсем никто уже не пользовался этим языком. Хочу сразу сказать, что я — не из тех программистов, которые изучали Prolog в университете. Я никогда не видел этого языка в расписании занятий. А узнал я о нём несколько лет назад, прочтя книгу «Семь языков за семь недель» (кстати, я полагаю, что эту книгу нужно обязательно прочитать каждому программисту). Одним из языков, о которых идёт речь в этой книге, был Prolog. И там, определённо, был раскрыт потенциал этого языка. Я снова задался вопросом о том, почему этим языком больше никто не пользуется.
Учитывая то количество разных языков программирования или фреймворков, которые каждую неделю появляются в различных сферах разработки ПО, можно предположить, что ИТ-экосистема постоянно меняется и весьма динамична. Но это не совсем так. На самом деле, если об этом поразмыслить, то можно понять, что здесь всё не так уж и непостоянно. В ИТ-индустрии присутствуют большие объёмы процедурного программирования, тут есть некоторое количество декларативного программирования, довольно много объектно-ориентированного программирования. А недавно (под «недавно» я понимаю последние несколько лет) заметным стало ещё и функциональное программирование. Существуют и другие парадигмы разработки ПО, но, если верить результатам исследования Stack Overflow 2020 года, десятка самых популярных языков программирования выглядит так, как показано на следующем рисунке.
Самые популярные языки программирования по данным исследования StackOverflow
Если присмотреться к этому списку, то можно распределить языки, входящие в него, по следующим группам:
- Процедурное программирование: Python, Bash, PHP, JavaScript.
- Объектно-ориентированное программирование: Python, C#, TypeScript, PHP, C++, Java.
- Функциональное программирование: Python, JavaScript.
- Декларативное программирование: SQL.
HTML/CSS я в этот список не включил. Как известно, поиск ответа на вопрос о том, считать ли их настоящими языками программирования, способен привести к бессмысленным спорам, а мне не хотелось бы устраивать тут словесную войну.
Но я не отступаю от своего изначального вопроса. А где же разработчики, занимающиеся логическим программированием? Где те специалисты, которые реально пользуются языком Prolog? Ведь этого языка даже нет в результатах исследования. Можете сами в этом убедиться.
Поэтому мой вопрос о том, используется ли всё ещё Prolog, остаётся открытым. А если окажется, что этим языком всё ещё пользуются — мне хотелось бы узнать о том, кто и для чего.
Кто пользуется языком Prolog?
Прошу вас поверить мне на слово: языком Prolog всё ещё пользуются. Просто не так широко, как другими, более популярными языками. У такого положения дел есть серьёзные причины. Прежде чем мы об этом поговорим, хочу, на всякий случай, рассказать о том, что это за язык — Prolog.
▍Общие сведения о Prolog
Prolog — это язык логического программирования. Это означает, что программы на этом языке пишут в декларативном стиле (в противовес использования императивного стиля, применяемого в других распространённых языках). Тут используются такие понятия, как «отношения», «факты», «правила». Они применяются при написании программ. Описав набор фактов и набор правил, можно строить запросы.
Это, определённо, отличается от того, как пишут «обычные» программы, но, если достаточно хорошо разобраться с Prolog, можно понять, что подобный подход значительно упрощает решение некоторых задач.
В ходе разработки программы на Prolog начинают с описания желаемого состояния некоей системы (с предикатов, фактов), а потом предлагают Prolog попытаться достичь этого состояния.
Давайте, например, поиграем в игру. Представим, что у нас имеются следующие «магические» числа: 1
, 2
, 4
, 5
. Нужно найти все решения задачи, суть которой заключается в поиске пар чисел, сумма которых будет равняться некоему заданному числу. Например, условие этой задачи можно описать так:
Учитывая то, что 1 - «магическое» число
Учитывая то, что 2 - «магическое» число
Учитывая то, что 4 - «магическое» число
Учитывая то, что 5 - «магическое» число
Найти пары чисел, сумма которых равняется 6.
Конечно, прочитав условие этой задачи, мы можем решить её в уме, но если нужно решить её с помощью какого-нибудь из самых распространённых языков программирования, придётся реализовывать некий алгоритм. В ходе его работы будут проверены все возможные пары чисел и найдены результаты их сложения. Программа решит задачу, сообщив о тех парах, сумма которых равняется заданному числу.
Но решение этой задачи на Prolog, в сущности, представляет собой вышеприведённый фрагмент псевдокода. Чтобы этот код заработал, нужно лишь его переписать:
magicNumber(1).
magicNumber(2).
magicNumber(4).
magicNumber(5).
?- magicNumber(X), magicNumber(Y), plus(X, Y, 6)
Первые четыре строчки этого кода равносильны утверждениям о том, какие именно числа являются «магическими». А потом мы просто говорим так: «Переменные X и Y — это вышеописанные магические числа. Сумма каких пар этих чисел равняется 6?».
Вот результаты работы этой программы:
1, 5
2, 4
5, 1
4, 2
Программу можно усложнить для того чтобы избавиться от вариантов решения задачи, где одни и те же числа просто меняются местами, но полагаю, что этот пример достаточно хорошо подходит для демонстрации возможностей логического программирования. Для того чтобы научиться видеть задачи с такой точки зрения нужно время. Дело в том, что программист, при таком подходе, не решает задачу. Он всего лишь описывает правила, по которым работает некая система (то есть, в нашем случае, то, какие числа являются «магическими»), а потом описывает то, что хочет получить в результате решения задачи. То, что находится между описанием задачи и желаемого результата, то есть то, что составляет процесс решения задачи, описываемый в других языках самим программистом, тут выполняется средствами самого языка.
Если вы хотите ознакомиться с другими примерами применения Prolog для решения подобных задач — загляните сюда. Тут вы найдёте много интересного.
Теперь, учитывая мощь, которую даёт нам Prolog, подумаем о том, как вам ей воспользоваться, и о том, почему вы до сих пор не пишете на Prolog.
▍Какие современные задачи можно успешно решать, используя Prolog?
Я вполне понимаю то, насколько бесполезным всё это может выглядеть, например, для человека, который занимается фронтенд-разработкой, или для того, кто создаёт программы для платформы Node.js. Это нормально. Ведь не каждый язык создавался как универсальный, подходящий для решения самых разных задач. Все об этом знают. Но есть одна область, в которой логическое программирование может найти применение и способно очень хорошо себя в ней показать. Это — распознавание шаблонов.
Одной из важнейших задач из сферы искусственного интеллекта является использование шаблонов при обработке естественного языка. Тут Prolog показывает себя во всей красе. И учтите, что технологии искусственного интеллекта применимы и для решения многих других важных задач. Я лишь говорю о том, что Prolog крайне полезен при решении задач определённого вида.
Учитывая это, подумаем о том, где именно Prolog способен принести наибольшую пользу. Где его можно применить? Итак, если вам приходится решать задачи, связанные с логическим программированием в ограничениях, тогда вам, возможно, захочется поближе познакомиться с Prolog. Это, например, задачи, связанные с планированием (которые, если вы ещё не пробовали их решать, весьма сложны), с проверкой цифровых схем, с управлением транспортными потоками.
Если вернуться к технологиям искусственного интеллекта, то Prolog может пригодиться тому, кто занимается задачами из сферы логического программирования с множеством ответов, или из сферы обработки естественных языков. В эту небольшую статью не поместится пример использования Prolog для решения подобных задач, учитывая то, что для понимания этого примера нужны глубокие знания в определённой предметной области, и то, что я не являюсь экспертом в Prolog-программировании. Поэтому я прошу вас поверить мне на слово. А если вас всё это заинтересовало — здесь вы можете найти рассказ об обработке естественных языков с использованием Prolog.
▍Проекты, в которых применяется Prolog
Я собираюсь найти ответ на вопрос о том, где именно используется Prolog, с самого начала работы над статьёй.
Учитывая имеющиеся у меня данные, можно с уверенностью говорить о том, что существуют группы программистов, которые пишут на Prolog, и о том, что об этих группах знают немногие, так как то, чем они занимаются, не представлено некими широко известными проектами. А даже если Prolog-программисты работают над чем-то достаточно популярным, они не кричат об этом на каждом углу, так как на Prolog обычно пишут лишь небольшие части неких систем. Тем не менее, вот — несколько примеров:
- TerminusDB. Это — RDF-база данных, управляемая моделями, поддерживающая контроль версий, дающая, при работе с большими объёмами данных, возможности, сопоставимые с возможностями Git. Она основана на Prolog. Эта база данных поддерживает стандартный RESTful API, позволяющий взаимодействовать с ней.
- IBM Watson. Так оно и есть — в недрах одного из главных проектов IBM используется Prolog. Конечно, этот проект нельзя назвать полностью основанным на Prolog, как TerminusDB, но в Watson используются возможности этого языка. Может, вы знаете об этом, может — нет, но Watson создавался как помощник для экспертов, предназначенный для упрощения нахождения определённых данных или для поиска ответов на простые вопросы. Все заговорили о Watson после того, как эта система победила чемпионов телешоу «Jeopardy!». Команда IBM использовала Prolog для разбора текстов на естественном языке и для перевода вопросов, задаваемых людьми, в форму, понятную Watson.
- GeneXus. Эта low-code-платформа применяет Prolog для трансформации описаний нужного функционала в код приложений. Речь идёт о том, что программа сама пишет программы. Эта платформа поддерживает множество языков программирования, в частности — Java, Ruby, C#, Objective-C.
Как видите, Prolog используется во многих ситуациях. Он, являясь лишь небольшой частью неких систем, сильно помогает решать очень сложные задачи.
Кстати, если поискать по слову «prolog» на GitHub, можно найти около 7000 репозиториев, в описании которых Prolog назван одним из используемых в них языков. Это позволяет сделать вывод о том, что многие пытаются писать на Prolog. Проблема тут, по моему мнению, в том, что многие из тех, кто пробовал Prolog, не довели свои проекты до состояния коммерчески успешных и широко известных (или хотя бы просто «известных») продуктов.
Итоги
Давайте вернёмся к тому, с чего мы начинали. Действительно ли Prolog — это язык, который учат только для того чтобы тут же забыть?
Я совершенно уверен, что это не так. Prolog — это отличный мощный инструмент. Поэтому для того чтобы продуктивно им пользоваться нужно запастись определённым объёмом знаний. А к этому стремятся далеко не все программисты. Писать на этом языке — значит поменять взгляд на решение задач, выйти из привычной сферы ООП и попасть в мир декларативного программирования. Но если так и сделать, если дать этому языку шанс, он может стать одним из самых любимых инструментов того, кто его освоит. Prolog, учитывая ограниченное количество областей, в которых он применяется, способен сильно повлиять на карьеру того, кто знает этот язык.
Лично у меня никогда не возникало возможности использовать Prolog в своей обычной работе. Но я вижу потенциал этого языка, вижу как много задач можно, при правильном подходе, решить с его помощью. Подобных задач, на самом деле, так много, что я время от времени с интересом поглядываю на этот язык.
Что вы думаете о Prolog? Пользовались ли вы им? Собираетесь ли попробовать этот язык?
Автор: ru_vds