Skip to content

Commit 689d6f0

Browse files
authored
Rename apart incremental predicates (#753)
2 parents d9329d3 + 8d0b244 commit 689d6f0

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

nemo/src/rule_model/pipeline/transformations/incremental.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,24 @@ impl TransformationIncremental {
168168
Variable::universal(&name)
169169
}
170170

171+
/// Change the predicate of a given [ImportDirective] such that it is unique.
172+
fn unique_import_directive(directive: &ImportDirective, id: &mut usize) -> ImportDirective {
173+
let predicate = Tag::new(format!("_{}_{}", directive.predicate(), id));
174+
*id += 1;
175+
176+
let mut result = directive.clone();
177+
result.set_predicate(predicate);
178+
179+
result
180+
}
181+
171182
/// Given a rule with inlined import predicates,
172183
/// compute a rule that includes the corresponding import statements.
173184
fn incremental_rule(
174185
rule: &Rule,
175186
incremental_predicates: &HashMap<Tag, &ImportDirective>,
187+
derived_predicates: &HashSet<Tag>,
188+
id: &mut usize,
176189
) -> Rule {
177190
let mut result = rule.clone();
178191

@@ -195,7 +208,13 @@ impl TransformationIncremental {
195208
}
196209
}
197210

198-
let clause = ImportClause::new(import.clone(), variables);
211+
let import = if !derived_predicates.contains(import.predicate()) {
212+
Self::unique_import_directive(import, id)
213+
} else {
214+
import.clone()
215+
};
216+
217+
let clause = ImportClause::new(import, variables);
199218

200219
import_clauses.push(clause);
201220
return false;
@@ -222,6 +241,9 @@ impl ProgramTransformation for TransformationIncremental {
222241
let mut commit = program.fork();
223242

224243
let incremental_predicates = Self::incremental_predicates(program);
244+
let derived_predicates = program.derived_predicates();
245+
246+
let mut name_id: usize = 0;
225247

226248
for statement in program.statements() {
227249
match statement {
@@ -230,7 +252,12 @@ impl ProgramTransformation for TransformationIncremental {
230252
.body_positive()
231253
.any(|atom| incremental_predicates.contains_key(&atom.predicate()))
232254
{
233-
let new_rule = Self::incremental_rule(rule, &incremental_predicates);
255+
let new_rule = Self::incremental_rule(
256+
rule,
257+
&incremental_predicates,
258+
&derived_predicates,
259+
&mut name_id,
260+
);
234261

235262
commit.add_rule(new_rule);
236263
} else {

0 commit comments

Comments
 (0)