Подтвердить что ты не робот

Почему логическое программирование не попало?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

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

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

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

Ответ 13

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

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