8000 Merge branch 'master' of https://git.semmle.com/wright/mini-datalog · Z80coder/datalog-cpp@85d95da · GitHub
[go: up one dir, main page]

Skip to content

Commit 85d95da

Browse files
committed
2 parents 38aee16 + a841068 commit 85d95da

File tree

2 files changed

+70
-40
lines changed

src/Datalog.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ void deleteVar(Variable<T>* v) {
6060
delete v;
6161
}
6262

63+
template <typename T>
64+
static void unbind(Variable<T>* t) {
65+
t->unbind();
66+
}
67+
6368
template <typename T>
6469
static void unbind(const T& t) {}
6570

@@ -163,6 +168,7 @@ struct Relation
163168
return lhs.second < rhs.second;
164169
}
165170
};
171+
166172
typedef set<TrackedGround, compare> TrackedSet;
167173
#else
168174
// unordered set seems faster than set

tests/types_test.cpp

Lines changed: 64 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,14 @@ bool test1()
3939
State<Thing, Mortal> state{things, {}};
4040

4141
// Apply rule
42-
RuleSet<decltype(rule1)> rules{rule1};
42+
auto rules = ruleset(rule1);
4343

4444
cout << "before = " << state << endl;
4545
state = fixPoint(rules, state);
4646
cout << "after = " << state << endl;
47+
48+
deleteVar(x);
49+
4750
return true;
4851
}
4952

@@ -74,9 +77,9 @@ bool test2()
7477
{rod, alan},
7578
{robin, alan}};
7679

77-
auto x = var<Name>();
78-
auto y = var<Name>();
79-
auto z = var<Name>();
80+
auto x = new Variable<Name>();
81+
auto y = new Variable<Name>();
82+
auto z = new Variable<Name>();
8083

8184
// TODO
8285
//auto inDirectAcademicAncestor = atom<AcademicAncestor>(x, z) <= atom<Adviser>(x, y) && atom<AcademicAncestor>(y, z);
@@ -92,15 +95,17 @@ bool test2()
9295
);
9396

9497
// Apply rules
98+
auto rules = ruleset(directAcademicAncestor, indirectAcademicAncestor, query);
9599
State<Adviser, AcademicAncestor, QueryResult> state{advisers, {}, {}};
96-
RuleSet<decltype(directAcademicAncestor), decltype(indirectAcademicAncestor), decltype(query)> rules{
97-
{directAcademicAncestor, indirectAcademicAncestor, query}
98-
};
99100

100101
cout << "before = " << state << endl;
101102
state = fixPoint(rules, state);
102103
cout << "after = " << state << endl;
103104

105+
delete x;
106+
delete y;
107+
delete z;
108+
104109
return true;
105110
}
106111

@@ -117,21 +122,21 @@ bool po1()
117122

118123
State<Check, In, A> state{check, in, {}};
119124

120-
auto a = var<Number>();
121-
auto b = var<Number>();
122-
auto c = var<Number>();
123-
auto d = var<Number>();
124-
auto e = var<Number>();
125-
auto f = var<Number>();
126-
auto i = var<Number>();
127-
auto anon1 = var<Number>();
128-
auto anon2 = var<Number>();
129-
auto anon3 = var<Number>();
130-
auto anon4 = var<Number>();
131-
auto anon5 = var<Number>();
132-
auto anon6 = var<Number>();
133-
auto anon7 = var<Number>();
134-
auto anon8 = var<Number>();
125+
auto a = new Variable<Number>();
126+
auto b = new Variable<Number>();
127+
auto c = new Variable<Number>();
128+
auto d = new Variable<Number>();
129+
auto e = new Variable<Number>();
130+
auto f = new Variable<Number>();
131+
auto i = new Variable<Number>();
132+
auto anon1 = new Variable<Number>();
133+
auto anon2 = new Variable<Number>();
134+
auto anon3 = new Variable<Number>();
135+
auto anon4 = new Variable<Number>();
136+
auto anon5 = new Variable<Number>();
137+
auto anon6 = new Variable<Number>();
138+
auto anon7 = new Variable<Number>();
139+
auto anon8 = new Variable<Number>();
135140

136141
// A(1,i) :- Check(_, b, c, d, e, f), In(_, b, c, d, e, f, i).
137142
auto rule1 = rule(atom<A>(1u, i), atom<Check>(anon1, b, c, d, e, f), atom<In>(anon2, b, c, d, e, f, i));
@@ -172,10 +177,8 @@ bool po1()
172177
// A(19, i) :- Check(a, b, c, d, e, f), In(a, b, c, d, e, f, i).
173178
auto rule19 = rule(atom<A>(19u, i), atom<Check>(a, b, c, d, e, f), atom<In>(a, b, c, d, e, f, i));
174179

