Adderall
This library contains an implementation of miniKanren in Hy. It is a naive implementation, speed isn't the primary concern.
Example
(import [adderall.dsl [*]])
(require adderall.dsl)
(run* [q] (condᵉ [(≡ q 'tea)]
[(≡ q 'coffee) succeed]))
;; => ['tea 'coffee]
(run* [q] (condᵉ [(≡ q 'tea)]
[(≡ q 'coffee) fail]))
;; => ['tea]
(import [getpass [getuser]])
(deftag h [_] "#hy")
(defn lovesᵒ [u v] (≡ v #h y))
(run* [who what] (lovesáµ’ who what)
(≡ who (getuser))
(≡ what #h y))
;; => [['algernon' '#hy']]
More examples can be found in the test suite, and in particular, the tests adapted from The Reasoned Schemer.
Adderall also comes with a set of extra functions, which are there mostly to show the power of the system, or for fun:
(import [adderall.dsl [*]]
[adderall.extra.zebra [*]])
(require adderall.dsl)
(require adderall.extra.zebra)
(run* [water-drinker horse-owner] (zebraáµ– water-drinker horse-owner))
;; => [['norvegian 'japanese]]
For a practical use, see Hydiomatic, a static analyser and code transformer built upon Adderall, or wynck, a tool to reason about your window layout.
License
All the code is licensed under the GNU Lesser General Public License (v3+).