Вот что было бы здорово — так это использовать синтаксис Scala прямо для записи правил.
Благо компилятор там мощный, а сейчас даже макросы есть. Так что нет наких причин тратить время на свой собственный синтаксис.
Если честно подумал об этом же только вчера :) Первая мысль — можно ли будет создать правила и подсунуть движку динамически? Чтобы они динамически скомпилировались в байт код. Вобщем, можно будет поисследовать этот вопрос. Вот нашел www.scala-lang.org/node/12073
C SQL в Scala я намучался. Circumflex, правда, не пробовал, пробовал более мэйнстримные фрэймворки: ScalaQuery/Slick и Squeryl. Во-первых гибкость формирования запросов всё-равно сильно снижается (я, например, так и не нашёл как сделать INSERT IGNORE в MySQL), во-вторых ScalaQuery/Slick — это такое немыслимое нагромождение имплиситов, что «х-й проссышь» что к чему и где. В результате, после многократных проб и попыток, раскуривания исходников самих библиотек и примеров, вернулся к голому JDBC и SQL-запросам в строках.
Вообще говоря, это универсальный инструмент для случая, если необходимо автоматизировать принятие решений на основании правил, составленных экспертами в некой предметной области.
Например, сфера выдачи малых кредитов. На вход подаются данные о человеке: его кредитная история, какие-то финансовые метрики важные для принятия решения. И каждый банк создает свой набор правил, который, используя эти данные, решает — выдавать кредит такому человеку или не выдавать. И если выдавать, то на какое время и с какими процентами. Это позволит банку — уменьшить кол-во персонала занимающегося рутинной работой. Заемщику — экономия времени.
Синтаксис правил задумывается таким образом, чтобы даже не программист, разобравшись в базовой логике, мог их составлять.
Там тоже декларативное «логическое» программирование в любых типах (значения могут быть не только boolean) и есть агрегация переменных (схлопывание при помощи функции-агрегатора). Та система мне безумно понравилась, жаль последняя версия пока не опубликована
Бегло посмотрел dyna… Вообще различия довольно существенные. Например у меня нельзя сделать нечто такое www.dyna.org/wiki/index.php?title=Shortest_path_in_a_graph. Т.е. выражаясь простым языком в fusie нельзя декларативно обьявлять функцию (с возможно разными обьявлениями для разных наборов аргументов). В то же время в dyna я не увидел вывода с множеством вероятных исходов и подсчетом вероятностей для каждого. Кстати понравился оператор min=, который из множества исходов справа выбирает в итоге минимальный. Возможно добавлю такой же.
min это лишь один из аггрегаторов. По-сути, там может стоять что угодно — max, последнее значение (пишется := ), mean, sum и т.д.
Т.е. если в каком-то из значений автор хранит вероятность (-1… +1), то sum как раз и даёт итоговую вероятность по всем посчитанным переменным такого типа!
А есть ли Rules Engines которые умеют работать с partial data? Т.е. часть свойств объектов могут быть неизвестны и он скажет — true, false, или "не хватает данных"?
Scala rule-based inference engine