|
|
@ -15,10 +15,10 @@ use smallvec::SmallVec;
|
|
|
|
use smartstring::SmartString;
|
|
|
|
use smartstring::SmartString;
|
|
|
|
|
|
|
|
|
|
|
|
use crate::data::program::{
|
|
|
|
use crate::data::program::{
|
|
|
|
AlgoRuleArg, MagicAlgoApply, MagicAlgoRuleArg, MagicAtom, MagicProgram, MagicRelationApplyAtom,
|
|
|
|
AlgoRuleArg, MagicAlgoApply, MagicAlgoRuleArg, MagicAtom, MagicInlineRule, MagicProgram,
|
|
|
|
MagicInlineRule, MagicRuleApplyAtom, MagicRulesOrAlgo, MagicSymbol, NormalFormAlgoOrRules,
|
|
|
|
MagicRelationApplyAtom, MagicRuleApplyAtom, MagicRulesOrAlgo, MagicSymbol,
|
|
|
|
NormalFormAtom, NormalFormProgram, NormalFormInlineRule, StratifiedMagicProgram,
|
|
|
|
NormalFormAlgoOrRules, NormalFormAtom, NormalFormInlineRule, NormalFormProgram,
|
|
|
|
StratifiedNormalFormProgram,
|
|
|
|
StratifiedMagicProgram, StratifiedNormalFormProgram,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
use crate::data::symb::{Symbol, PROG_ENTRY};
|
|
|
|
use crate::data::symb::{Symbol, PROG_ENTRY};
|
|
|
|
use crate::parse::SourceSpan;
|
|
|
|
use crate::parse::SourceSpan;
|
|
|
@ -51,9 +51,10 @@ impl StratifiedNormalFormProgram {
|
|
|
|
let mut collected = vec![];
|
|
|
|
let mut collected = vec![];
|
|
|
|
for prog in self.0 {
|
|
|
|
for prog in self.0 {
|
|
|
|
prog.exempt_aggr_rules_for_magic_sets(&mut exempt_rules);
|
|
|
|
prog.exempt_aggr_rules_for_magic_sets(&mut exempt_rules);
|
|
|
|
|
|
|
|
let down_stream_rules = prog.get_downstream_rules();
|
|
|
|
let adorned = prog.adorn(&exempt_rules, tx)?;
|
|
|
|
let adorned = prog.adorn(&exempt_rules, tx)?;
|
|
|
|
collected.push(adorned.magic_rewrite());
|
|
|
|
collected.push(adorned.magic_rewrite());
|
|
|
|
exempt_rules.extend(prog.get_downstream_rules());
|
|
|
|
exempt_rules.extend(down_stream_rules);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(StratifiedMagicProgram(collected))
|
|
|
|
Ok(StratifiedMagicProgram(collected))
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -282,7 +283,7 @@ impl NormalFormProgram {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
downstream_rules
|
|
|
|
downstream_rules
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fn adorn(&self, upstream_rules: &BTreeSet<Symbol>, tx: &SessionTx<'_>) -> Result<MagicProgram> {
|
|
|
|
fn adorn(self, upstream_rules: &BTreeSet<Symbol>, tx: &SessionTx<'_>) -> Result<MagicProgram> {
|
|
|
|
let rules_to_rewrite: BTreeSet<_> = self
|
|
|
|
let rules_to_rewrite: BTreeSet<_> = self
|
|
|
|
.prog
|
|
|
|
.prog
|
|
|
|
.keys()
|
|
|
|
.keys()
|
|
|
@ -310,6 +311,7 @@ impl NormalFormProgram {
|
|
|
|
algo: MagicAlgoApply {
|
|
|
|
algo: MagicAlgoApply {
|
|
|
|
span: algo_apply.span,
|
|
|
|
span: algo_apply.span,
|
|
|
|
algo: algo_apply.algo.clone(),
|
|
|
|
algo: algo_apply.algo.clone(),
|
|
|
|
|
|
|
|
algo_impl: algo_apply.algo_impl.clone(),
|
|
|
|
rule_args: algo_apply
|
|
|
|
rule_args: algo_apply
|
|
|
|
.rule_args
|
|
|
|
.rule_args
|
|
|
|
.iter()
|
|
|
|
.iter()
|
|
|
@ -382,7 +384,7 @@ impl NormalFormProgram {
|
|
|
|
})
|
|
|
|
})
|
|
|
|
.try_collect()?,
|
|
|
|
.try_collect()?,
|
|
|
|
options: algo_apply.options.clone(),
|
|
|
|
options: algo_apply.options.clone(),
|
|
|
|
arity: algo_apply.arity
|
|
|
|
arity: algo_apply.arity,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
);
|
|
|
|
);
|
|
|
|