From a4ef2714593048616af29385c5af517635275e91 Mon Sep 17 00:00:00 2001 From: giles Date: Fri, 8 May 2026 23:00:22 +0000 Subject: [PATCH] datalog: cousin (multi-adornment same-relation) magic test (240/240) --- lib/datalog/scoreboard.json | 8 ++++---- lib/datalog/scoreboard.md | 4 ++-- lib/datalog/tests/magic.sx | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/datalog/scoreboard.json b/lib/datalog/scoreboard.json index c5e44ea7..7619dbf7 100644 --- a/lib/datalog/scoreboard.json +++ b/lib/datalog/scoreboard.json @@ -1,8 +1,8 @@ { "lang": "datalog", - "total_passed": 239, + "total_passed": 240, "total_failed": 0, - "total": 239, + "total": 240, "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":31,"failed":0,"total":31}, + {"name":"magic","passed":32,"failed":0,"total":32}, {"name":"demo","passed":21,"failed":0,"total":21} ], - "generated": "2026-05-08T14:40:44+00:00" + "generated": "2026-05-08T22:41:23+00:00" } diff --git a/lib/datalog/scoreboard.md b/lib/datalog/scoreboard.md index 6e176c8b..aa4e3c96 100644 --- a/lib/datalog/scoreboard.md +++ b/lib/datalog/scoreboard.md @@ -1,6 +1,6 @@ # datalog scoreboard -**239 / 239 passing** (0 failure(s)). +**240 / 240 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 | 31 | 31 | ok | +| magic | 32 | 32 | ok | | demo | 21 | 21 | ok | diff --git a/lib/datalog/tests/magic.sx b/lib/datalog/tests/magic.sx index 00edf4da..a5c47f03 100644 --- a/lib/datalog/tests/magic.sx +++ b/lib/datalog/tests/magic.sx @@ -268,6 +268,24 @@ (= (len semi) 1)))) true) + ;; Same relation called with different adornment patterns + ;; in different rules. The worklist must enqueue and process + ;; each (rel, adornment) pair. + (dl-mt-test! "magic with multi-adornment same relation" + (let + ((db (dl-program + "parent(p1, alice). parent(p2, bob). + parent(g, p1). parent(g, p2). + sibling(P1, P2) :- parent(G, P1), parent(G, P2), + !=(P1, P2). + cousin(X, Y) :- parent(P1, X), parent(P2, Y), + sibling(P1, P2)."))) + (let + ((semi (dl-query db (list (quote cousin) (quote alice) (quote Y)))) + (magic (dl-magic-query db (list (quote cousin) (quote alice) (quote Y))))) + (= (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