Hy on Adderall - a miniKanren implementation in Hy
Hy Python
Latest commit c8d14f5 Apr 7, 2016 @algernon adderall.dsl: run1 is now an alias to run¹
This fixes #6, thanks @tuturto!

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>



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

(defreader h [_] "#hy")
(defn lovesᵒ [u v] (≡ v #hy))
(run* [who what] (lovesᵒ who what)
                 (≡ who (getuser))
                 (≡ what #hy))
;; => [['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+).