Naga: Datalog-based rules engine in Clojure
github.com
github.com
Production Rules on Databases: https://www.youtube.com/watch?v=8rRzESy0X2k
Rete scales well for huge numbers of rules, but not so well for large data sets. I haven't played with Naga yet, but I am curious if that is an issue.
Basically. I love rules engines. I think I just tried to do too much magic with them on my first encounter.
Pretty sure this is exactly what you would use Prolog for.
While Datalog is a subset of Prolog, Datomic isn't Datalog. From their tutorial:
[:db/add "foo" :db/ident :green]
This isn't Prolog syntax at all. Prolog would be assert("foo", ident, green)
Franz, Inc. does it as well - calling something Prolog for their Lisp product which it just isn't.I've nothing against Clojure but I wish the functional programming fans wouldn't call their DSLs Prolog or Datalog. If you're using Prolog or Datalog, you're expecting it to be (reasonably) portable accross Prologs, which this isn't at all.
Most of the time these 'Prolog' implementations are not as powerful/complete like a typical modern Prolog implementation.
LispWorks for example has an expert system development extension with an integrated Prolog.
http://www.lispworks.com/documentation/lw70/KW-M/html/kwprol...
It also offers to read Edinburgh syntax and also has a command line interface for this syntax.
http://www.lispworks.com/documentation/lw70/KW-M/html/kwprol...
But it still is far from ISO Prolog compatible.
I sure hope so ;)
Also it's clear ISO Prolog isn't universally embraced (http://www.cs.unipr.it/~bagnara/Papers/Abstracts/ALPN99a) since most popular Prolog implementations based on WAM were started way earlier.
I guess there are worse things Prolog had to suffer; namely, Perl insensitively took away the .pl file suffix and made it its own.
Datalog based rules engine and The language being implemented is called "Pabu" and it strongly resembles Prolog.
There doesn't seem to be much documentation for this, but the examples look like this:
sibling(fred, barney).
parent(fred, mary).
sibling(mary, george).
gender(george, male).
/* Using the OWL namespace to describe the sibling property */
owl:SymmetricProperty(sibling).
See [1]It's been a while since I did Prolog, but that looks pretty familiar (and like your example)
[1] https://github.com/threatgrid/naga/blob/master/pabu/family-2...
Mind you, Prolog (ISO/IEC 13211-1) has very specific requirements with respect to exceptions, arithmetic, operator-precedence parsing and resolution/negation-as-failure/extra-logical features, which I see often glossed over when people call something Prolog in a roundabout way.
Defining everything in Clojure datastructures is a huge asset. Additionally its easy to use Clojure/Java language constructs in combination with the rule engine.
In core.logic you can replace the unification alogorithms because its defined abstractly. I don't think this is as easy to do in Prolog.
I really like Clojure's core.logic approach: use core.logic (which works like prolog) for the bits where it makes sense and use Clojure for the bits where it doesn't. That is, the right tool for the job.