7个版本

0.2.5 2022年2月16日
0.2.4 2022年1月19日
0.1.0-dev2021年12月3日

#1#simplistic

每月22次下载

自定义许可

430KB
7.5K SLoC

Rust 7K SLoC // 0.1% comments JavaScript 652 SLoC // 0.0% comments Pest 262 SLoC // 0.1% comments Handlebars 24 SLoC

Crate asdi

另一个简化的Datalog实现(Rust版)。

MIT License Minimum Rust Version crates.io docs.rs Book Build Audit

此包提供了一种数据模型,用于在内存中表示Datalog程序,一个用于文本表示的解析器,以及一些评估实现。更多信息请参阅ASDI书籍

文本表示解析器是一个独立的功能,因此如果您只需要使用API构建和评估程序,可以选择不使用Pest解析器和支持。

状态

  1. API 主要稳定,下一步将使构建API更易于使用。
  2. 文档 有良好的顶级文档,但到目前为止内容很少。
  3. 解析器 完全支持核心语言以及编译指令,需要更多单元测试。
  4. I/O 关系现在连接到文件输入/输出编译指令,io 模块包括读取/写入关系的特性和基本的JSON和CSV支持。
  5. 评估 目前有一个简单实现和一个分层半简单实现。

示例

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 的变体重命名为 RelationalArithmetic,以传达意义而非仅仅类型。
  • Relations 重命名为 RelationSet,将 Rules 重命名为 RuleSet
  • PredicateSet 重命名为 NameReferenceSet,并用于变量;这还增加了用于清晰性的 AttributeNameRef 类型。
  • 更新了 highlight.js 的 Datalog 语言定义,以适应注释和运算符的变化。
  • 将更多 "比较(运算符)?" 的用法替换为算术文字。
  • 修复了更多的 Clippy 警告。

版本 0.2.2

  • 对语法进行了修改,使其与传统 Datalog 以及 Soufflé 更加紧密地一致。
    • 使用 % 替代 # 用于行注释,
    • 增加了 /**/ 用于块注释,
    • 不再需要在布尔常量 truefalse 上使用 @ 前缀,
    • 使用 . 替代 @ 用于语用。
    • ASDI 仍然使用单独的 assertinfer 语用,而不是 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