Problox.jl
is a small DSL for probabilistic logic programming which wraps ProbLog - a wonderful, well-supported library which extends Prolog with probabilistic constructs.
Here's the DSL in action:
net = @problox begin
C = variable(:C);
coin(:c1);
coin(:c2);
(0.4 :: heads(C), 0.6 :: tails(C)) :- coin(C);
win << heads(C);
query(win);
end
As long as you've got everything straightened out with PyCall
, this will compile to a PyObject
representing ProbLog's SimpleProgram
.
You can evaluate the compiled representation directly in Julia. For example,
println(evaluate(net))
will return
Dict{Any,Any}(PyObject win => 0.64)
You can, of course, use some of Julia's nice abstractions.
# Generates worlds :)
@problox function generator(p, q)
C = variable(:C);
coin(:c1);
coin(:c2);
(p :: heads(C), q :: tails(C)) :- coin(C);
win << heads(C);
query(win);
end
Here's a world generator. This defines a function which produces worlds which you can evaluate with evaluate
.
If you want to work at a lower-level, there's a set of direct APIs through PyCall
for building programs.
# This is a simple program in the direct Python interfaces.
C = Var("C")
p = SimpleProgram()
p.add_fact(coin(Constant("c1")))
p.add_fact(coin(Constant("c2")))
p.add_clause(AnnotatedDisjunction([heads(C, p=0.4), tails(C, p=0.6)], coin(C)))
p.add_clause(win << heads(C))
p.add_fact(query(win))
This might be useful if you'd like to hook this up to some other system.