#logic-programming #programming-language #logic #programming #language

proto-vulcan

嵌入在Rust中的miniKanren家族关系逻辑编程语言

7个版本

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日

#312 in 编程语言

MIT/Apache

350KB
10K SLoC

proto-vulcan

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

嵌入在Rust中的关系逻辑编程语言。它最初是一个miniKanren,但已经发展成为一个具有miniKanren核心的独立语言。

除了核心miniKanren语言外,proto-vulcan目前还提供以下支持:

  • 类似miniKanren的广度优先搜索和类似Prolog的深度优先搜索。
  • 复合类型(示例
  • 不等式约束CLP(Tree)
  • 有限域约束CLP(FD)
  • 各种运算符:anyo、conda、condu、onceo、project
  • 模式匹配:match、matche、matcha、matchu
  • 在proto-vulcan中嵌入Rust编写的目标
  • 用户扩展接口

该语言通过宏嵌入到Rust中,这些宏解析语言语法并将其转换为Rust。该语言看起来与Rust非常相似,但实际上不是。例如,新变量以Rust闭包语法表示,模式匹配看起来像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);
    }
}

该示例程序生成三个解

q = 1
q = 2
q = 3

Rust中的嵌入

要将proto-vulcan嵌入到Rust中,需要使用四个宏:proto_vulcan!proto_vulcan_closure!proto_vulcan_query!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-结构体,当调用 run 时,将生成一个迭代器,可以用于遍历逻辑程序的有效解决方案。迭代器返回一个具有查询变量命名的字段的结构体。
  • lterm!(<tree-term>) 在 Rust 代码中声明了一个逻辑树项,可以传递给 proto_vulcan! 或 proto_vulcan_query! 中的 proto-vulcan 程序,或与结果进行比较。

许可证

根据您的选择,受以下任意一项许可证的许可:

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交以包含在作品中的任何贡献,将如上所述双重许可,没有任何额外的条款或条件。

依赖项

~1.1–3MB
~61K SLoC