Почему логическое программирование не завоевало популярность? [закрыто]

StackOverflow https://stackoverflow.com/questions/630007

Вопрос

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

В этой теме создается впечатление, что Было достигнуто согласие о том, что логическое программирование полезно, но должно быть доказано как таковое. Есть ли причина, по которой он не считается полезным?

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

Чтобы привести пример более того, о чем я говорю, рассмотрите список пониманий / карту / фильтр в Python. На них явно влияют функциональные языки. Почему языки, такие как Python, также не воспринимают такого рода вещи из языков логического программирования, как если бы они имели функциональные языки?

Это было полезно?

Решение

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

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

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

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

Оценка полезности технологии (конкретного языка программирования, конкретного программного инструмента / приложения) - это не просто оценка фактического уровня использования, а скорее ее влияние.

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

Другие советы

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

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

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

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

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

Язык, который мы выбрали для нашего " Конфигуратора " был RuleWorks DEC, который является усовершенствованием более широко известного языка OPS5. Это механизм вывода, основанный на Алгоритм повторов , который делает его гораздо более эффективным, чем процедурный подход.

Так как DEC был поглощен Compaq, который был поглощен HP, RuleWorks стал открытым исходным кодом, и его можно получить с этого веб-сайта. страница .

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

Недавно я использовал кучу логического программирования в исследовательском проекте по разработке игрового дизайна ( тизерное видео !), но по крайней мере половина моего логичного проекта была функциональным или обязательным кодом Scala, реализующим базовый игровой движок. Смысл программирования , если я могу заявить об этом, заключается в том, чтобы дать машине понимание того, что вы хотите, синхронизировать с вашим собственным , и большая часть синхронизации - это < em> требует указать императив на каком-то уровне, как вы хотите, чтобы что-то было сделано. Эти глупые машины всегда такие буквальные ...

Логическое программирование, будь то традиционные, дедуктивные, в стиле пролога, или более экзотическое программирование с индуктивной логикой или наборы программ ответов на вопросы, дает огромный рычаг для решения некоторых проблем за счет возможности легко сообщать об императиве знания (которые всегда нужны где-то в реальных приложениях). Иногда проблемы, связанные с интерактивным приложением, делают неприемлемыми даже малейшие потери вашей производительности в выражении императивных знаний. Написание всего игрового движка в стиле логического программирования всегда будет плохой идеей (аналогично тому, чтобы попробовать его, используя совместимые с perl регулярные выражения, которые имеют одинаковую вычислительную мощность). На гибридном языке (или на том, который позволяет легко встраивать логический интерпретатор) вы можете получить лучшее из обоих миров (я использовал jTrolog для встраивания Пролога в мой движок Scala, образуя своего рода мультипарадигмальный вольтрон).

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

Мое впечатление от простого Пролога состоит в том, что это игрушечный язык. Это не значит, что логическое программирование не может быть полезным. Например, в Twelf можно довольно легко объявить семантику для простого языка программирования, и объявления будут действовать как переводчик. Я также слышал кое-что хорошее о & # 955; Prolog .

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

Редактировать: есть одна идея, которую я хотел попробовать в течение некоторого времени: передать реляционную базу данных в Prolog в виде атомов и использовать ее для выполнения запросов вместо SQL. Я чувствую, что это было бы большим улучшением по сравнению с SQL.

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

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

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

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

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

В обычной логике вполне разумно доказать предположение, опровергнув его отрицание, которое называется «reductio ad absurdum». (Да, есть люди, которые пытались восстановить математику, не используя ее, но это становится немного эзотерическим.) Это просто не работает в Прологе, так как нет никакого различия между доказанным ложным и ничем не доказанным.

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

Невозможно иметь настоящий язык, основанный на логике, где программист может писать вещи и действительно полагаться на результаты. Исчисление предикатов первого порядка (т. Е. Логика с переменными, функции «истина или ложь», «и», «или», «не», «для всех» и «существует») положительно неразрешимо , (Есть причины, по которым мы продолжаем наливать кофе в математиков, а не генерировать все возможные теоремы, в конце концов.) У программиста нет возможности узнать априори, будет ли данное предложение доказано или нет, даже если программист уже знает это быть правдой или ложью.

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

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

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

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

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

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

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

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

Кстати, мне всегда нравилось, что ответ Пролога почти на все - «нет».

Тот факт, что вы начинаете использовать Prolog в своем классе AI , должен быть подсказкой. ИИ тоже не прижился.

Я помню, как в 80-х годах профессор призывал продемонстрировать значительное использование ИИ (хорошо, «издевательство» было бы более точным термином, но тогда я был моложе). Тогда он не мог этого сделать, и сегодня, я подозреваю, он обучает примерно 1/10 заявкам на ИИ, которыми он тогда бредил.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top