ds-kanren-0.2.0.0: ds-kanren.cabal
name: ds-kanren
version: 0.2.0.0
synopsis: A subset of the miniKanren language
description:
ds-kanren is an implementation of the <http://minikanren.org miniKanren> language.
.
== What's in ds-kanren?
.
['disconj']
Try the left and the right and gather solutions that satisfy
either one.
['fresh']
Create a fresh logical variable
['===']
Equate two terms. This will backtrack if we can't unify
them in this branch.
['run']
Actually run a logical computation and return results and
the constraints on them.
.
In addition to these core combinators, we also export a few
supplimentary tools.
.
['=/=']
The opposite of '===', ensure that the left and right
never unify.
.
== The Classic Example
.
We can define the classic @appendo@ relationship by encoding
lists in the Lisp "bunch-o-pairs" method.
.
> appendo :: Term -> Term -> Term -> Predicate
> appendo l r o =
> conde [ program [l === "nil", o === r]
> , manyFresh $ \h t o ->
> program [ Pair h t === l
> , appendo t r o
> , Pair h o === o ]]
.
Once we have a relationship, we can run it backwards and forwards
as we can with most logic programs.
.
>>> let l = list ["foo", "bar"]
.
>>> map fst . runN 1 $ \t -> appendo t l l
[nil]
>>> map fst . runN 1 $ \t -> appendo l t l
[nil]
>>> map fst . runN 1 $ \t -> appendo l l t
[(foo, (bar, (foo, (bar, nil))))]
.
== Related Links
.
Some good places to start learning about miniKanren would be
.
* <http://www.amazon.com/The-Reasoned-Schemer-Daniel-Friedman/DP/0262562146 The Reasoned Schemer>
* <http://www.infoq.com/presentations/miniKanren A presentation at StrangeLoop>
* <https://github.com/miniKanren/miniKanren The canonical implementation>
license: MIT
license-file: LICENSE
author: Danny Gratzer
maintainer: jozefg@cmu.edu
category: Language
build-type: Simple
cabal-version: >=1.10
source-repository head
type: hg
location: http://bitbucket.org/jozefg/ds-kanren
library
exposed-modules: Language.DSKanren
, Language.DSKanren.Core
, Language.DSKanren.Sugar
build-depends: base >=4 && <5
, containers >=0.4
, logict
hs-source-dirs: src
default-language: Haskell2010
Test-Suite test-unify:
hs-source-dirs: test
type: exitcode-stdio-1.0
main-is: Unify.hs
hs-source-dirs: test
build-depends: ds-kanren
, tasty
, tasty-quickcheck
, QuickCheck
, base >=4 && <5
default-language: Haskell2010
Test-Suite test-list-ops:
hs-source-dirs: test
type: exitcode-stdio-1.0
main-is: List.hs
hs-source-dirs: test
build-depends: ds-kanren
, tasty
, tasty-quickcheck
, QuickCheck
, base >=4 && <5
default-language: Haskell2010