This is a work-in progress project for working with declarative Datalog style programs as an embedded domain-specific language in Haskell.
The current focus is on getting a rich Datalog-esque EDSL that works nicely as a monad transformer, so you can mix and match it with tools from other domains.
Skim the examples folder to get started for now.
Using X
, Y
and Z
as Node
variables, and A
B
and C
as Node
entities:
test :: Datalog [Edge]
test = do
edge A B
edge B C
edge B A
tc X Y :- edge X Y
tc X Z :- tc X Y <* edge Y Z
query $ row (tc A X) <* no (edge X C)
Contributions and bug reports are welcome!
Please feel free to contact me through github or on the #haskell-lens IRC channel on irc.freenode.net.
-Edward Kmett