µKanren-rs

github crates.io docs.rs build status

This is a Rust implementation of µKanren, a featherweight relational programming language. See the original Scheme implementation here for reference.

Features

Usage

Here's a simple example, which defines and uses the appendo predicate.

```rust use ukanren::*;

fn appendo(first: Value, second: Value, out: Value) -> BoxedGoal> { eq(&first, &()) .and(eq(&second, &out)) .or(fresh(move |a: Value, d: Value, res: Value| { eq(&(a.clone(), d.clone()), &first) .and(eq(&(a, res.clone()), &out)) .and(appendo(d, second.clone(), res)) })) .boxed() }

let iter = run(|x, y| appendo(x, y, [1, 2, 3, 4, 5].tovalue())); asserteq!( iter.collect::>(), vec![ state![(), [1, 2, 3, 4, 5]], state![[1], [2, 3, 4, 5]], state![[1, 2], [3, 4, 5]], state![[1, 2, 3], [4, 5]], state![[1, 2, 3, 4], [5]], state![[1, 2, 3, 4, 5], ()], ], ); ```

More examples can be found in the tests/ folder and the API documentation.


Made by Eric Zhang for CS 252r. All code is licensed under the MIT License.