diff --git a/lib/datalog/api.sx b/lib/datalog/api.sx index 07fcea10..925c8728 100644 --- a/lib/datalog/api.sx +++ b/lib/datalog/api.sx @@ -198,6 +198,24 @@ (dl-magic-query db (first qbody))) (else (dl-query db qbody))))))))) +;; List rules whose head's relation matches `rel-name`. Useful for +;; inspection ("show me how this relation is derived") without +;; exposing the internal `:rules` list. +(define + dl-rules-of + (fn + (db rel-name) + (let ((out (list))) + (do + (for-each + (fn + (rule) + (when + (= (dl-rel-name (get rule :head)) rel-name) + (append! out rule))) + (dl-rules db)) + out)))) + (define dl-rule-head-rels (fn diff --git a/lib/datalog/scoreboard.json b/lib/datalog/scoreboard.json index 95bc068c..c34b0adb 100644 --- a/lib/datalog/scoreboard.json +++ b/lib/datalog/scoreboard.json @@ -1,8 +1,8 @@ { "lang": "datalog", - "total_passed": 212, + "total_passed": 214, "total_failed": 0, - "total": 212, + "total": 214, "suites": [ {"name":"tokenize","passed":26,"failed":0,"total":26}, {"name":"parse","passed":18,"failed":0,"total":18}, @@ -12,9 +12,9 @@ {"name":"semi_naive","passed":8,"failed":0,"total":8}, {"name":"negation","passed":10,"failed":0,"total":10}, {"name":"aggregates","passed":18,"failed":0,"total":18}, - {"name":"api","passed":17,"failed":0,"total":17}, + {"name":"api","passed":19,"failed":0,"total":19}, {"name":"magic","passed":22,"failed":0,"total":22}, {"name":"demo","passed":18,"failed":0,"total":18} ], - "generated": "2026-05-08T10:15:09+00:00" + "generated": "2026-05-08T10:17:32+00:00" } diff --git a/lib/datalog/scoreboard.md b/lib/datalog/scoreboard.md index 4cb73b51..8633cec0 100644 --- a/lib/datalog/scoreboard.md +++ b/lib/datalog/scoreboard.md @@ -1,6 +1,6 @@ # datalog scoreboard -**212 / 212 passing** (0 failure(s)). +**214 / 214 passing** (0 failure(s)). | Suite | Passed | Total | Status | |-------|--------|-------|--------| @@ -12,6 +12,6 @@ | semi_naive | 8 | 8 | ok | | negation | 10 | 10 | ok | | aggregates | 18 | 18 | ok | -| api | 17 | 17 | ok | +| api | 19 | 19 | ok | | magic | 22 | 22 | ok | | demo | 18 | 18 | ok | diff --git a/lib/datalog/tests/api.sx b/lib/datalog/tests/api.sx index b2334dff..7cddd4cb 100644 --- a/lib/datalog/tests/api.sx +++ b/lib/datalog/tests/api.sx @@ -213,6 +213,20 @@ "?- p(X), q(X).") (list {:X 2} {:X 3})) + ;; dl-rules-of: rules with head matching a relation name. + (dl-api-test! "dl-rules-of count" + (let + ((db (dl-program + "p(1). q(X) :- p(X). r(X) :- p(X). q(2)."))) + (len (dl-rules-of db "q"))) + 1) + + (dl-api-test! "dl-rules-of empty" + (let + ((db (dl-program "p(1). p(2)."))) + (len (dl-rules-of db "q"))) + 0) + ;; dl-clear-idb!: wipe rule-headed relations. (dl-api-test! "dl-clear-idb! wipes IDB" (let