As a first step toward a much grander Clojure project I needed a unification library to supplement a simple logic engine (the second step in the larger plan). There are a few options floating around, but nothing that was readily available nor complete. Therefore, I decided to package a simple unification library in hopes that others might find it useful and hopefully eliminate the need to search around fruitlessly like I did. A basic use case for Unifycle is as follows:
[sourcecode lang=“clojure” gist=“599021”](use ’[me.fogus.unifycle :only [unifier]])
;; unify two expressions with an occurs check
(unifier ‘((?a * ?x ** 2) + (?b * ?x) + ?c)’(?z + (4 * 5) + 3))
;=> ((?a * 5 ** 2) + (4 * 5) + 3)[/sourcecode]
Unifycle exposes a number of canned functions, starting with
unifier
, try-subst
, and
garner-unifiers
. These functions use an occurs
check internally, so use them with that fact in mind. I have also
exposed versions of these functions without internal occurs
check named unifier-
, try-subst-
, and
garner-unifiers-
. If you know what unification is then you
know what an occurs check is – if not, then this whole post is
probably moot.
I have also exposed factory functions named
make-occurs-unify-fn
, make-occurs-subst-fn
,
make-occurs-unifier-fn
, make-unify-fn
,
make-subst-fn
, and make-unifier-fn
. The first
three create versions using and occurs check and the last three
create versions without. Each of these factory functions take a single
predicate function that is used to determine if a symbol in a
(potentially) unified expression refers to a variable. From the example
above, you’ll notice that the default variable function is preceded with
a question mark (e.g. ?snigglet
).
I have created a documentation page for Unifycle that I plan to expand. Any and all help is appreciated.
:f