/loghyc

Loghyc - a miniKanren implementation in Hy

Primary LanguageHy

Adderall

Build Status Downloads Version

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+).