1
1
extern crate datafrog;
2
- use datafrog:: Iteration ;
2
+ use datafrog:: { Iteration , Relation } ;
3
3
4
4
type Region = u32 ;
5
5
type Borrow = u32 ;
@@ -14,15 +14,15 @@ fn main() {
14
14
let subset = iteration1. variable :: < ( Region , Region , Point ) > ( "subset" ) ;
15
15
16
16
// different indices for `subset`.
17
- let subset_r1p = iteration1. variable :: < ( ( Region , Point ) , Region ) > ( "subset_r1p" ) ;
18
- let subset_r2p = iteration1. variable :: < ( ( Region , Point ) , Region ) > ( "subset_r2p" ) ;
19
- let subset_p = iteration1. variable :: < ( Point , ( Region , Region ) ) > ( "subset_p" ) ;
17
+ let subset_r1p = iteration1. variable :: < ( Region , Point , Region ) > ( "subset_r1p" ) ;
18
+ let subset_r2p = iteration1. variable :: < ( Region , Point , Region ) > ( "subset_r2p" ) ;
19
+ let subset_p = iteration1. variable :: < ( Point , Region , Region ) > ( "subset_p" ) ;
20
20
21
21
// temporaries as we perform a multi-way join.
22
- let subset_1 = iteration1. variable :: < ( ( Region , Point ) , Region ) > ( "subset_1" ) ;
23
- let subset_2 = iteration1. variable :: < ( ( Region , Point ) , Region ) > ( "subset_2" ) ;
22
+ let subset_1 = iteration1. variable :: < ( Region , Point , Region ) > ( "subset_1" ) ;
23
+ let subset_2 = iteration1. variable :: < ( Region , Point , Region ) > ( "subset_2" ) ;
24
24
25
- let region_live_at = iteration1. variable :: < ( ( Region , Point ) , ( ) ) > ( "region_live_at" ) ;
25
+ let region_live_at = iteration1. variable :: < ( Region , Point ) > ( "region_live_at" ) ;
26
26
let cfg_edge_p = iteration1. variable :: < ( Point , Point ) > ( "cfg_edge_p" ) ;
27
27
28
28
// load initial facts.
@@ -33,29 +33,29 @@ fn main() {
33
33
// .. and then start iterating rules!
34
34
while iteration1. changed ( ) {
35
35
// remap fields to re-index by keys.
36
- subset_r1p. from_map ( & subset, |& ( r1, r2, p) | ( ( r1, p) , r2) ) ;
37
- subset_r2p. from_map ( & subset, |& ( r1, r2, p) | ( ( r2, p) , r1) ) ;
38
- subset_p. from_map ( & subset, |& ( r1, r2, p) | ( p, ( r1, r2) ) ) ;
36
+ subset_r1p. from_map ( & subset, |& ( r1, r2, p) | ( r1, p, r2) ) ;
37
+ subset_r2p. from_map ( & subset, |& ( r1, r2, p) | ( r2, p, r1) ) ;
38
+ subset_p. from_map ( & subset, |& ( r1, r2, p) | ( p, r1, r2) ) ;
39
39
40
40
// R0: subset(R1, R2, P) :- outlives(R1, R2, P).
41
41
// Already loaded; outlives is static.
42
42
43
43
// R1: subset(R1, R3, P) :-
44
44
// subset(R1, R2, P),
45
45
// subset(R2, R3, P).
46
- subset. from_join ( & subset_r2p, & subset_r1p, |& ( _r2, p) , & r1, & r3 | ( r1, r3, p) ) ;
46
+ subset. from_join ( & subset_r2p, & subset_r1p, |( _r2, p) , ( r1, ) , ( r3 , ) | ( r1, r3, p) ) ;
47
47
48
48
// R2: subset(R1, R2, Q) :-
49
49
// subset(R1, R2, P),
50
50
// cfg_edge(P, Q),
51
51
// region_live_at(R1, Q),
52
52
// region_live_at(R2, Q).
53
53
54
- subset_1. from_join ( & subset_p, & cfg_edge_p, |& _p , & ( r1, r2) , & q | ( ( r1, q) , r2) ) ;
55
- subset_2. from_join ( & subset_1, & region_live_at, |& ( r1, q) , & r2, & ( ) | {
56
- ( ( r2, q) , r1)
54
+ subset_1. from_join ( & subset_p, & cfg_edge_p, |_p : ( Point , ) , ( r1, r2) , ( q , ) | ( r1, q, r2) ) ;
55
+ subset_2. from_join ( & subset_1, & region_live_at, |( r1, q) , ( r2, ) , ( ) | {
56
+ ( r2, q, r1)
57
57
} ) ;
58
- subset. from_join ( & subset_2, & region_live_at, |& ( r2, q) , & r1, & ( ) | ( r1, r2, q) ) ;
58
+ subset. from_join ( & subset_2, & region_live_at, |( r2, q) , ( r1, ) , ( ) | ( r1, r2, q) ) ;
59
59
}
60
60
61
61
subset_r1p. complete ( )
@@ -69,41 +69,41 @@ fn main() {
69
69
let requires = iteration2. variable :: < ( Region , Borrow , Point ) > ( "requires" ) ;
70
70
requires. insert ( Vec :: new ( ) . into ( ) ) ;
71
71
72
- let requires_rp = iteration2. variable :: < ( ( Region , Point ) , Borrow ) > ( "requires_rp" ) ;
73
- let requires_bp = iteration2. variable :: < ( ( Borrow , Point ) , Region ) > ( "requires_bp" ) ;
72
+ let requires_rp = iteration2. variable :: < ( Region , Point , Borrow ) > ( "requires_rp" ) ;
73
+ let requires_bp = iteration2. variable :: < ( Borrow , Point , Region ) > ( "requires_bp" ) ;
74
74
75
- let requires_1 = iteration2. variable :: < ( Point , ( Borrow , Region ) ) > ( "requires_1" ) ;
76
- let requires_2 = iteration2. variable :: < ( ( Region , Point ) , Borrow ) > ( "requires_2" ) ;
75
+ let requires_1 = iteration2. variable :: < ( Point , Borrow , Region ) > ( "requires_1" ) ;
76
+ let requires_2 = iteration2. variable :: < ( Region , Point , Borrow ) > ( "requires_2" ) ;
77
77
78
- let subset_r1p = iteration2. variable :: < ( ( Region , Point ) , Region ) > ( "subset_r1p" ) ;
78
+ let subset_r1p = iteration2. variable :: < ( Region , Point , Region ) > ( "subset_r1p" ) ;
79
79
subset_r1p. insert ( subset) ;
80
80
81
- let killed = Vec :: new ( ) . into ( ) ;
82
- let region_live_at = iteration2. variable :: < ( ( Region , Point ) , ( ) ) > ( "region_live_at" ) ;
81
+ let killed: Relation < ( Borrow , Point ) > = Vec :: new ( ) . into ( ) ;
82
+ let region_live_at = iteration2. variable :: < ( Region , Point ) > ( "region_live_at" ) ;
83
83
let cfg_edge_p = iteration2. variable :: < ( Point , Point ) > ( "cfg_edge_p" ) ;
84
84
85
85
// .. and then start iterating rules!
86
86
while iteration2. changed ( ) {
87
- requires_rp. from_map ( & requires, |& ( r, b, p) | ( ( r, p) , b) ) ;
88
- requires_bp. from_map ( & requires, |& ( r, b, p) | ( ( b, p) , r) ) ;
87
+ requires_rp. from_map ( & requires, |& ( r, b, p) | ( r, p, b) ) ;
88
+ requires_bp. from_map ( & requires, |& ( r, b, p) | ( b, p, r) ) ;
89
89
90
90
// requires(R, B, P) :- borrow_region(R, B, P).
91
91
// Already loaded; borrow_region is static.
92
92
93
93
// requires(R2, B, P) :-
94
94
// requires(R1, B, P),
95
95
// subset(R1, R2, P).
96
- requires. from_join ( & requires_rp, & subset_r1p, |& ( _r1, p) , & b , & r2 | ( r2, b, p) ) ;
96
+ requires. from_join ( & requires_rp, & subset_r1p, |( _r1, p) , ( b , ) , ( r2 , ) | ( r2, b, p) ) ;
97
97
98
98
// requires(R, B, Q) :-
99
99
// requires(R, B, P),
100
100
// !killed(B, P),
101
101
// cfg_edge(P, Q),
102
102
// (region_live_at(R, Q); universal_region(R)).
103
103
104
- requires_1. from_antijoin ( & requires_bp, & killed, |& ( b, p) , & r | ( p, ( b, r) ) ) ;
105
- requires_2. from_join ( & requires_1, & cfg_edge_p, |& _p , & ( b, r) , & q | ( ( r, q) , b) ) ;
106
- requires. from_join ( & requires_2, & region_live_at, |& ( r, q) , & b , & ( ) | ( r, b, q) ) ;
104
+ requires_1. from_antijoin ( & requires_bp, & killed, |( b, p, r ) | ( p, b, r) ) ;
105
+ requires_2. from_join ( & requires_1, & cfg_edge_p, |_p : ( Point , ) , ( b, r) , ( q , ) | ( r, q, b) ) ;
106
+ requires. from_join ( & requires_2, & region_live_at, |( r, q) , ( b , ) , ( ) | ( r, b, q) ) ;
107
107
}
108
108
109
109
requires. complete ( )
0 commit comments