Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. // Extensional predicates, and their indices
  2.  
  3. let borrow_region: Relation<(Origin, Loan, Point)> = Vec::new().into();
  4.  
  5. // Note: `cfg_edge_p` is an indexed version of the input facts `cfg_edge`
  6. let cfg_edge_p: Relation<(Point, Point)> = Vec::new().into();
  7.  
  8. let invalidates: Relation<((Loan, Point), ())> = Vec::new().into();
  9. let killed: Relation<(Loan, Point)> = Vec::new().into();
  10. let outlives: Relation<(Origin, Origin, Point)> = Vec::new().into();
  11. let region_live_at: Relation<((Origin, Point), ())> = Vec::new().into();
  12.  
  13. // `errors` inferred as the output relation
  14. let errors = {
  15.  
  16. let mut iteration = Iteration::new();
  17. // Intensional predicates, and their indices
  18.  
  19. let borrow_live_at = iteration.variable::<((Loan, Point), ())>("borrow_live_at");
  20. let errors = iteration.variable::<(Loan, Point)>("errors");
  21. let requires = iteration.variable::<(Origin, Loan, Point)>("requires");
  22.  
  23. // Note: `requires_lp` is an indexed version of the `requires` relation
  24. let requires_lp = iteration.variable::<((Loan, Point), Origin)>("requires_lp");
  25.  
  26. // Note: `requires_op` is an indexed version of the `requires` relation
  27. let requires_op = iteration.variable::<((Origin, Point), Loan)>("requires_op");
  28. let requires_step_6_1 = iteration.variable("requires_step_6_1");
  29. let requires_step_6_2 = iteration.variable("requires_step_6_2");
  30. let subset = iteration.variable::<(Origin, Origin, Point)>("subset");
  31.  
  32. // Note: `subset_o1p` is an indexed version of the `subset` relation
  33. let subset_o1p = iteration.variable::<((Origin, Point), Origin)>("subset_o1p");
  34.  
  35. // Note: `subset_o2p` is an indexed version of the `subset` relation
  36. let subset_o2p = iteration.variable::<((Origin, Point), Origin)>("subset_o2p");
  37.  
  38. // Note: `subset_p` is an indexed version of the `subset` relation
  39. let subset_p = iteration.variable::<(Point, (Origin, Origin))>("subset_p");
  40. let subset_step_3_1 = iteration.variable("subset_step_3_1");
  41. let subset_step_3_2 = iteration.variable("subset_step_3_2");
  42.  
  43. // R01: subset(O1, O2, P) :- outlives(O1, O2, P).
  44. subset.extend(outlives.iter().clone());
  45.  
  46. // R04: requires(O, L, P) :- borrow_region(O, L, P).
  47. requires.extend(borrow_region.iter().clone());
  48.  
  49. while iteration.changed() {
  50.  
  51. // Index maintenance
  52. requires_op.from_map(&requires, |&(o, l, p)| ((o, p), l));
  53. requires_lp.from_map(&requires, |&(o, l, p)| ((l, p), o));
  54. subset_o2p.from_map(&subset, |&(o1, o2, p)| ((o2, p), o1));
  55. subset_o1p.from_map(&subset, |&(o1, o2, p)| ((o1, p), o2));
  56. subset_p.from_map(&subset, |&(o1, o2, p)| (p, (o1, o2)));
  57.  
  58. // Rules
  59.  
  60. // R01: subset(O1, O2, P) :- outlives(O1, O2, P).
  61. // `outlives` is a static input, already loaded into `subset`.
  62.  
  63. // R02: subset(O1, O3, P) :- subset(O1, O2, P), subset(O2, O3, P).
  64. subset.from_join(&subset_o2p, &subset_o1p, |&(_o2, p), &o1, &o3| (o1, o3, p));
  65.  
  66. // R03: subset(O1, O2, Q) :- subset(O1, O2, P), cfg_edge(P, Q), region_live_at(O1, Q), region_live_at(O2, Q).
  67. subset_step_3_1.from_join(&subset_p, &cfg_edge_p, |&_p, &(o1, o2), &q| ((o1, q), o2));
  68. subset_step_3_2.from_join(&subset_step_3_1, &region_live_at, |&(o1, q), &o2, _| ((o2, q), o1));
  69. subset.from_join(&subset_step_3_2, &region_live_at, |&(o2, q), &o1, _| (o1, o2, q));
  70.  
  71. // R04: requires(O, L, P) :- borrow_region(O, L, P).
  72. // `borrow_region` is a static input, already loaded into `requires`.
  73.  
  74. // R05: requires(O2, L, P) :- requires(O1, L, P), subset(O1, O2, P).
  75. requires.from_join(&requires_op, &subset_o1p, |&(_o1, p), &l, &o2| (o2, l, p));
  76.  
  77. // R06: requires(O, L, Q) :- requires(O, L, P), !killed(L, P), cfg_edge(P, Q), region_live_at(O, Q).
  78. requires_step_6_1.from_antijoin(&requires_lp, &killed, |&(l, p), &o| (p, (l, o)));
  79. requires_step_6_2.from_join(&requires_step_6_1, &cfg_edge_p, |&_p, &(l, o), &q| ((o, q), l));
  80. requires.from_join(&requires_step_6_2, &region_live_at, |&(o, q), &l, _| (o, l, q));
  81.  
  82. // R07: borrow_live_at(L, P) :- requires(O, L, P), region_live_at(O, P).
  83. borrow_live_at.from_join(&requires_op, &region_live_at, |&(_o, p), &l, _| ((l, p), ()));
  84.  
  85. // R08: errors(L, P) :- borrow_live_at(L, P), invalidates(L, P).
  86. errors.from_join(&borrow_live_at, &invalidates, |&(l, p), _, _| (l, p));
  87. }
  88.  
  89. errors.complete()
  90. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement