@@ -84,11 +84,6 @@ pub(super) fn compute<T: FactTypes>(
84
84
. map ( |& ( origin, point) | ( ( origin, point) , ( ) ) ) ,
85
85
) ;
86
86
87
- // variable and index to compute the subsets of placeholders
88
- let subset_placeholder =
89
- iteration. variable :: < ( T :: Origin , T :: Origin , T :: Point ) > ( "subset_placeholder" ) ;
90
- let subset_placeholder_o2p = iteration. variable_indistinct ( "subset_placeholder_o2p" ) ;
91
-
92
87
// output relations: illegal accesses errors, and illegal subset relations errors
93
88
let errors = iteration. variable ( "errors" ) ;
94
89
let subset_errors = iteration. variable :: < ( T :: Origin , T :: Origin , T :: Point ) > ( "subset_errors" ) ;
@@ -123,12 +118,6 @@ pub(super) fn compute<T: FactTypes>(
123
118
. elements
124
119
. retain ( |& ( origin1, origin2, _) | origin1 != origin2) ;
125
120
126
- subset_placeholder
127
- . recent
128
- . borrow_mut ( )
129
- . elements
130
- . retain ( |& ( origin1, origin2, _) | origin1 != origin2) ;
131
-
132
121
// Remap fields to re-index by keys, to prepare the data needed by the rules below.
133
122
subset_o1p. from_map ( & subset, |& ( origin1, origin2, point) | {
134
123
( ( origin1, point) , origin2)
@@ -137,10 +126,6 @@ pub(super) fn compute<T: FactTypes>(
137
126
( ( origin2, point) , origin1)
138
127
} ) ;
139
128
140
- subset_placeholder_o2p. from_map ( & subset_placeholder, |& ( origin1, origin2, point) | {
141
- ( ( origin2, point) , origin1)
142
- } ) ;
143
-
144
129
origin_contains_loan_on_entry_op
145
130
. from_map ( & origin_contains_loan_on_entry, |& ( origin, loan, point) | {
146
131
( ( origin, point) , loan)
@@ -223,6 +208,9 @@ pub(super) fn compute<T: FactTypes>(
223
208
// Here again, this join acts as a pure filter and could be a more efficient leapjoin.
224
209
// However, similarly to the `origin_live_on_entry` example described above, the
225
210
// leapjoin with a single `filter_with` leaper would currently not be well-formed.
211
+ // We don't explictly need to materialize `loan_live_at` either, and that doesn't
212
+ // change the well-formedness situation, so we still materialize it (since that also
213
+ // helps in testing).
226
214
//
227
215
// errors(Loan, Point) :-
228
216
// loan_invalidated_at(Loan, Point),
@@ -233,44 +221,20 @@ pub(super) fn compute<T: FactTypes>(
233
221
|& ( loan, point) , _, _| ( loan, point) ,
234
222
) ;
235
223
236
- // Rule 9: compute the subsets of the placeholder origins, at a given point.
237
- //
238
- // subset_placeholder(Origin1, Origin2, Point) :-
239
- // subset(Origin1, Origin2, Point),
240
- // placeholder_origin(Origin1).
241
- subset_placeholder. from_leapjoin (
242
- & subset_o1p,
243
- (
244
- placeholder_origin. extend_with ( |& ( ( origin1, _point) , _origin2) | origin1) ,
245
- // remove symmetries:
246
- datafrog:: ValueFilter :: from ( |& ( ( origin1, _point) , origin2) , _| {
247
- origin1 != origin2
248
- } ) ,
249
- ) ,
250
- |& ( ( origin1, point) , origin2) , _| ( origin1, origin2, point) ,
251
- ) ;
252
-
253
- // Rule 10: compute the subset transitive closure of placeholder origins.
254
- //
255
- // subset_placeholder(Origin1, Origin3, Point) :-
256
- // subset_placeholder(Origin1, Origin2, Point),
257
- // subset(Origin2, Origin3, Point).
258
- subset_placeholder. from_join (
259
- & subset_placeholder_o2p,
260
- & subset_o1p,
261
- |& ( _origin2, point) , & origin1, & origin3| ( origin1, origin3, point) ,
262
- ) ;
263
-
264
- // Rule 11: compute illegal subset relations errors, i.e. the undeclared subsets
224
+ // Rule 9: compute illegal subset relations errors, i.e. the undeclared subsets
265
225
// between two placeholder origins.
226
+ // Here as well, WF-ness prevents this join from being a filter-only leapjoin. It
227
+ // doesn't matter much, as `placeholder_origin` is single-value relation.
266
228
//
267
- // subset_errors(Origin1, Origin2, Point) :-
268
- // subset_placeholder(Origin1, Origin2, Point),
229
+ // subset_error(Origin1, Origin2, Point) :-
230
+ // subset(Origin1, Origin2, Point),
231
+ // placeholder_origin(Origin1),
269
232
// placeholder_origin(Origin2),
270
233
// !known_subset(Origin1, Origin2).
271
234
subset_errors. from_leapjoin (
272
- & subset_placeholder ,
235
+ & subset ,
273
236
(
237
+ placeholder_origin. extend_with ( |& ( origin1, _origin2, _point) | origin1) ,
274
238
placeholder_origin. extend_with ( |& ( _origin1, origin2, _point) | origin2) ,
275
239
known_subset. filter_anti ( |& ( origin1, origin2, _point) | ( origin1, origin2) ) ,
276
240
// remove symmetries:
0 commit comments