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