@@ -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