175-
RuleSet<decltype(rule1), decltype(rule2), decltype(rule3), decltype(rule4), decltype(rule5), decltype(rule6), decltype(rule7), decltype(rule8), decltype(rule9), decltype(rule10), decltype(rule11), decltype(rule12), decltype(rule13), decltype(rule14), decltype(rule15), decltype(rule16), decltype(rule17), decltype(rule18), decltype(rule19)>
176-
rules{
177-
{rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8, rule9, rule10, rule11, rule12, rule13, rule14, rule15, rule16, rule17, rule18, rule19}
178-
};
180+
auto rules = ruleset(rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8, rule9, rule10, rule11, rule12, rule13,
181+
rule14, rule15, rule16, rule17, rule18, rule19);
179182

180183
//cout << "before = " << state << endl;
181184
state = fixPoint(rules, state);
@@ -188,6 +191,22 @@ bool po1()
188191
operator<< <A>(cout, computedA);
189192
cout << endl;
190193

194+
delete a;
195+
delete b;
196+
delete c;
197+
delete d;
198+
delete e;
199+
delete f;
200+
delete i;
201+
delete anon1;
202+
delete anon2;
203+
delete anon3;
204+
delete anon4;
205+
delete anon5;
206+
delete anon6;
207+
delete anon7;
208+
delete anon8;
209+
191210
return computedA == aOut;
192211
}
193212
#endif
@@ -220,10 +239,10 @@ bool test4()
220239
{sally, 40u, female, netherlands}
221240
};
222241

223-
auto name = var<Name>();
224-
auto age = var<Age>();
225-
auto gender = var<Gender>();
226-
auto country = var<Country>();
242+
auto name = new Variable<Name>();
243+
auto age = new Variable<Age>();
244+
auto gender = new Variable<Gender>();
245+
auto country = new Variable<Country>();
227246

228247
struct Female : Relation<Name>{};
229248
auto females = rule(
@@ -234,7 +253,7 @@ bool test4()
234253
typedef float Metres;
235254
struct Height : Relation<Name, Metres>{};
236255

237-
auto height = var<Metres>();
256+
auto height = new Variable<Metres>();
238257

239258
auto heights = rule(
240259
atom<Height>(name, 1.0f),
@@ -243,16 +262,16 @@ bool test4()
243262
)
244263
);
245264

246-
#if 0
265+
247266
// Use this pattern to get at values too
248267
auto anyPerson = atom<Person>(name, age, gender, country);
249268

250-
auto externalHeights = rule(
269+
auto externalHeights1 = rule(
251270
atom<Height>(name, height),
252271
body(
253272
atom<Person>(name, age, gender, country)
254273
),
255-
external(
274+
lambda(
256275
height,
257276
[&anyPerson]() {
258277
cout << "hello world!" << endl;
@@ -262,32 +281,36 @@ bool test4()
262281
}
263282
)
264283
);
265-
#else
284+
266285
// Use this pattern to get at variables (values can't be got directly)
267286
auto externalHeights = rule(
268287
atom<Height>(name, height),
269288
body(atom<Person>(name, age, female, country)),
270-
lambda(height, [&age]() { return val(age) * 3.0f; } )
289+
lambda(height, [&age]() { return age->value() * 3.0f; } )
271290
);
272-
#endif
273291

274292
// Apply rules
293+
auto rules = ruleset(females, heights, externalHeights);
275294
State<Person, Female, Height> state{people, {}, {}};
276-
RuleSet<decltype(females), decltype(heights), decltype(externalHeights)> rules{
277-
{females, heights, externalHeights}
278-
};
279295

280296
cout << "before = " << state << endl;
281297
state = fixPoint(rules, state);
282298
cout << "after = " << state << endl;
283299

300+
delete name;
301+
delete age;
302+
delete gender;
303+
delete country;
304+
delete height;
305+
284306
return true;
285307
}
286308

287309
int main()
288310
{
289311
bool ok1 = test1();
290312
bool ok2 = test2();
313+
#if 1
291314
bool ok3 = po1();
292315
bool ok4 = test4();
293316

@@ -298,5 +321,6 @@ int main()
298321
cout << "PASSED" << endl;
299322
return 0;
300323
}
324+
#endif
301325
return 1;
302326
}

0 commit comments

Comments
 (0)
0