7个版本
0.2.5 | 2022年2月16日 |
---|---|
0.2.4 | 2022年1月19日 |
0.1.0-dev | 2021年12月3日 |
#1 在 #simplistic 中
每月22次下载
430KB
7.5K SLoC
Crate asdi
另一个简化的Datalog实现(Rust版)。
此包提供了一种数据模型,用于在内存中表示Datalog程序,一个用于文本表示的解析器,以及一些评估实现。更多信息请参阅ASDI书籍。
文本表示解析器是一个独立的功能,因此如果您只需要使用API构建和评估程序,可以选择不使用Pest解析器和支持。
状态
- 库 API 主要稳定,下一步将使构建API更易于使用。
- 库 文档 有良好的顶级文档,但到目前为止内容很少。
- 解析器 完全支持核心语言以及编译指令,需要更多单元测试。
- I/O 关系现在连接到文件输入/输出编译指令,
io
模块包括读取/写入关系的特性和基本的JSON和CSV支持。 - 评估 目前有一个简单实现和一个分层半简单实现。
示例
parent(xerces, brooke).
parent(brooke, damocles).
ancestor(X, Y) ⟵ parent(X, Y).
ancestor(X, Y) ⟵ parent(X, Z) ⋀ parent(Z, Y).
?- ancestor(xerces, X).
use asdi::edb::{Attribute, Predicate};
use asdi::idb::{Atom, Query, Term, Variable};
use asdi::Program;
use std::str::FromStr;
fn ancestor_example() {
// See https://en.wikipedia.org/wiki/Datalog
let mut ancestors = Program::default();
let parent_predicate = Predicate::from_str("parent").unwrap();
{
let parent = ancestors
.add_new_relation(
parent_predicate.clone(),
vec![Attribute::string(), Attribute::string()],
)
.unwrap();
parent
.add_as_fact(["xerces".into(), "brooke".into()])
.unwrap();
parent
.add_as_fact(["brooke".into(), "damocles".into()])
.unwrap();
};
let ancestor_predicate = Predicate::from_str("ancestor").unwrap();
let var_x: Term = Variable::from_str("X").unwrap().into();
let var_y: Term = Variable::from_str("Y").unwrap().into();
let var_z: Term = Variable::from_str("Z").unwrap().into();
ancestors
.add_new_rule(
ancestor_predicate.clone(),
[var_x.clone(), var_y.clone()],
[Atom::new(parent_predicate.clone(), [var_x.clone(), var_y.clone()]).into()],
)
.unwrap();
ancestors
.add_new_rule(
ancestor_predicate.clone(),
[var_x.clone(), var_y.clone()],
[
Atom::new(parent_predicate, [var_x.clone(), var_z.clone()]).into(),
Atom::new(ancestor_predicate.clone(), [var_z, var_y]).into(),
],
)
.unwrap();
ancestors
.add_new_query(ancestor_predicate, ["xerces".into(), var_x])
.unwrap();
println!(">{}<", ancestors);
}
Crate功能
功能 | 默认 | 启用 |
---|---|---|
graphviz |
是 | 依赖图和分层图的图形表示 |
parser |
是 | 文本表示的解析 |
tabular |
是 | 视图的表格输出 |
io |
是 | 收集所有常见的I/O格式 |
io_csv |
间接支持 | 分隔行格式支持 |
io_json |
间接支持 | JSON格式支持 |
io_text |
间接支持 | 原生文本格式(仅写入)支持 |
更改
版本0.2.5
- 重点是文档,包括rustdoc和mdbook。
- 现在书籍包含大多数主要模型区域更好的具体文档和UML。
- 一些API更改,因为文档揭示了不一致。
- 访问者和编写者区域的重大变化。
版本0.2.4
- 完成了支持分层的工作,包括优先级图。
- 添加了新的
StratifiedEvaluator
实现,它执行分层以及使用半简单评估方案。 - 添加了基于Criterion的评估实现的基准测试。
- 将查询特性和关系操作分离。
- API中的小更改,以保持一致性。
版本0.2.3
- 增加了正则表达式的 "*=" 操作符
- 将
LiteralInner
/Literal
的变体重命名为Relational
和Arithmetic
,以传达意义而非仅仅类型。 - 将
Relations
重命名为RelationSet
,将Rules
重命名为RuleSet
。 - 将
PredicateSet
重命名为NameReferenceSet
,并用于变量;这还增加了用于清晰性的AttributeNameRef
类型。 - 更新了 highlight.js 的 Datalog 语言定义,以适应注释和运算符的变化。
- 将更多 "比较(运算符)?" 的用法替换为算术文字。
- 修复了更多的 Clippy 警告。
版本 0.2.2
- 对语法进行了修改,使其与传统 Datalog 以及 Soufflé 更加紧密地一致。
- 使用
%
替代#
用于行注释, - 增加了
/*
和*/
用于块注释, - 不再需要在布尔常量
true
和false
上使用@
前缀, - 使用
.
替代@
用于语用。 - ASDI 仍然使用单独的
assert
和infer
语用,而不是 Soufflé 的单个decl
。 - 此外,为了使语用与其他语句保持一致,它们以
.
结尾,而 Soufflé 中它们没有。
- 使用
- 修复了 CSV 和 JSON 文件中的解析错误,主要是字符串解析(包括/排除引号)。
版本 0.2.1
- 添加了类型间一致性的特质。
- 添加了用于减少重复的谓词缓存。
- 完成了关系的数据输入和输出。
- 清理了错误模块,并添加了错误构造函数。
版本 0.2.0
- 新的内部结构和库布局。
- 减少克隆,但仍然太多。
- 完成了顶级文档,还有更多内容。
版本 0.1.0
- 未发布,仅用于内部验证。
版本 0.1.0-dev
- 初始发布,主要为了通过 crates.io 验证 CI 基础设施。
依赖项
~2.6–5MB
~84K SLoC