A logic programming library for F# based on miniKanren and μKanren. It is designed to offer an idiomatic F# programming style and also resemble the scheme version of miniKanren.
The peano function in Scheme-miniKanren
(define peano
(lambda (n)
(conde
((== 'z n))
((fresh (n-)
(== `(s. ,n-) n)
(peano n-))))))
(run 3 (q) (peano q)) ;; '(z (s. z) (s. (s. z)))
the F# version is pretty similar
let rec peano n =
logic {
do! conde [ Str "z" == n;
logic {
let! n' = fresh
do! Pair (Str "s", n') == n
return! peano n'
} ]
}
run 3 (fun q -> peano q) // [Str "z"; Pair (Str "s",Str "z"); Pair (Str "s",Pair (Str "s",Str "z"))]
For the functional programmer who wants to learn to think logically there is no better introduction than The Reasoned Schemer.