company_banner

Слышали о языке Prolog?

Автор оригинала: Слышали о языке Prolog?
  • Перевод
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? Пользовались ли вы им? Собираетесь ли попробовать этот язык?



RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Комментарии 121

    +7
    Можно отсеивать студентов кто на 4 курсе не может перевернуть список на Прологе
      0
      Все проще, можно отсеивать студентов, кто не может написать Hello World без синтаксических ошибок.
      –6

      Можно ли на прологе реализовать четырёхзначную логику?

        0

        Можно, только надо объявить все 4 состояния и логические отношения для них.

          –1

          Имеется ввиду таблицы истинности описать? А как описать выражения типа "если из А следует Б, то из В следует Г"?

            +1

            А зачем 4 состояния для этого?
            (А->Б)->(В->Г), где "->" — это импликация. "А->Б" — это "(не А) или Б".
            Разворачиваем:
            (А->Б)->(В->Г) =
            (не ((не А) или Б)) или ((не В) или Г) =
            A и не Б или не В или Г
            >_<

              –2

              4 состояния не для этого.
              Вы говорите про материальную импликацию, которая по сути и не импликация вовсе.
              Но вопрос был в том, как импликация описывается на прогологе. Про десять типов стрелок в математикие и так всё ясно.

                –1

                Правильно ли я понял, что импликация на прологе не представима?

                  0
                  Представима:
                  implication(X) :-
                  (X = a ->
                  write('Argument a received.'), nl
                  ; X = b ->
                  write('Argument b received.'), nl
                  ;
                  write('Received unknown argument.'), nl
                  ).


                  В документации есть ещё такое.
                    0

                    Что-то я не понял этот код. Как спросить пролог "следует ли Б из А"?

                      0
                      Мне кажется, вам лучше прочесть короткое введение в пролог, тогда вопросы отпадут. Вот например годное.
                        0

                        Неужели это такой сложный вопрос, что на него нельзя просто ответить, не посылая в маны? Там нет ничего про стрелки.

                          0
                          Ok. Грубо говоря ":-" уже и есть импликация. Вам парой комментов выше Akon32 уже достаточно понятный пример привёл, если после этого непонятно, то следовательно лучше прочесть краткий мануал, благо там чтения минут на 10.
                          Плюс ещё есть отдельный оператор для импликации #==>
                          Вот серьёзно, всё это элементарно и есть в доках, кмк если бы вам и вправду было бы интересно, вы бы уже и сами загуглили и прочитали по ссылкам выше.
                            0

                            Вот, смотрите, я пишу:


                            is_my( Part ) :- part_of( Part, Whole ), is_my( Whole ).
                            part_of( window, house ).

                            Такой вопрос выдаёт синтаксическую ошибку:


                            ?- is_my( house ) #==> is_my( window ).

                            Такой выдаёт false:


                            ?- is_my( house ) -> is_my( window ).

                            Как мне получить true?

                              0
                              :- use_module(library(clpfd)).
                              И тогда получите:
                              ?- 0 #==> 1.
                              true.
                              ?- 1 #==> 0.
                              false.
                              Ну а is_my( house ) #==> is_my( window ) в принципе не сработает в том виде, как в описали предикаты выше.

                                0

                                Что-то я не улавливаю смысл такой стрелки работающей лишь с константами.
                                Что не так с моими предикатами?

                                  0
                                  У вас они всегда False возвращают.
                                  Смотрите:
                                  is_my( Part ) :- part_of( Part, Whole ), is_my( Whole ).
                                  part_of( window, house ).

                                  Вызываете первый раз is_my (house).
                                  Пролог передаёт значение hause переменной Part, после чего переходит в предикат part_off, видит, что на первом месте для true должно быть Window и возвращает false.
                                  Просто повызывайте свои предикаты с дебагом и сразу увидите все подобные места

                                  К слову, вот такое вот поведение я считаю большим минусом пролога, т.к. подобные ошибки зачастую неочевидны (у вас ещё простой пример, но я видел достаточно большие проекты, где из-за одного пропущенного предиката всегда был непраивльный результат).
                                    0

                                    Я не нашёл на свише дебага. Всё там правильно с предикатами:


                                    is_my( house ).
                                    is_my( Part ) :- part_of( Part, Whole ), is_my( Whole ).
                                    part_of( window, house ).
                                    ?- is_my( window ). % true

                                    Как спросить пролог "следует ли, что окно моё, из того, что дом мой?".

        +18
        Проблема пролога фундаментальна. NP != P. И всякие каты, подшаманивания с перестановками условий и прочие пляски с бубном это не решают.

        Хотя с другой стороны, может на квантовых компах он и взлетит…
          +25
          Проблема пролога фундаментальна. NP != P.
          Чем докажете?
            +4

            Квантовые компьютеры не решают NP задачи за полиномиальное время.

              0

              Вы ходите по очень горячим углям! Проблема перебора до сих пор не решена.
              Тем более заявление:


              Квантовые компьютеры не решают NP задачи за полиномиальное время.

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

                +1

                Квантовые компьютеры могут ускорять задачи, которые можно представить так, чтобы сумма амплитуд по всем "путям вычисления" давала конструктивную интерференцию для правильного ответа. Да, не доказано, что такой класс задач не включает NP. Но специалисты практически не рассчитывают на то, что NP=BQP (Bounded error Quantum Polynomial time). У Скотта Ааронсона есть более-менее популярные статьи на эту тему.

                  0

                  Но квантовые компьютеры — это система, а у любой системы есть ограничения. Вопрос ведь именно в принципиальной эквивалентности.

              –1
              Не из этой оперы, Пролог, как и все general purpose ЯП — Turing полон.
                –3
                Я чёта не уверен на счёт Тьюринг полноты. Для Пролога совершенно точно существуют задачи, которые он не может в отличии от машины тьюринга решить за конечно время.
                  +2
                  Это фактически общеизвестный факт — prolog — это логика первого порядка и выполнимость над ней Тьюринг полна, существуют прямые имплементации универсальной машины Тьюринга на прологе в swi чуть ли не в стандартных пакетах идет:

                  www.swi-prolog.org/pack/file_details/turing/prolog/turing.pl?show=src

                  Стоит отменить, факт настолько известен, что он даже в Википедии идет в графе Тьюринг полнота пролога:
                  en.wikipedia.org/wiki/Prolog#Turing_completeness

                  Это сразу отвечает людям, которые несут чушь про NP-полноту.

                  > Для Пролога совершенно точно существуют задачи, которые он не может в отличии от машины тьюринга решить за конечно время.

                  Да, это вообще не оттуда — Тьюринг полна говорит о том, может ли язык программирования симулировать универсальную машину Тьюрига — причем тут вообще конечное время и «решить»?

                  Я уже не говорю, что пролог напрямую прямо синтаксиса оперирует логикой первого порядка, для выводимости из которой справедлива теорема о Геделя о неполноте => откуда следует проблема останова и здесь никаких NP и конечного времени
                  www.quora.com/Is-there-any-relation-between-halting-problem-and-Godels-incompleteness-theorems

                  Так что с удовольствием посмотрю на эти «совершенно точно существующие задачи, которые пролог не может в отличии от машины тьюринга решить за конечно время.»
                    –3
                    Так что с удовольствием посмотрю на эти «совершенно точно существующие задачи, которые пролог не может в отличии от машины тьюринга решить за конечно время.»

                    Вы кажется ничего не поняли. Вернее я неудачно сформулировал. Конечно на прологе можно написать интерпритатор машины тьюринга, на которой уже в свою очередь написать что угодно. Но при этом за выполнимостью того что вы напишите на машине тьюринга вы будете следить сами по правилам машины тьюринга. Если же вы ту же самую задачу успешно решённую вами на Тьюринг машине сформулируете как набор правил для Пролога, то запросто можете улететь в бесконечную рекурсию из-за неправильного порядка строк, и в прологе, особенно в не совсем уж тривиальных случаях, правильный порядок или не очевиден, или может вообще не существовать. Например если для того чтобы найти ответ нужно применить сначала правило A, потом Б и потом снова А, и применение не того правила посылает вас в рекурсию, то правильного порядка вообще не существует. Пролог не сможет решить задачу без переформулирования одного из правил.

                    Таких примеров тьма, если погуглить «Пролог рекурсия».
                      +2
                      > Если же вы ту же самую задачу успешно решённую вами на Тьюринг машине сформулируете как набор правил для Пролога, то запросто можете улететь в бесконечную рекурсию из-за неправильного порядка строк

                      Еще раз: вы описали правилами пролога описание машины Тьюринга. Всё. Ни за чем не нужно больше следить.

                      Дали описание новой задачи для машины тьюринга, пролог ее выполнит **в точности** как это сделает машина тьюринга. Если машина улетает в рекурсию, то и пролог улетает. Если машине не улета, то пролог не улетает.
                        –6

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


                        Но очевидно Вы не понимаете в чём разница между тем, что тьюринг-машину программируете вы, и Прорлог программирует за вас, но со всеми задачами программирования справляется.


                        Поздравляю вас с победой в споре.

                          +1
                          Отлично, вместо предметной технической дискуссии о сложности языков программирования и грамотной аргументации — переход на личности.
                            –5
                            А я не хочу опускаться до вашего уровня дискуссии. Я просто оставлю это здесь.
                            https://ru.wikipedia.org/wiki/Декларативное_программирование ->> «Чисто декларативные» компьютерные языки зачастую неполны по Тьюрингу — так как теоретически не всегда возможно порождение исполняемого кода по декларативному описанию. Это иногда приводит к спорам о корректности термина «декларативное программирование» (менее спорным является «декларативное описание решения» или, что то же самое, «декларативное описание задачи»).

                            Вы же конечно сами понимаете понимаете в чём таком важном, Prolog не является декларативным, раз так блистательно передискутировали меня. Такому умному и несомненно во всём абсолютно правому человеку мне нечего сказать. Наверное и эту статью в Википедии тоже вы писали. :)))
                              0

                              "такому уровню дискуссии" – это какому?


                              Здесь нет никаких противоречий, это ссылка на обсуждение термина "декларативное программирование".


                              Пролог не является декларативным языком по целому ряду причин: это определения через операционную семантику – как например фиксированный порядок выполнения правил сверху вниз, и оператор "cut". Вы меняете порядок правил и меняется результат работы.


                              Такого не происходит в декларативных таких как Datalog, Answer Set Programming, Minizinc или классический SQL.


                              Но опять же это вопрос в целом ортогональный обсуждению выразимости языков.


                              И я не вижу каким образом авторство статьи на Википедии является критерием истинности.

                                –5
                                «такому уровню дискуссии» – это какому?

                                Это к такому, когда человек знает что такое проблема останова, но при этом делает вид, что не понимает взаимосвязи между словами «решить» и «за конечное время».

                                Давайте я в последний раз попытаюсь пробудить в вас мысль вместо цитирования:
                                «Существуют такие декларации задач средствами пролога, которые имеют решение, но пролог не может этого решения найти в силу свойственных ему ограничений, которые вы нагуглили для прошлого коммента. И программист используя имеющиеся у него математические знания, в отличии от Пролога, может преобразовать эти задачи в другую форму, которую можно запустить на симулируемой Прологом тьюринг-машине и таки успешно решить. Или даже просто преобразовать в другую форму, в которой пролог её решить сможет».

                                Вы вроде как делаете вид, что умны. Если и сейчас до вас не допёрло о чём я, см.мой предпоследний коммент. Надеюсь когда-нибудь вы сумеете выйти из этого цикла.
                                  +1
                                  Вы утверждаете, что они существуют — в чем проблема, приведите ясный, понятный и убедительный пример.
                                    –2
                                    Ну убедительный пример я привести не в силах, просто потому что процесс убеждения требует интеллектуального усилия с обоих сторон. Но ясный и понятный запросто:
                                    ints(0).
                                    ints(A) :- ints(B), A is B - 1.
                                    ints(A) :- ints(B), A is B + 2.
                                    ?- ints(1).

                                    Ответ очевиден — true. Любой программист может его получить преобразовав формулировки задачи в другие тождественные, но ни при каком порядке строк сам Prolog ответ найти не сможет, потому что чтобы ответ найти нужно проверять условия в меняющемся порядке.

                                    Я даже как-то в растерянности, куда уж проще то? Я же четыремя комментами выше это описал.
                                      +4
                                      > Любой программист может его получить преобразовав формулировки задачи в другие тождественные
                                      Если они тождественные, то ответ не может меняться — иначе они не тождественные.

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

                                      > Ответ очевиден — true.
                                      «очевидно» — это не формальное утверждение. Очевидно, что гипотеза Римана верна — норм доказательство?

                                      Фактически, вы сделали следующее:

                                      написали некорректную программу, а потом сказали, что ее можно исправить — вопрос какое это отношение имеет к дискуссии в выразимости языка Пролог и его Тьюринг полноте?
                                        –5

                                        Я:

                                        Существуют такие декларации задач

                                        Вы:
                                        Вы привели пример программы, которая зацикливается

                                        Если вы не пытаетесть схранить лицо вопреки очевидному, а всерьёз не понимаете разницы, то это плохо.
                                        Цикл замкнулся.

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

                                        +3
                                        Но ясный и понятный запросто:
                                        ints(0).
                                        ints(A) :- ints(B), A is B — 1.
                                        ints(A) :- ints(B), A is B + 2.
                                        ?- ints(1).
                                        Ответ очевиден — true.

                                        Вы интерпретируете эти выражения иначе, чем пролог-система. Для вас ответ очевиден, потому что вы думаете не на прологе, но компилятор руководствуется правилами пролога, и у него в полном соответствии с этими правилами получается бесконечная рекурсия. Для интерпретатора какого-нибудь JS тоже можно программу с багами написать и думать, что она должна работать.

                                          0
                                          Проблема не в том что
                                          Для интерпретатора какого-нибудь JS тоже можно программу с багами написать

                                          Проблема в том, что написать на prolog-е программу которая НЕ попадет в рекурсию и будет выполняться за приемлемое время — гораздо более нетривиальная задача, чем написать программу на JS в которой не будет критичных багов.

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

                                          и чтобы оно при этом все-же работало.
                                            +1
                                            Проблема в том, что написать на prolog-е программу которая НЕ попадет в рекурсию и будет выполняться за приемлемое время — гораздо более нетривиальная задача, чем написать программу на JS в которой не будет критичных багов.

                                            Быть может, если знать пролог лучше, задача становится менее нетривиальной? (я не могу ответить на этот вопрос, т.к. очень плохо понимаю пролог).

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

                                            Смысл в разнице между декларацией задачи и программой.
                                            +1

                                            А можете расшифровать что этот код описывает?


                                            А является целым, если существует предыдущее целое или существует целое на 2 большее? Почему именно на 2?

                                              0
                                              0 — целое.
                                              А целое если следующее целое.
                                              A целое если число на 2 меньше целое.

                                              Такое определение покрывает все целые числа. На 2, потому что в такой формулировке Prolog не справляется с рекурсией при любом порядке строк.
                                              Чтобы ответить на вопрос про число 1 утвердительно нужно сначала применить первое правило, и выяснить, что 1 целое если и 2 тоже целое. А потом применить второе правило и понять, что 1 целое если целое — 0. Ну или в обратном порядке. Но пролог всегда умеет применять правила только в одном порядке. Если всегда начинать с первого, то начинать с первого и здравствуй бесконечная рекурсия. Если поменять правила местами он перепрыгнет число ноль, и ускачет в другую сторону применяя только правило 2.
                                                0

                                                То есть он использует поиск в глубину, тогда как тут уместней использовать поиск в ширину.

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

                                                    С другой стороны поиск в глубину легко уходит в бесконечность. В этом случае необходимо отсечение через доказательство неостановимости по индукции.

                      –1
                      А вот тут есть маленький, но страшно важный фокус. Дело в том, что у нормального логического мышления точно те же самые проблемы, что и у пролога. И это обнаружили ещё древние греки. Всякие парадоксы Зенона и парадоксы об Ахилесе и черепахе — они ровно про это.

                      Человек справляется с этим двумя способами:
                      1) Наличие понятий, имеющих априорную оценку, в которые может упереться рекурсия. Понятно, что из-за неполноты и неточности таких оценок могут возникать противоречия. И тогда случается «когнитивный диссонанс», разрешающийся через отдельные механизмы.
                      2) Наличие эвристик.

                      Вполне возможно, что будущее логического ИИ как раз и лежит в области прололг-подобных систем, снабжённых нейросетевыми эвристиками. Потому что на нейросети строгую логику организовать можно, но очень сложно, и прямое программирование справляется с этой задачей на много лучше, а сложные эвристики уровня АльфаГо наоборот на много лучше удаются нейросетям.
                      +3
                      Давным-давно в универе был курс Пролога. Сначала трудно перестроиться из императивного на мышление предикатами. Потом начинает получаться и кажется, что у тебя новый супермощный инструмент, почти волшебный по сравнению с императивными языками. Правда, дальше лабораторных работ дело не пошло.
                        +1
                        В институте был курс Пролога, очень понравилось, хотелось ещё, но куда применить не придумал.
                          +3

                          Отличная статья. Пролог действительно интересен. Как кто то уже выше писал — проблема в том что не все типы запросов можно выполнить за разумное время. Вероятно с ростом мощности желена и новыми алгоритмами мы получим большие возможности для декларативных языков в том числе и Prolog — ведь один уже смог взойти на пьедестал, это SQL.)
                          p.s.
                          Сам буквально недавно думал над возможностью применить систему работающую с Datalog, искал решения.

                            +2
                            SQL взошел на пьедестал в силу своей предметной специфичности (реляционные БД), в которых он, по сути, монополист. Поэтому с Прологом у них изначально разные весовые категории:)
                            +14
                            У меня о прологе (двадцатилетней или тридцатилетней давности — расцвет его) осталось одно впечатление — язык, способный бесконечно выполняться и занимать бесконечную память на программе размером в десяток строк, и поэтому неприменимый для задач сложнее поиска магических чисел.
                              0

                              Вполне применим, просто вопрос в задачах которые перед ним ставите.

                                –1

                                Это ведь не совсем Prolog, просто подход похожий (логическое программирование):


                                After lowering to logical predicates, Chalk then deploys a logical solver to find the answer to the original query; this solver is similar to a Prolog engine, though different in its particular

                                (отсюда)


                                Так можно и python фортраном назвать.

                              +3
                              Статья интересная в первую очередь постановкой вопроса. Ведь от вопроса «Слышали о языке Prolog?» один шаг до вопроса «Слышали о логическом программировании?», а дальше пара шагов до вопросов «Слышали о математической логике?» и «Слышали о реляционной теории?». На мой взгляд даже небольшой опыт работы с Prolog или Datalog сильно облегчает жизнь при работе с большинством мейнстримовых языков/фреймворков для работы с запросами к данным — SQL, LINQ, JPQL, GraphQL, да даже всяческие stream в Java и прочие *QL. Я уже не говорю о том, что работа с логическим выводом, цепочками рассуждений, продукционными системами многими вообще забыта. Помню, что в институте частенько слышал утверждение, что «Prolog — язык искусственного интеллекта», а в этом году слышал от членов жюри одного известного конкурса на гранты что «Если у вас нет нейросетей, а всего лишь какой-то набор формул (система продукционных правил), то о каком искусственном интеллекте вы говорите, ха-ха»
                                0
                                «Prolog — язык искусственного интеллекта» — это было уже очень старо даже тогда, когда я его в институте проходил в начале 90-х.

                                Собственно это скорее 70-х готов всплеск интереса к ИИ и породил пролог (он не много не мало мой ровесник :)
                                Но там же был и Lisp. Кстати простейший интерпритатор пролога на Lisp пишется в десяток строк.
                                  +3

                                  Prolog — язык "искусственного интеллекта" 1980х. Как и лисп — немногим ранее. Но тогда точно не взлетело. А надежды были.
                                  А нейросети, — наверно, — "искусственный интеллект" 2010х. И, насколько я могу судить, этот подход (на данный момент) более успешен, чем пролог.

                                    +3
                                    Нейронки и Пролог — это разные подходы к созданию ИИ. Задача то так стоит. Разные не значит взаимоисключающие. Нейронки — восходящая парадигма — моделирование
                                    интеллектуального поведения на основе биологических элементов. Пролог — нисходящая парадигма — символьные вычисления имитирующие высокоуровневые психические процессы: мышление, рассуждение, речь, эмоции, творчество и т. д.
                                    Подходы к пониманию проблемы
                                      +1

                                      Согласен — не взаимоисключющие. Мне кажется сильный ИИ как раз и будет строится на умелом сочетании символьного вычисления и нейронных сетей.

                                        0
                                        Мне кажется сильный ИИ как раз и будет строится на умелом сочетании символьного вычисления и нейронных сетей.

                                        Может, но не факт. Пролог сейчас где-то на свалке истории. Скорее всплывёт что-то третье, чем старый никому сейчас не нужный пролог.
                                        Но опять же, использование нейронных сетей сейчас — всегда соединение обучаемых частей (нейронок) и рукотворных алгоритмов.

                                          +1
                                          Пролог например был использован в IBM Watson совместно с нейронками. Хорошая такая свалка истории…

                                          Он как раз на роли ваших «рукотворных алгоритмов» и используется.
                                    0
                                    Старое — не значит плохое. Я привел пример, чтобы подчеркнуть тенденцию к тому, что в массовом сознании возникает эквивалентность понятий ИИ и нейросетей. Конечно, с увеличением мощностей и количества данных нейросети получили колоссальное развитие. Однако, не располагаю информацией о больших успехах нейросетей в областях, в которых требуется обоснованный вывод или приведение цепочки рассуждений, приведших к результату.
                                      0
                                      Ну вроде как Watson что-то подобное может… но кстати в нем не только нейронные сети там отделенные компоненты и на прологе есть.
                                  –35
                                  Я учил его пару уроков в универе и все что я понял — в этом языке нет логики, и программировать на нем могут только шизофреники и женщины. Препод который нам его преподавала (женщина), это подтвердила…
                                    +12

                                    Вы целенаправленно движитесь к ачивке "тролль"? :)

                                    +3
                                    кто-нибудь знает как он соотносится с солверами, minizinc и прочим таким?
                                      +1
                                      А вы могли бы какой-нибудь неплохой солвер уловно на «поиграться» порекомендовать (в идеале хочу, чтобы в моём арсенале был инструмент «по-быстрому решить какую-нибудь задачку с ограничениями, при этом достаточно современный).

                                      ПС
                                      По вашему вопросу: я вполне понимаю почему я не хочу пролог — они зафиксировали порядок перебора (ну типа чтобы сделать ЯП „взрослым“ — детерминированно работающим в разных реализациях).
                                      Только в этом и проблема — в случае NP задач надо настолько глубоко вдаваться во внутренние детали работы пролога, что проще то же самое на условном С \ Java написать чем „оптимизировать“ пролог.
                                        0

                                        А Z3 и CVC4 не устроили?

                                          0
                                          У меня именно что «глаза разбегаются» всё подряд пробовать.

                                          Если рекомендуете — спасибо, посмотрю.
                                            0

                                            Не то что рекомендую, сам не особо разбираюсь, просто они вроде самые популярные, особенно z3.

                                          +1
                                          Как вариант можно начать вот с этого тьюториала:
                                          www.cs.uni-potsdam.de/~torsten/Potassco/Tutorials/fmcad12.pdf
                                            0
                                            В качестве видеоряда, сопровождающего лекцию, наверное можно, но сами по себе эти 400+ слайдов — малоинформативное начало IMHO.
                                            +1
                                            мы используем OR Tools от Google, но их много разных по устройству и области применения
                                            0
                                            Да, скорее он соотносится с Answer Set Programming. Пролог — это general purpose programming language, а минизинк специфичен для комбинаторных задач и задач комбинаторной оптимизации.
                                            +1
                                            У пролога есть подмножество — Datalog, вот он более-менее активно применяется, как язык запросов к графовым СУБД.
                                              +10

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


                                              Prolog применён в Gerrit для управления требованиями по заданию оценок и выставлению требований к допуску ревью. Я его там настраивал и, по-моему, лучше бы они взяли что угодно другое: хоть Фокал или Javascript, хоть Scheme или Haskell… Дело даже не в том, что 99% админов не знают язык — я вроде знаю, но я чуть не поседел, пытаясь понять, по какому принципу он на каком этапе останавливает преобразование выражения, и от какой фазы какого небесного тела зависит, где остановится свёртка.

                                                +1
                                                Почти любой программист использует одну специфическую версию Пролога с изменённым синтаксисом: она называется make.
                                                При этом в наше время «руками» Makefile'ы пишут все реже и реже, вместо этого используя генераторы (cmake, qmake, autotools, etc.), а то и вовсе отказываясь от make в пользу ninja и других билд-систем…
                                                  0
                                                  я вроде знаю, но я чуть не поседел, пытаясь понять, по какому принципу он на каком этапе останавливает преобразование выражения, и от какой фазы какого небесного тела зависит, где остановится свёртка.

                                                  ИИ (методы) не может быть прямолинейным.
                                                  0

                                                  сейчас вспоминаю со смехом конечно, но когда я начал свой самостоятельный путь изучения программирования, то купил книгу по prolog и попытался понять для чего это надо )) сейчас понимаю как я мог бы это использовать на одном из текущих проектов (автоматическое составление юридических документов), но сразу подумал о производительности и поддержке… и понял что со временем стал думать в сторону "кто будет работать с этим проектом после меня" в большей степени чем "как мне удобнее это написать"… вот тут наверное причина того что на некоторых языках мало пишут, хоть у них и хорошие казалось бы перспективы

                                                    0
                                                    Курсач в студенчестве делал — реализацию Prolog на Delphi.
                                                    Книжку толстую крутую давали по нюансам реализаций пролога, название не вспомню.
                                                    Тема неплохо зашла, ханойские башни и прочие примерчики решались, компилировалось в «шитый» x86-код, вот только реализацию GC не осилил (курсач и так приняли), прога работала до переполнения кучи.
                                                    Мечталось ещё реализовать кроме бинарной логики предикатов {0, 1} ещё и «вероятностную» (0..1) и соответствующе допилить механизм логического вывода, было бы что-то вроде Fuzzy Logic Prolog :-)
                                                      +1
                                                      То же делал реализацию Пролог`а на Delphi, у меня диплом был. Работал даже шустрее чем Turbo Prolog.
                                                      +2
                                                      У меня в университете был курс по Prolog, действительно позволяет встряхнуть мозг и по-другому посмотреть на разработку. На протяжении всего курса я решил на нем довольно большое количество задач и даже написал экспертную систему в качестве курсовой. Однако за эти 5 месяцев плотной работы с прологом я так и не понял как эта штука устроена. В императивных языках я понимаю, что на условный массив выделяется последовательная память и указатель, а все операции с массивом — это работа с этой памятью и указателем, который я могу передвигать. Я могу прогнозировать асимптотику и ошибки, понимать где слабые места и что можно оптимизировать. В случае с прологом я не понимаю вообще ничего, задачи решаются, но как — ответить я не могу. Порог вход в понимание этого языка в разы больше, а бизнесу надо решать задачи сейчас, а лучше вчера. Мне кажется, именно по этой причине он не вошел в массы, хоть раньше и считался серебряной пулей для разработки ПО.

                                                      Однако я слышал, что вроде бы в EPAM-е есть какие-то проекты, где используется какая-то технология, похожая на пролог. Возможно, он немного эволюционировал и занял очень маленькую нишу. Для некоторых задач он действительно хорош.
                                                        +1
                                                        Ответ на вопрос «как?» на самом деле очень простой: «полным перебором всех возможных состояний решений». Но поскольку совем полный перебор занял бы слишком большое время, то начинаются пляски с бубном…
                                                          0
                                                          На пролог рассказывали после LISP-а и голову ломать как оно там внутре нам уже не приходилось бо пролог часто под собой lisp использует. Где-то даже нам показывали транслятор пролога на Lisp-е написанный — там буквально десяток строк текста.
                                                            –1
                                                            Пролог-код достаточно просто переписать в C# .NET используя yield оператор, по сути каждый предикат будет обозначать цикл.
                                                            Да и сам оператор yield показывают всю суть lazy вычислений, так сказать наследие Пролога.
                                                            +1
                                                            Делал курсовую в универе — экспертную систему на Prolog для прогнозирования цен на нефть. Очень интересный язык, заставивший мозг напрячься и перестроиться с привычного паскаля. К сожалению, за пределами универа больше с ним не сталкивался.
                                                              0
                                                              Писал на swi prolog кучу всего: начиная с веб-сайта для друга, которому нужен был сайт-визитка, а у меня была куча свободного времени в универе или скрипты на swi-prolog на отдельном сервере для демонстраций, что swi-prolog вполне себе подходит для этого, заканчивая большими нейронными сетями, которые пишутся гораздо быстрее чем на питоне, хотя сейчас уже не так — слишком много уже сделали в среде питона.
                                                                +3
                                                                Зачем нужен Prolog, когда есть Lisp?!
                                                                <:o)
                                                                  +1
                                                                  LISP это заготовка из которой пролог делается. Пролог все-таки более высокого уровня абстракциями оперирует.
                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                    +1
                                                                    В студенческие годы нужно было сдавать экзамен с решением задачек на Prolog, а логику того, как оно работает понять не особо получалось… Спасло ситуацию то, что у предлагаемой IDE интерфейс уж очень напоминал компоненты Delphi, которой тогда увлекался — за ночь набросал похожее окно с парой работающих кнопок, парсингом введённых условий и решением задач на «логичной» логике для всех билетов.
                                                                    Успеваемость студентов по Prolog в том семестре была рекордной :)
                                                                      +1
                                                                      А чем Пролог отличается от Лиспа и Scheme?
                                                                        0
                                                                        Они функциональные же. Разве это не другая парадигма?
                                                                        0

                                                                        Пролог используется в банковских системах некоторых для оценки рисков. У нас даже менеджеры для него правила писали. Но конечно мозг ломает.

                                                                          0
                                                                          Из 2020 в будущее:
                                                                          Большие данные храним и обрабатываем. С нейронками разобрались. Но! Символьные вычисления осваивают единицы. Реализация нисходящей парадигмы реализации ИИ под угрозой.
                                                                          Подходы к пониманию проблемы
                                                                          Пролог помог?
                                                                            0
                                                                            Для меня это самый лучший язык. Много на нем писал все что можно. Отлично подходит для всего, почему-то все упирают на то что он для каких-то логических задач. Ну да на нем легко решать задачки про Волка-Козу-Капусту, но писать сайты то же очень даже не плохо.
                                                                              0
                                                                              А опердень можно?
                                                                                0
                                                                                И опердень можно. Когда в банке работал, баловался с оперднями.
                                                                              0

                                                                              Фронтендеры тоже вспомнили про пролог.


                                                                              https://next.yarnpkg.com/features/constraints

                                                                                +6

                                                                                Либретто статьи:


                                                                                бубубу пролог незаслуженно забыт
                                                                                бубубу
                                                                                "hello world"
                                                                                бубубу
                                                                                примеры продакшена — ссылка раз, ссылка два, ссылка три — "как видите, он много где используется"
                                                                                бубубу
                                                                                ИТОГИ: пролог — мощная вещь, а вы пользуетесь прологом?


                                                                                Имхо, это вода и студенческий реферат по философии.

                                                                                  +1
                                                                                  Пролог язык декларативный, на нем очень легко создавать
                                                                                  — DSL (domain specific languages) — очень удобно создавать свои операторы и вкладывать смысл.
                                                                                  — Парсеры (причем не только КС-грамматик, но и контекстно зависимые)
                                                                                  — Универсальный Решатель задачи и доказательство теорем. [Правда теоремы должны выражаться в предикатах-Хорна, иначе задача не-разрешима за P — Проблема P != NP].
                                                                                  — Описывать функторы и операторы: достаточно просто и изящно можно описывать все функции сортировок,
                                                                                  — Автоматическое доказательство и проверка истинности кода (Используется математический аппарат доказательства теорем).

                                                                                  Prolog не императивный язык! Он требует от каждой операции «возвратности»:
                                                                                  — Нельзя сказать прочитай из памяти и запиши в файл (безвозвратно)
                                                                                  — Проитерируйся по списку и на каждой итерации запиши в базу данных рандомное число
                                                                                  — Вызови REST-API 50 раз и замеряй время выполнения

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

                                                                                    Что значит "условно можно", если предикаты редактирования базы фактов — прямо в стандартной библиотеке на видном месте?
                                                                                    Да, это ломает декларативность и чистоту. (Ну так и на сях, напротив, можно чистые функции писать).


                                                                                    Пролог — довольно тупенький в плане интерпретации предикатов.
                                                                                    Предикат записывается в виде дизъюнкции конъюнкций, которая в общем случае должна одинаково работать для любого исходного состояния — какие аргументы свободные, какие связанные (что нам дано и что надо найти). Мы просто бежим вглубь и откатываемся, бежим и откатываемся.
                                                                                    Проблема в том, что для разных "дано/найти" стратегии забега могут и зачастую должны отличаться.
                                                                                    Тут-то вся декларативность и полетит к чертям.
                                                                                    Единственное отличие от си, в таком случае, — что в си бывают goto-макароны, а в основном код выполняется последовательно; а в прологе код выполняется челночно.


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

                                                                                      0
                                                                                      Я бы ещё добавил, что на прологе удобно пишутся всякие основанные на правилах переводчики. При должном наборе словарей можно даже выдавать терпимые переводы.
                                                                                      0
                                                                                      Странно, что вообще не упомянут Erlang
                                                                                        +1
                                                                                        Erlang совсем не декларативный, хотя Джо вдохновился Прологом при создании Эрланг, от Пролога там патернматчинг и синтаксис.
                                                                                          –1
                                                                                          Всего-то синтаксис!?! :)

                                                                                          Понятно, что языки принципиально разные. Но не вызывает ли (какого-нибудь… эээ… как бы это назвать…) удивления (может быть?), что такие разные языки, как весь такой декларативный и логический Prolog и совсем такой недекларативный, недофункциональный, а с акторами еще объектный Erlang внезапно имеют между собой нечто общее? Да синтаксис — и не так уж мало для такой огромной и принципиальной разницы. Не ломает шаблон? Не ставит, например, под сомнение «общепринятое» понятие «декларативности»?
                                                                                            0
                                                                                            Синтаксис он взял из вполне конкретной реализации пролога, Эдинбурский диалект. При чем тут "«общепринятое» понятие «декларативности»" вообще не понял, почему синтаксис какого-то языка должен ставить что-то под сомнение?
                                                                                              0
                                                                                              Да все ведь просто!

                                                                                              Во-первых, я намекал что далеко не все согласны с тем, что «Erlang совсем не декларативный». Например, в русской Wikipedia про Erlang почему-то прямо так русским по белому и пишут: «декларативный язык программирования». Впрочем, английская тоже поместила его в категорию декларативных.

                                                                                              Тем не менее, я как раз соглашусь — вопрос о декларативности Erlang-а очень спорный. Но просто потому, что трактовка термина «декларативный» довольно смутная.

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

                                                                                              …Тем более, что я изначально всего-то лишь хотел обратить внимание, что Prolog в свое время стал источником идей и вдохновения не только в области «чистого» логического программирования. И это можно (а, возможно, и нужно) было отразить в статье. Вдруг кто-нибудь нашел бы это достаточным поводом, чтобы задуматься.

                                                                                              Тем более, что связь между Prolog и Erlang гораздо глубже, чем «просто взяли синтаксис». Не интересно разве, почему это для языка, который был предназначен для создания распределенных систем реального времени вдруг взяли синтаксис медленного и узкоспециализированного логического языка? и почему вдруг erlang-исты заявляют, что «Erlang started life as a modified prolog»? — то есть, не «просто взяли синтаксис», а взяли язык и доработали под другую проблематику! Более того, первый компилятор Erlang был написан именно на Prolog-е.

                                                                                              Вообще, ставить под сомнение бывает полезно. Но нужно ли оно лично вам? Каждый решает сам :)
                                                                                                +2
                                                                                                Мало ли чего на заборах пишут. В Prolog есть логическая машина вывода, в Erlang этого и близко нет. Prolog не медленный, не соглашусь, я на нем много писал, если сайтик делать, он не медленнее будет работать чем на том же PHP.
                                                                                                  –2
                                                                                                  Мало ли чего на заборах пишут. В Prolog есть логическая машина вывода, в Erlang этого и близко нет. Prolog не медленный.
                                                                                                  Ой, прошу прощения! Я не сразу понял, что разговариваю с носителем Абсолютного и Окончательного Правильного Мнения, а ключевой вопрос у нас — наличие машины вывода… :) Все, больше вопросов не имею.
                                                                                        0

                                                                                        Так вот на каком языке Deep Thought считал ответ на "Главный вопрос жизни, вселенной и всего такого"!

                                                                                          +1
                                                                                          Свои пять копеек:
                                                                                          В лохматом 90 году мной был написан проект АСУТП( управление хим производством на ткацкой фабрике ). Проект был написан на borland turboprolog. Некоторые низкоуровненые куски были написаны на borland turboassembler. Проект был принят, оплачен, и использовался — года 3 точно, потом уже не знаю…

                                                                                          доп:
                                                                                          Автору — а еще есть такой язык SmallTalk. Напишите пожалуйста что нибудь о нем. Очень хороший язык. Делал на нем проект в лохматом 1992-1993 гг. Статистический анализ.

                                                                                          Спасибо.
                                                                                            0
                                                                                            Во-первых, Smalltalk. Во-вторых, про него не часто, но время от времени пишут: поиск в руки ;)
                                                                                              –1

                                                                                              А в-третьих, смолток реинкарнировался в руби :)

                                                                                                –3
                                                                                                Тогда уж он «реинкарнировался» не только в Ruby, но и в Java, и в Objective C, и даже в C# и еще много во что… Но нет! Чтобы «реинкарнироваться», надо умереть. А Smalltalk пока не собирается. Только не надо по этому поводу разводить здесь флейм ;)
                                                                                            +3

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


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


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

                                                                                              Вопрос к экспертам Prolog, вдохновлённый примером про magicNumber: какая будет асимптотичекая сложность решения у обобщённой задачи 2-sum?


                                                                                              magicNumber(A[1]).
                                                                                              magicNumber(A[2]).
                                                                                              ...
                                                                                              magicNumber(A[N]).
                                                                                              ?- magicNumber(X), magicNumber(Y), plus(X, Y, target)

                                                                                              Такой же вопрос про 3-sum, 4-sum?

                                                                                                +1
                                                                                                Да обычный перебор, без всякого мозга.
                                                                                                +1
                                                                                                Думаю, будущее логического программирования — в составе распространённых универсальных языков программирования, а не в выделенном для этого Прологе. На заре программирования было модно создавать новый ЯП на каждую новую хотелку и идею, но сейчас больше принято внедрять интересные идеи из других языков в существующие, как было с функциональным программированием, асинхронным, примеров хватает. Основная причина в том, что каждый язык обрастает огромной инфраструктурой для решения прикладных задач, и терять её при разработке нового языка очень недальновидно и сильно затрудняет миграцию.
                                                                                                  +1
                                                                                                  Может быть кому-то интересно: я писал статью о Прологе, цель – как можно проще и понятней объяснить суть и основы языка, с примерами решения задач. Диалект «Пролог-Д», но сути это не меняет. Статья

                                                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                  Самое читаемое