Можете ли вы выполнить логическое программирование в Scala?

Я где-то читал, что Match Matching, подобный тому, который поддерживается функцией match/case в Scala, фактически был заимствован из логических языков, таких как Prolog.

Можете ли вы использовать Scala для элегантного решения таких проблем, как проблема Connected Graph? например https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html

Ответы

Ответ 1

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

Кроме того, совпадение с образцом совершенно не подходит для этого по многим причинам. Рассмотрим, например, основной запрос: path(1, 5, P). В шаблоне Scala, 1, 5 и P - выходы. Вы не можете предоставить вход, который можно использовать для создания вывода.

С Prolog это похоже на то, что 1 и 5 фиксированы, какие возможные значения могут принимать P? Это как раз сейчас, как работает сопоставление образцов.

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

Ответ 2

См. http://kanren.sourceforge.net/ для получения подробной информации о том, как функциональное и логическое программирование на самом деле не так далеко друг от друга. Структуры потоков являются ключом к пониманию того, как две парадигмы могут объединяться. Благодаря "подъему" стандартных функций в потоковый/логический формат они могут демонстрировать поведение решения проблем, которое очень похоже на Prolog.

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

Ответ 3

Я знаю, что опаздываю, но ищет re: kanren Я нашел эту [мертвую ссылку]. Также есть: http://code.google.com/p/scalalogic/ p >

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

Ответ 4

Языки Haskell и функционального программирования были прямым источником вдохновения для Scala. Одним из приложений, унаследованных от этих языков, является разработка доменных специфических языков (DSL). В Haskell имеется довольно много DSL для логического программирования (Prolog). Должна быть вполне возможна перенос такой библиотеки DSL на Scala, если этого еще не произошло.

Ответ 5

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

Ответ 6

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

Однако существует относительно новый подход к отображению логических переменных в функциональные конструкции. В конкретном случае язык логики близкого к прологу Curry curry переводится на Haskell. Что очень необычно в этом подходе, так это то, что логические переменные моделируются ленинностью. Подробнее см. KiCS2: новый компилятор от Curry to Haskell. Может быть, lazy val можно использовать с этой целью.

Ответ 7

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

https://github.com/sonoisa/Prolog-in-Scala/blob/master/PrologInScalaSample.scala

Вышеупомянутое указывает на пару тестовых программ. Интерпретатор Prolog написан в Scala таким образом, что предложения Prolog могут быть вложены как объекты Scala, написанные в Scala. Я не полностью понимаю магию за ней, вот пример того, как написана функция tak:

tak('X, 'Y, 'Z, 'A) :- (
 'X =< 'Y, CUT, 'Z === 'A)
tak('X, 'Y, 'Z, 'A) :- (
 'X1 is 'X - 1,
 'Y1 is 'Y - 1,
 'Z1 is 'Z - 1,
 tak('X1, 'Y, 'Z, 'A1),
 tak('Y1, 'Z, 'X, 'A2),
 tak('Z1, 'X, 'Y, 'A3),
 tak('A1, 'A2, 'A3, 'A)
)

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

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

С наилучшими пожеланиями

Ответ 8

Styla - довольно полный интерпретатор Prolog, написанный в Scala, полученных от Kernel Prolog (см. раздел "Свободные языки: Рефакторинг Пролога" для Равномерное отражение и взаимодействие с внешними объектами в CL'2000).

Код подлинности с открытым исходным кодом (версия Apache) размещен по адресу:

http://code.google.com/p/styla/

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

Styla использует несколько Scala лакомств, недоступных в Java:

  • функции более высокого порядка, карты, складки, классы case и т.д.
  • комбинаторные парсеры - "DCGs бедного человека"
  • Scala элегантные неявные преобразования между списки, массивы, последовательности и т.д.
  • Scala произвольные целые числа и десятичные числа (с естественный синтаксис, в отличие от Java)
  • Scala ""... "" " строки - для регулярных выражений и для встраивания Код Prolog непосредственно в классах Scala
  • несколько абзацев IO, доступных в Scala, которые просматривать такие вещи, как файловые операции как итераторы - естественное соответствие для оригинальных Java-based Kernel Prolog, из которого была создана Styla.

(Текст взят из: http://groups.google.com/group/comp.lang.prolog/browse_thread/thread/4cd835d2c82fce02/505688d4b0be5528)

Ответ 9

Совпадение шаблонов как таковое не является непосредственно полезным для логического программирования, так как не объединяет переменные.

Ответ 10

Вы также можете посмотреть scampi (решатель программирования ограничений в Scala): https://bitbucket.org/pschaus/scampi/wiki/Home Jacop CP Solver также имеет scala API.

Ответ 11

Я нашел этот http://yieldprolog.sourceforge.net/ как источник для методов реализации, подобных Prolog, а не недокументированный исходный код или загадочные библиотеки.

Но я интересуюсь Scala всего несколько дней назад, поэтому задал тот же вопрос на users.scala: https://users.scala-lang.org/t/yield-prolog-unification-and-coroutines-in-scala/4433

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