eqlog 0.9.0

Datalog with equality
Documentation
use crate::flat_eqlog::{FlatInRel, FlatOutRel, FlatRule, IndexSpec};
use std::sync::Arc;

#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub enum Strictness {
    Lazy,
    Strict,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct SetVarName {
    pub stmt_index: usize,
    pub rel: FlatInRel,
    pub index: IndexSpec,
    pub restricted: usize,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct SetVar {
    pub name: SetVarName,
    pub arity: usize,
    pub strictness: Strictness,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct ElVar {
    pub name: Arc<str>,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct GetIndexExpr {
    pub rel: FlatInRel,
    pub index_spec: IndexSpec,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct RestrictExpr {
    pub set: SetVar,
    pub first_column_var: ElVar,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub enum InSetExpr {
    GetIndex(GetIndexExpr),
    Restrict(RestrictExpr),
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct DefineSetStmt {
    pub defined_var: SetVar,
    pub expr: InSetExpr,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct IterStmt {
    pub sets: Vec<SetVar>,
    pub loop_var_el: ElVar,
    pub loop_var_set: SetVar,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct InsertStmt {
    pub rel: FlatOutRel,
    pub args: Vec<ElVar>,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct GuardInhabitedStmt {
    pub sets: Vec<SetVar>,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub enum RamStmt {
    DefineSet(DefineSetStmt),
    Iter(IterStmt),
    Insert(InsertStmt),
    GuardInhabited(GuardInhabitedStmt),
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct RamRoutine {
    pub name: String,
    pub flat_rule: FlatRule,
    pub stmts: Vec<RamStmt>,
}

#[derive(Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
pub struct RamModule {
    pub name: String,
    pub routines: Vec<RamRoutine>,
}