programming-languages - программирование - programming languages rating 2018



Почему логическое программирование не завоевало популярность? (9)

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

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

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

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

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

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


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


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

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

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

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


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

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

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


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

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

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

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

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


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

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

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


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


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

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

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


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

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

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

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

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

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

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

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