Hy on Adderall - a miniKanren implementation in Hy
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.



Build Status Downloads Version

This library contains an implementation of miniKanren in Hy. It is a naive implementation, speed isn't the primary concern.


(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.


All the code is licensed under the GNU Lesser General Public License (v3+).