From 8e508bc90fdce710c2c084a6490af5e12681c4b5 Mon Sep 17 00:00:00 2001 From: giles Date: Fri, 8 May 2026 12:35:33 +0000 Subject: [PATCH] datalog: magic existence check (bb-adornment) regression test (228/228) --- lib/datalog/scoreboard.json | 8 ++++---- lib/datalog/scoreboard.md | 4 ++-- lib/datalog/tests/magic.sx | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/datalog/scoreboard.json b/lib/datalog/scoreboard.json index 9d8fb6d2..72e9732b 100644 --- a/lib/datalog/scoreboard.json +++ b/lib/datalog/scoreboard.json @@ -1,8 +1,8 @@ { "lang": "datalog", - "total_passed": 227, + "total_passed": 228, "total_failed": 0, - "total": 227, + "total": 228, "suites": [ {"name":"tokenize","passed":26,"failed":0,"total":26}, {"name":"parse","passed":18,"failed":0,"total":18}, @@ -13,8 +13,8 @@ {"name":"negation","passed":10,"failed":0,"total":10}, {"name":"aggregates","passed":19,"failed":0,"total":19}, {"name":"api","passed":20,"failed":0,"total":20}, - {"name":"magic","passed":27,"failed":0,"total":27}, + {"name":"magic","passed":28,"failed":0,"total":28}, {"name":"demo","passed":21,"failed":0,"total":21} ], - "generated": "2026-05-08T12:31:39+00:00" + "generated": "2026-05-08T12:35:21+00:00" } diff --git a/lib/datalog/scoreboard.md b/lib/datalog/scoreboard.md index 98e6ecc0..39b7704f 100644 --- a/lib/datalog/scoreboard.md +++ b/lib/datalog/scoreboard.md @@ -1,6 +1,6 @@ # datalog scoreboard -**227 / 227 passing** (0 failure(s)). +**228 / 228 passing** (0 failure(s)). | Suite | Passed | Total | Status | |-------|--------|-------|--------| @@ -13,5 +13,5 @@ | negation | 10 | 10 | ok | | aggregates | 19 | 19 | ok | | api | 20 | 20 | ok | -| magic | 27 | 27 | ok | +| magic | 28 | 28 | ok | | demo | 21 | 21 | ok | diff --git a/lib/datalog/tests/magic.sx b/lib/datalog/tests/magic.sx index 90b6f75b..fc4707d3 100644 --- a/lib/datalog/tests/magic.sx +++ b/lib/datalog/tests/magic.sx @@ -211,6 +211,23 @@ (= (len semi) (len magic)))) true) + ;; All-bound query (existence check) generates an "bb" + ;; adornment chain. Verifies the rewriter walks multiple + ;; (rel, adn) pairs through the worklist. + (dl-mt-test! "magic existence check via bb" + (let + ((db (dl-program + "parent(a, b). parent(b, c). parent(c, d). + ancestor(X, Y) :- parent(X, Y). + ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z)."))) + (let + ((found (dl-magic-query + db (list (quote ancestor) (quote a) (quote c)))) + (missing (dl-magic-query + db (list (quote ancestor) (quote a) (quote z))))) + (and (= (len found) 1) (= (len missing) 0)))) + true) + ;; Magic over a rule whose body contains an aggregate. ;; The rewriter passes aggregate body lits through unchanged ;; (no propagation generated for them), so semi-naive's count