Как лучше всего использовать Логическое программирование?

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

Вопрос

Под логическим программированием я подразумеваю субпарадигму декларативных языков программирования.Не путайте этот вопрос с вопросом "Какие проблемы вы можете решить с помощью if-then-else?"

Такой язык, как Prolog, очень увлекателен, и его стоит изучать ради обучения, но я должен задаться вопросом, какой класс реальных проблем лучше всего выражается и решается таким языком.Есть ли языки лучше?Существует ли логическое программирование под другим названием в более модных языках программирования?Является ли циничная версия ответа вариантом Парадокс Python?

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

Решение

прототипирования .

Пролог динамичен и существует уже 50 лет. Компилятор либерален, синтаксис минималистичен и "делает вещи" это легко, весело и эффективно. SWI-Prolog имеет встроенный трассировщик (отладчик!) и даже графический трассировщик . Вы можете изменить код на лету, используя make / 0 , вы можете динамически загружать модули, добавлять несколько строк кода, не выходя из интерпретатора, или редактировать файл, который вы сейчас используете, на лету с помощью edit (1) . Как вы думаете, вы обнаружили проблему с предикатом foobar / 2 ?

?- edit(foobar).

И как только вы выйдете из редактора, эта вещь будет перекомпилирована. Конечно, Eclipse делает то же самое для Java, но Java не является языком прототипирования.

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

Первый интерпретатор Erlang был написан на Прологе - и по какой-то причине, поскольку Пролог очень хорошо подходит для синтаксического анализа и кодирования логики, найденной в деревьях разбора . На самом деле, Пролог поставляется со встроенным парсером! Нет, это не библиотека, это синтаксис, а именно DCG s .

Пролог часто используется в НЛП, особенно в синтаксисе и вычислительной семантике .

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

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

Начиная с Пролога = Синтаксическая унификация + Обратная цепочка + REPL,

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

Использование синтаксической унификации

  • Преобразования AST
  • Вывод типа
  • Переписывание терминов
  • Доказательство теоремы
  • Обработка естественного языка
  • Соответствие шаблону
  • Генерация комбинаторного тестового примера
  • Извлекать подструктуры из структурированных данных, таких как XML-документ
  • Символьное вычисление , т. е.математический анализ
  • Дедуктивные базы данных
  • Экспертные системы
  • Искусственный Интеллект
  • Синтаксический анализ
  • Языки запросов

Программирование логики ограничений (CLP)

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

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

Это приводит к созданию специальных решателей ограничений для различных домены, такие как:

  • CLP (FD) для целые числа
  • CLP (B) для Логические значения
  • CLP (Q) для рациональный числа
  • CLP (R) для плавающая точка цифры.

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

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

CLP (FD) — Рассуждение о целых числах

На практике CLP (FD) является одним из наиболее важных приложений логического программирования и используется, среди прочих, для решения задач из следующих областей:

  • планирование
  • распределение ресурсов
  • планирование
  • комбинаторная оптимизация

Видишь для получения дополнительной информации и нескольких примеров.

CLP(B) — Логические ограничения

CLP (B) часто используется в связи с:

  • Сидел , решая
  • проверка схемы
  • комбинаторный подсчет

Видишь .

CLP (Q) — Рациональные числа

CLP(Q) используется для решения важных классов задач, возникающих в Исследование операций:

  • линейное программирование
  • целочисленное линейное программирование
  • смешанное целочисленное линейное программирование

Видишь .

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

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

Две вещи, которые я видел хорошо, это математические доказательства и понимание естественного языка.

Пролог отлично умеет решать головоломки и тому подобное. Тем не менее, в области решения головоломок это облегчает легкое / среднее решение головоломок, а сложное решение головоломок сложнее. Тем не менее, написание решателей для сеточных головоломок и тому подобного, таких как Hexiom, Sudoku или Nurikabe, не особенно сложно.

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

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