A logic programming library for F#
F#
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src
.gitattributes
.gitignore
README.md

README.md

logic

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.

Example

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"))]

The Reasoned Schemer

For the functional programmer who wants to learn to think logically there is no better introduction than The Reasoned Schemer.

alt text