Skip to content

Stochastic Logic Programs (SLP) style probabilistic logic programming in miniKanren

Notifications You must be signed in to change notification settings

stjordanis/slpKanren

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

slpKanren

Stochastic Logic Programs (SLP) style probabilistic logic programming in miniKanren, based on Stephen Muggleton's paper, 'Stochastic Logic Programs': http://www.doc.ic.ac.uk/~shm/Papers/slp.pdf

Code by Rebecca Swords and William E. Byrd, based on core miniKanren.

slpKanren extends core miniKanren with one relational operator (condp) and two interface operators (run-prob and run-prob*):

(condp [prob-exp g g* ...] ...)

condp is identitical to conde, except that the first expression in each clause must evaluate to a real number representing the probability associated with that clause. Operationally, condp behaves identically to conde, other than associating a probability with each successful clause. In other words, condp and conde produce the same answers, in the same order; however, condp associates a probility with each answer.

(run-prob n (x) g0 g ...)
(run-prob* (x) g0 g ...)

run-prob and run-prob* are identical to run and run*, except that the probability associated with each answer is also returned.

This implementation also includes two debugging goals, which can be used to examine the substition: print-substo and print-prob-substo.

Example slpKanren program, adapted from the Muggleton paper:

;;; stochastic automaton
(define sa
  (lambda (S)
    (letrec ([q0 (lambda (S)
                   (exist (S^)
                     (condp
                       [0.4
                        (== `(a . ,S^) S)
                        (q0 S^)]
                       [0.6
                        (== `(b . ,S^) S)
                        (q1 S^)])))]
             [q1 (lambda (S)
                   (exist (S^)
                     (condp
                       [0.7
                        (== `(b . ,S^) S)
                        (q1 S^)]
                       [0.3
                        (== `(c . ,S^) S)
                        (q2 S^)])))]
             [q2 (lambda (S) (== '() S))])
      (q0 S))))

and associated test cases:

(test "sa-1"
  (run-prob 10 (q) (sa q))
  '(((b c) . 0.18)
    ((b b c) . 0.126)
    ((a b c) . 0.072)
    ((b b b c) . 0.08819999999999999)
    ((b b b b c) . 0.06173999999999999)
    ((a b b c) . 0.0504)
    ((b b b b b c) . 0.043217999999999986)
    ((b b b b b b c) . 0.03025259999999999)
    ((a a b c) . 0.0288)
    ((a b b b c) . 0.03528)))
(test "sa-2"
  (run-prob 1 (q) (== '(a b b c) q) (sa q))
  `(((a b b c) . ,(* 0.4 0.6 0.7 0.3))))

All Scheme code tested under Petite Chez Scheme Version 8.4.

About

Stochastic Logic Programs (SLP) style probabilistic logic programming in miniKanren

Resources

Code of conduct

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Scheme 100.0%