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 编程语言
350KB
10K SLoC
proto-vulcan
嵌入在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> })
定义了一个带有查询变量a
、b
和c
的 Proto-vulcan 查询。返回的值是一个Query
-结构体,当调用run
时,将生成一个迭代器,可以用于遍历逻辑程序的有效解决方案。迭代器返回一个具有查询变量命名的字段的结构体。lterm!(<tree-term>)
在 Rust 代码中声明了一个逻辑树项,可以传递给 proto_vulcan! 或 proto_vulcan_query! 中的 proto-vulcan 程序,或与结果进行比较。
许可证
根据您的选择,受以下任意一项许可证的许可:
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交以包含在作品中的任何贡献,将如上所述双重许可,没有任何额外的条款或条件。
依赖项
~1.1–3MB
~61K SLoC