@@ -4,134 +4,125 @@ using namespace datalog;
4
4
5
5
bool test1 ()
6
6
{
7
- enum Kind
8
- {
9
- person = 0 ,
10
- god
7
+ // Relations
8
+ typedef const char * NameType;
9
+ enum Kind {person, god};
10
+ struct Thing : Relation<NameType, Kind>{};
11
+ struct Mortal : Relation<NameType>{};
12
+
13
+ // Rule
14
+ Variable<NameType> x;
15
+ struct PeopleAreMortal : Rule<Mortal, Thing> {} rule{
16
+ atom<Mortal>(x),
17
+ {
18
+ atom<Thing>(x, person)
19
+ }
11
20
};
12
21
13
- struct Thing : Relation<string, Kind>
14
- {
15
- };
22
+ // Extensional data
23
+ NameType socrates{" Socrates" };
24
+ NameType rhiannon{" Rhiannon" };
25
+ NameType albert{" Albert" };
26
+ NameType anna{" Anna" };
27
+ NameType henry{" Henry" };
28
+ NameType ian{" Ian" };
29
+ NameType zeus{" Zeus" };
30
+ NameType persephone{" Persephone" };
31
+ NameType thor{" Thor" };
16
32
17
33
Thing::Set things{
18
- {" Socrates" , person},
19
- {" Rhiannon" , person},
20
- {" Albert" , person},
21
- {" Anna" , person},
22
- {" Henry" , person},
23
- {" Ian" , person},
24
- {" Zeus" , god},
25
- {" Persephone" , god},
26
- {" Thor" , god}};
27
-
28
- struct Mortal : Relation<string>
29
- {
30
- };
31
-
32
- struct AllPeopleAreMortal : Rule<Mortal, Thing>
33
- {
34
- Variable<string> x;
35
-
36
- AllPeopleAreMortal () : Define{
37
- Mortal::Atom{var (x)},
38
F438
td>- {Thing::Atom{var (x), {person}}}} {};
39
- };
34
+ {socrates, person},
35
+ {rhiannon, person},
36
+ {albert, person},
37
+ {anna, person},
38
+ {henry, person},
39
+ {ian, person},
40
+ {zeus, god},
41
+ {persephone, god},
42
+ {thor, god}};
40
43
41
44
State<Thing, Mortal> state{things, {}};
42
45
43
- cout << " before = " ;
44
- state.print (cout);
45
- cout << endl;
46
+ // Apply rule
47
+ RuleSet<PeopleAreMortal> rules{rule};
46
48
47
- RuleSet<AllPeopleAreMortal> rules{} ;
49
+ cout << " before = " << state << endl ;
48
50
state = fixPoint (rules, state);
49
-
50
- cout << " after = " ;
51
- state.print (cout);
52
- cout << endl;
51
+ cout << " after = " << state << endl;
53
52
54
53
return true ;
55
54
}
56
55
57
56
bool test2 ()
58
57
{
59
-
60
- struct Adviser : Relation<string, string>
61
- {
62
- };
63
-
64
- Adviser::Set advisers{
65
- {" Andrew Rice" , " Mistral Contrastin" },
66
- {" Dominic Orchard" , " Mistral Contrastin" },
67
- {" Andy Hopper" , " Andrew Rice" },
68
- {" Alan Mycroft" , " Dominic Orchard" },
69
-
10000
{" David Wheeler" , " Andy Hopper" },
70
- {" Rod Burstall" , " Alan Mycroft" },
71
- {" Robin Milner" , " Alan Mycroft" }};
72
-
73
- struct AcademicAncestor : Relation<string, string>
74
- {
75
- };
58
+ // Relations
59
+ typedef const char * NameType;
60
+ struct Adviser : Relation<NameType, NameType>{};
61
+ struct AcademicAncestor : Relation<NameType, NameType>{};
62
+ struct QueryResult : Relation<NameType>{};
76
63
77
64
// Rule1
78
- struct DirectAdviserIsAnAcademicAncestor : Rule<AcademicAncestor, Adviser>
79
- {
80
- Variable<string> x, y;
65
+ Variable<NameType> x, y, z;
81
66
82
- DirectAdviserIsAnAcademicAncestor () : Define{
83
- AcademicAncestor::Atom{var (x), var (y)},
84
- {Adviser::Atom{var (x), var (y)}}} {};
67
+ struct DirectAcademicAncestor : Rule<AcademicAncestor, Adviser> {} rule1{
68
+ atom<AcademicAncestor>(x, y),
69
+ {
70
+ atom<Adviser>(x, y)
71
+ }
85
72
};
86
73
87
74
// Rule2
88
- struct IndirectAdviserIsAnAcademicAncestor : Rule<AcademicAncestor, Adviser, AcademicAncestor>
89
- {
90
- Variable<string> x, y, z;
91
-
92
- IndirectAdviserIsAnAcademicAncestor () : Define{
93
- AcademicAncestor::Atom{var (x), var (z)},
94
- {Adviser::Atom{var (x), var (y)},
95
- AcademicAncestor::Atom{var (y), var (z)}}} {};
75
+ struct IndirectAcademicAncestor : Rule<AcademicAncestor, Adviser, AcademicAncestor> {} rule2{
76
+ atom<AcademicAncestor>(x, z),
77
+ {
78
+ atom<Adviser>(x, y),
79
+ atom<Adviser>(y, z)
80
+ }
96
81
};
97
82
98
- // Query
99
- struct QueryResult : Relation<string>
100
- {
101
- };
102
-
103
- struct Query : Rule<QueryResult, AcademicAncestor, AcademicAncestor>
104
- {
105
- Variable<string> x, y;
106
-
107
- Query () : Define{
108
- QueryResult::Atom{var (x)},
109
- {AcademicAncestor::Atom{{" Robin Milner" }, var (x)},
110
- AcademicAncestor::Atom{var (x), {" Mistral Contrastin" }}}} {};
111
- };
83
+ // Extensional data
84
+ NameType andrew{" Andrew Rice" };
85
+ NameType mistral{" Mistral Contrastin" };
86
+ NameType dominic{" Dominic Orchard" };
87
+ NameType andy{" Andy Hopper" };
88
+ NameType alan{" Alan Mycroft" };
89
+ NameType rod{" Rod Burstall" };
90
+ NameType robin{" Robin Milner" };
91
+ NameType david{" David Wheeler" };
112
92
93
+ Adviser::Set advisers{
94
+ {andrew, mistral},
95
+ {dominic, mistral},
96
+ {andy, andrew},
97
+ {alan, dominic},
98
+ {david, andy},
99
+ {rod, alan},
100
+ {robin, alan}};
113
101
State<Adviser, AcademicAncestor, QueryResult> state{advisers, {}, {}};
114
102
115
103
// Apply multiple rules
116
104
{
117
- RuleSet<DirectAdviserIsAnAcademicAncestor, IndirectAdviserIsAnAcademicAncestor > rules{};
105
+ RuleSet<DirectAcademicAncestor, IndirectAcademicAncestor > rules{{rule1, rule2} };
118
106
119
- cout << " before = " ;
120
- state.print (cout);
121
- cout << endl;
107
+ cout << " before = " << state << endl;
122
108
state = fixPoint (rules, state);
123
- cout << " after = " ;
124
- state.print (cout);
125
- cout << endl;
109
+ cout << " after = " << state << endl;
126
110
}
127
111
112
+ // Query
113
+ struct Query : Rule<QueryResult, AcademicAncestor, AcademicAncestor> {} query{
114
+ atom<QueryResult>(x),
115
+ {
116
+ atom<AcademicAncestor>(robin, x),
117
+ atom<AcademicAncestor>(x, mistral)
118
+ }
119
+ };
120
+
128
121
// Apply a query
129
122
{
130
- RuleSet<Query> rules{};
123
+ RuleSet<Query> rules{query };
131
124
state = fixPoint (rules, state);
132
- cout << " after = " ;
133
- state.print (cout);
134
- cout << endl;
125
+ cout << " after = " << state << endl;
135
126
}
136
127
137
128
return true ;
0 commit comments