diff --git a/lib/datalog/scoreboard.json b/lib/datalog/scoreboard.json index 43ef5417..b1366855 100644 --- a/lib/datalog/scoreboard.json +++ b/lib/datalog/scoreboard.json @@ -1,8 +1,8 @@ { "lang": "datalog", - "total_passed": 220, + "total_passed": 221, "total_failed": 0, - "total": 220, + "total": 221, "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":22,"failed":0,"total":22}, + {"name":"magic","passed":23,"failed":0,"total":23}, {"name":"demo","passed":21,"failed":0,"total":21} ], - "generated": "2026-05-08T10:27:32+00:00" + "generated": "2026-05-08T10:29:04+00:00" } diff --git a/lib/datalog/scoreboard.md b/lib/datalog/scoreboard.md index 65bbd501..dda4e89d 100644 --- a/lib/datalog/scoreboard.md +++ b/lib/datalog/scoreboard.md @@ -1,6 +1,6 @@ # datalog scoreboard -**220 / 220 passing** (0 failure(s)). +**221 / 221 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 | 22 | 22 | ok | +| magic | 23 | 23 | ok | | demo | 21 | 21 | ok | diff --git a/lib/datalog/tests/magic.sx b/lib/datalog/tests/magic.sx index 6527aa42..d5a6ca0f 100644 --- a/lib/datalog/tests/magic.sx +++ b/lib/datalog/tests/magic.sx @@ -256,6 +256,18 @@ (and (= semi-count 78) (= magic-count 12)))))) true) + ;; Magic + arithmetic: rules with `is` clauses pass through + ;; the rewriter unchanged (built-ins aren't propagated). + (dl-mt-test! "magic preserves arithmetic" + (let + ((source "n(1). n(2). n(3). + doubled(X, Y) :- n(X), is(Y, *(X, 2)).")) + (let + ((semi (dl-eval source "?- doubled(2, Y).")) + (magic (dl-eval-magic source "?- doubled(2, Y)."))) + (= (len semi) (len magic)))) + true) + (dl-mt-test! "magic skips irrelevant clusters" (let ;; Two disjoint chains. Query is rooted in cluster 1.