diff --git a/lib/datalog/scoreboard.json b/lib/datalog/scoreboard.json index 72fd7b50..60f7f14d 100644 --- a/lib/datalog/scoreboard.json +++ b/lib/datalog/scoreboard.json @@ -1,8 +1,8 @@ { "lang": "datalog", - "total_passed": 236, + "total_passed": 237, "total_failed": 0, - "total": 236, + "total": 237, "suites": [ {"name":"tokenize","passed":26,"failed":0,"total":26}, {"name":"parse","passed":20,"failed":0,"total":20}, @@ -13,8 +13,8 @@ {"name":"negation","passed":10,"failed":0,"total":10}, {"name":"aggregates","passed":20,"failed":0,"total":20}, {"name":"api","passed":20,"failed":0,"total":20}, - {"name":"magic","passed":28,"failed":0,"total":28}, + {"name":"magic","passed":29,"failed":0,"total":29}, {"name":"demo","passed":21,"failed":0,"total":21} ], - "generated": "2026-05-08T14:19:14+00:00" + "generated": "2026-05-08T14:29:08+00:00" } diff --git a/lib/datalog/scoreboard.md b/lib/datalog/scoreboard.md index 0b89d9b1..cec0e73e 100644 --- a/lib/datalog/scoreboard.md +++ b/lib/datalog/scoreboard.md @@ -1,6 +1,6 @@ # datalog scoreboard -**236 / 236 passing** (0 failure(s)). +**237 / 237 passing** (0 failure(s)). | Suite | Passed | Total | Status | |-------|--------|-------|--------| @@ -13,5 +13,5 @@ | negation | 10 | 10 | ok | | aggregates | 20 | 20 | ok | | api | 20 | 20 | ok | -| magic | 28 | 28 | ok | +| magic | 29 | 29 | ok | | demo | 21 | 21 | ok | diff --git a/lib/datalog/tests/magic.sx b/lib/datalog/tests/magic.sx index fc4707d3..985ba4dc 100644 --- a/lib/datalog/tests/magic.sx +++ b/lib/datalog/tests/magic.sx @@ -228,6 +228,20 @@ (and (= (len found) 1) (= (len missing) 0)))) true) + ;; Magic equivalence on the federation demo. + (dl-mt-test! "magic ≡ semi on foaf demo" + (let + ((db (dl-program-data + (quote ((follows alice bob) + (follows bob carol) + (follows alice dave))) + dl-demo-federation-rules))) + (let + ((semi (dl-query db (quote (foaf alice X)))) + (magic (dl-magic-query db (quote (foaf alice X))))) + (= (len semi) (len magic)))) + 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