nova_interpreter/parser/
ruleset.rs

1#[derive(Debug, Clone)]
2pub struct Rule {
3    pub conditions: Box<[(usize, usize)]>,
4    pub multiplicities: Box<[(usize, usize)]>,
5}
6
7impl Rule {
8    pub fn is_fact(&self) -> bool {
9        self.conditions.len() == 0
10    }
11
12    pub fn is_rule(&self) -> bool {
13        !self.is_fact()
14    }
15}
16
17#[derive(Debug, Clone)]
18pub struct RuleSet {
19    pub rules: Vec<Rule>,
20    pub facts: Vec<Rule>,
21}
22
23#[derive(Debug, Clone)]
24pub struct BakedRuleset {
25    pub rules: Box<[Rule]>,
26    pub facts: Box<[Rule]>,
27}
28
29impl From<RuleSet> for BakedRuleset {
30    fn from(value: RuleSet) -> Self {
31        BakedRuleset {
32            rules: value.rules.into_boxed_slice(),
33            facts: value.facts.into_boxed_slice(),
34        }
35    }
36}
37
38impl RuleSet {
39    pub fn empty() -> RuleSet {
40        RuleSet {
41            rules: vec![],
42            facts: vec![],
43        }
44    }
45}
46
47impl std::ops::AddAssign for RuleSet {
48    fn add_assign(&mut self, mut rhs: Self) {
49        self.rules.append(&mut rhs.rules);
50        self.facts.append(&mut rhs.facts);
51    }
52}