6 个版本

0.1.6 2021 年 9 月 18 日
0.1.5 2021 年 6 月 5 日
0.1.4 2020 年 12 月 6 日
0.1.3 2020 年 11 月 5 日
0.1.1 2020 年 9 月 15 日

#19 in #logic-programming

每月 42 次下载
proto-vulcan 中使用

MIT/Apache

88KB
2K SLoC

proto-vulcan

CI Status Coverage Status Crates.io version docs.rs docs MIT/APACHE-2.0 Required rustc minimum version

A relational logic programming language embedded in Rust. It started as a yet another miniKanren, but has already evolved into its own language with miniKanren at its core.

In addition to core miniKanren language, proto-vulcan currently provides support for

  • miniKanren-like breadth-first and Prolog-like depth-first search.
  • 复合类型 (示例)
  • Disequality constraints CLP(Tree)
  • 有限域约束 CLP(FD)
  • 各种运算符:anyo, conda, condu, onceo, project
  • 模式匹配:match, matche, matcha, matchu
  • 在 proto-vulcan 中嵌入 Rust 代码
  • 用户扩展接口

The language is embedded into Rust with macros which parse the language syntax and convert it into Rust. The language looks a lot like Rust, but isn't. For example, fresh variables are presented with Rust closure syntax, and pattern matching looks like Rust match.

示例

extern crate proto_vulcan;
use proto_vulcan::prelude::*;

fn main() {
    let query = proto_vulcan_query!(|q| {
        conde {
            q == 1,
            q == 2,
            q == 3,
        }
    });

    for result in query.run() {
        println!("q = {}", result.q);
    }
}

The example program produces three solutions

q = 1
q = 2
q = 3

在 Rust 中嵌入

To embed proto-vulcan in Rust, four macros are used: proto_vulcan!, proto_vulcan_closure!, proto_vulcan_query!, and lterm!.

  • proto_vulcan!(<goal>) 声明一个 Proto-vulcan 目标,并返回一个类型为 Goal 的 Rust 变量。
  • proto_vulcan_closure!(<goal>) 声明一个 Proto-vulcan 目标,并返回一个类型为 Goal 的 Rust 变量。目标表达式在目标评估时按需评估。闭包将拥有闭包内引用的所有变量的所有权。
  • proto_vulcan_query!(|a, b, c| { <goal> }) 定义了一个具有查询变量 abc 的 Proto-vulcan 查询。返回值是一个 Query-struct,当调用 run 时,它会产生一个迭代器,可以用来遍历逻辑程序的有效解。迭代器返回一个具有查询变量命名的字段的 struct。
  • lterm!(<tree-term>) 在 Rust 代码中声明了一个逻辑树项,可以传递给 proto_vulcan! 或 proto_vulcan_query! 中的 proto-vulcan 程序,或与结果进行比较。

许可证

根据以下任一许可证授权:

任选其一。

贡献

除非你明确声明,否则根据 Apache-2.0 许可证定义的,你有意提交以包含在工作中的任何贡献,都应按上述方式双重许可,而不附加任何额外条款或条件。

依赖

约 1.5MB
约 35K SLoC