5 个版本
0.0.5 | 2021 年 9 月 15 日 |
---|---|
0.0.4 | 2021 年 9 月 12 日 |
0.0.3 | 2021 年 9 月 12 日 |
0.0.2 | 2021 年 9 月 11 日 |
0.0.1 | 2021 年 9 月 11 日 |
在 编程语言 中排名第 631
每月下载量 23 次
22KB
448 行 代码
µKanren-rs
这是 µKanren 的 Rust 实现,µKanren 是一种轻量级关系编程语言。有关原始 Scheme 实现的参考,请参见此处。
特性
- 类似于 Scheme 的 cons 单元的结构化合一。
- 使用
Iterator
特征实现的流。 - 使用三角形替换的持久向量表示状态。
- 基于特征(无宏 API)的合取、析取和
fresh
。 - 使用逆-η 延迟的惰性目标评估。
- 整数、
bool
、char
、&str
和单元类型原子。 - 显式的
ToValue
特征,可以将向量数组和列表转换为 cons 列表。 - 用于检查和指定状态的便利宏
state!
。
用法
以下是一个简单的示例,它定义并使用了 appendo
谓词。
use ukanren::*;
fn appendo(first: Value, second: Value, out: Value) -> BoxedGoal<impl Iterator<Item = State>> {
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].to_value()));
assert_eq!(
iter.collect::<Vec<_>>(),
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], ()],
],
);
更多示例可以在 tests/
文件夹和 API 文档中找到。
由 Eric Zhang 为 CS 252r 制作。所有代码均根据 MIT 许可证 进行许可。
依赖项
~1MB
~19K SLoC