datalog_ast
Abstract Syntax Tree types for Datalog programs.
Overview
datalog_ast provides a set of Rust data structures for representing Datalog programs. It is designed as a shared, reusable component that can be used across parsers, evaluators, and analyzers for consistency in Datalog program representation.
Features
- Core AST Types:
Term,Atom,Constraint,BodyPredicate,Rule, andProgram - Stratified Negation: Support for negated literals in rule bodies
- Comparison Constraints: Full support for arithmetic comparisons (
<,<=,>,>=,==,!=) - Safety Analysis: Built-in methods to check rule and program safety
- Relation Classification: Automatic identification of EDB (extensional) and IDB (intensional) relations
- Zero Dependencies: Pure Rust implementation with no external dependencies
Installation
Add this to your Cargo.toml:
[]
= "0.1"
Quick Start
use ;
// Build a simple transitive closure program:
// reach(x) :- source(x).
// reach(y) :- reach(x), edge(x, y).
let mut program = new;
// reach(x) :- source(x).
program.add_rule;
// reach(y) :- reach(x), edge(x, y).
program.add_rule;
// Analyze the program
assert!;
assert_eq!;
assert_eq!;
Core Types
Term
Represents variables, constants, or placeholders in Datalog:
use Term;
let var = Variable;
let constant = Constant;
let placeholder = Placeholder; // Represents "_"
assert!;
assert!;
Atom
Represents a relation with arguments, like edge(x, y):
use ;
let atom = new;
assert_eq!;
assert_eq!;
assert!;
Constraint
Represents comparison constraints in rule bodies:
use ;
let constraint = LessThan;
Available constraint types:
Equal,NotEqualLessThan,LessOrEqualGreaterThan,GreaterOrEqual
BodyPredicate
Represents positive or negated atoms in rule bodies (for stratified negation):
use ;
let positive = Positive;
let negated = Negated;
assert!;
assert!;
Rule
Represents a Datalog rule with head, body predicates, and constraints:
use ;
// path(x, z) :- edge(x, y), path(y, z), x != z.
let rule = new;
assert!;
assert!;
Program
Represents a complete Datalog program:
use Program;
let program = new;
// Program analysis methods:
// - program.idbs() - Get IDB (derived) relations
// - program.edbs() - Get EDB (base) relations
// - program.all_relations() - Get all relation names
// - program.is_safe() - Check if all rules are safe
// - program.recursive_rules() - Get recursive rules
Safety
A Datalog rule is safe if every variable in the head appears in at least one positive body atom. This library provides built-in safety checking:
use ;
// Safe rule: y appears in edge(x, y)
let safe_rule = new_simple;
assert!;
// Unsafe rule: z doesn't appear in any positive body atom
let unsafe_rule = new_simple;
assert!;
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.