new API
parent
18cd63014d
commit
c9917c8bcd
@ -0,0 +1,147 @@
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use smallvec::SmallVec;
|
||||
use smartstring::{LazyCompact, SmartString};
|
||||
|
||||
use crate::data::attr::Attribute;
|
||||
use crate::data::expr::{Expr, Op};
|
||||
use crate::data::keyword::Keyword;
|
||||
use crate::data::value::DataValue;
|
||||
use crate::{EntityId, Validity};
|
||||
|
||||
#[derive(Clone, Debug, Default)]
|
||||
pub enum Aggregation {
|
||||
#[default]
|
||||
Todo,
|
||||
}
|
||||
|
||||
pub(crate) struct InputProgram {
|
||||
prog: BTreeMap<Keyword, Vec<InputRule>>,
|
||||
}
|
||||
|
||||
pub(crate) struct StratifiedNormalFormProgram(Vec<NormalFormProgram>);
|
||||
|
||||
pub(crate) struct NormalFormProgram {
|
||||
prog: BTreeMap<Keyword, Vec<NormalFormRule>>,
|
||||
}
|
||||
|
||||
pub(crate) struct StratifiedMagicProgram(Vec<MagicProgram>);
|
||||
|
||||
pub(crate) struct MagicProgram {
|
||||
prog: BTreeMap<MagicKeyword, Vec<MagicRule>>,
|
||||
keep_rules: Vec<Keyword>,
|
||||
}
|
||||
|
||||
enum MagicKeyword {
|
||||
Muggle {
|
||||
name: SmartString<LazyCompact>,
|
||||
},
|
||||
Magic {
|
||||
name: SmartString<LazyCompact>,
|
||||
adornment: SmallVec<[bool; 8]>,
|
||||
},
|
||||
Input {
|
||||
to: SmartString<LazyCompact>,
|
||||
adornment: SmallVec<[bool; 8]>,
|
||||
},
|
||||
Sup {
|
||||
deriving: SmartString<LazyCompact>,
|
||||
rule_idx: u16,
|
||||
sup_idx: u16,
|
||||
},
|
||||
}
|
||||
|
||||
pub(crate) struct InputRule {
|
||||
head: Vec<Keyword>,
|
||||
aggr: Vec<Option<Aggregation>>,
|
||||
body: Vec<InputAtom>,
|
||||
vld: Validity,
|
||||
}
|
||||
|
||||
pub(crate) struct NormalFormRule {
|
||||
head: Vec<Keyword>,
|
||||
aggr: Vec<Option<Aggregation>>,
|
||||
body: Vec<NormalFormAtom>,
|
||||
vld: Validity,
|
||||
}
|
||||
|
||||
pub(crate) struct MagicRule {
|
||||
head: Vec<Keyword>,
|
||||
aggr: Vec<Option<Aggregation>>,
|
||||
body: Vec<MagicAtom>,
|
||||
vld: Validity,
|
||||
}
|
||||
|
||||
pub(crate) enum InputAtom {
|
||||
AttrTriple(InputAttrTripleAtom),
|
||||
Rule(InputRuleApplyAtom),
|
||||
Predicate(Expr),
|
||||
Negation(Box<InputAtom>),
|
||||
Conjunction(Vec<InputAtom>),
|
||||
Disjunction(Vec<InputAtom>),
|
||||
Unification(Unification),
|
||||
}
|
||||
|
||||
pub(crate) enum NormalFormAtom {
|
||||
AttrTriple(NormalFormAttrTripleAtom),
|
||||
Rule(NormalFormRuleApplyAtom),
|
||||
Predicate(Expr),
|
||||
Negation(Box<NormalFormAtom>),
|
||||
Unification(Unification),
|
||||
}
|
||||
|
||||
pub(crate) enum MagicAtom {
|
||||
AttrTriple(MagicAttrTripleAtom),
|
||||
Rule(MagicRuleApplyAtom),
|
||||
Predicate(Expr),
|
||||
Negation(Box<MagicAtom>),
|
||||
Unification(Unification),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct InputAttrTripleAtom {
|
||||
pub(crate) attr: Attribute,
|
||||
pub(crate) entity: InputTerm<EntityId>,
|
||||
pub(crate) value: InputTerm<DataValue>,
|
||||
}
|
||||
|
||||
pub struct NormalFormAttrTripleAtom {
|
||||
attr: Attribute,
|
||||
entity: Keyword,
|
||||
value: Keyword,
|
||||
}
|
||||
|
||||
pub(crate) struct MagicAttrTripleAtom {
|
||||
attr: Attribute,
|
||||
entity: Keyword,
|
||||
value: Keyword,
|
||||
entity_is_bound: bool,
|
||||
value_is_bound: bool,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct InputRuleApplyAtom {
|
||||
pub(crate) name: Keyword,
|
||||
pub(crate) args: Vec<InputTerm<DataValue>>,
|
||||
}
|
||||
|
||||
pub struct NormalFormRuleApplyAtom {
|
||||
name: Keyword,
|
||||
args: Vec<Keyword>,
|
||||
}
|
||||
|
||||
pub(crate) struct MagicRuleApplyAtom {
|
||||
name: MagicKeyword,
|
||||
args: Vec<Keyword>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum InputTerm<T> {
|
||||
Var(Keyword),
|
||||
Const(T),
|
||||
}
|
||||
|
||||
pub struct Unification {
|
||||
binding: Keyword,
|
||||
expr: Expr,
|
||||
}
|
Loading…
Reference in New Issue