#language #prolog #logic-programming #programming-language #kanren

ukanren

Rust 语言实现的 µKanren,一种轻量级关系编程语言

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

MIT 许可证

22KB
448 行 代码

µKanren-rs

github crates.io docs.rs build status

这是 µKanren 的 Rust 实现,µKanren 是一种轻量级关系编程语言。有关原始 Scheme 实现的参考,请参见此处

特性

  • 类似于 Scheme 的 cons 单元的结构化合一。
  • 使用 Iterator 特征实现的流。
  • 使用三角形替换的持久向量表示状态。
  • 基于特征(无宏 API)的合取、析取和 fresh
  • 使用逆-η 延迟的惰性目标评估。
  • 整数、boolchar&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