diff --git a/lib/datalog/api.sx b/lib/datalog/api.sx index 72cb9dfd..07fcea10 100644 --- a/lib/datalog/api.sx +++ b/lib/datalog/api.sx @@ -213,3 +213,23 @@ (append! seen h)))) (dl-rules db)) seen)))) + +;; Wipe every relation that has at least one rule (i.e. every IDB +;; relation) — leaves EDB facts and rule definitions intact. Useful +;; before a follow-up `dl-saturate!` if you want a clean restart, or +;; for inspection of the EDB-only baseline. +(define + dl-clear-idb! + (fn + (db) + (let ((rule-heads (dl-rule-head-rels db))) + (do + (for-each + (fn + (k) + (do + (dict-set! (get db :facts) k (list)) + (dict-set! (get db :facts-keys) k {}) + (dict-set! (get db :facts-index) k {}))) + rule-heads) + db)))) diff --git a/lib/datalog/scoreboard.json b/lib/datalog/scoreboard.json index 203984a5..2884cc4d 100644 --- a/lib/datalog/scoreboard.json +++ b/lib/datalog/scoreboard.json @@ -1,8 +1,8 @@ { "lang": "datalog", - "total_passed": 206, + "total_passed": 208, "total_failed": 0, - "total": 206, + "total": 208, "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":15,"failed":0,"total":15}, + {"name":"api","passed":17,"failed":0,"total":17}, {"name":"magic","passed":21,"failed":0,"total":21}, {"name":"demo","passed":18,"failed":0,"total":18} ], - "generated": "2026-05-08T10:04:46+00:00" + "generated": "2026-05-08T10:06:36+00:00" } diff --git a/lib/datalog/scoreboard.md b/lib/datalog/scoreboard.md index 8af1890b..850f96c0 100644 --- a/lib/datalog/scoreboard.md +++ b/lib/datalog/scoreboard.md @@ -1,6 +1,6 @@ # datalog scoreboard -**206 / 206 passing** (0 failure(s)). +**208 / 208 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 | 15 | 15 | ok | +| api | 17 | 17 | ok | | magic | 21 | 21 | ok | | demo | 18 | 18 | ok | diff --git a/lib/datalog/tests/api.sx b/lib/datalog/tests/api.sx index 809946df..b2334dff 100644 --- a/lib/datalog/tests/api.sx +++ b/lib/datalog/tests/api.sx @@ -213,6 +213,30 @@ "?- p(X), q(X).") (list {:X 2} {:X 3})) + ;; dl-clear-idb!: wipe rule-headed relations. + (dl-api-test! "dl-clear-idb! wipes IDB" + (let + ((db (dl-program + "parent(a, b). parent(b, c). + ancestor(X, Y) :- parent(X, Y). + ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z)."))) + (do + (dl-saturate! db) + (dl-clear-idb! db) + (len (dl-relation db "ancestor")))) + 0) + + (dl-api-test! "dl-clear-idb! preserves EDB" + (let + ((db (dl-program + "parent(a, b). parent(b, c). + ancestor(X, Y) :- parent(X, Y)."))) + (do + (dl-saturate! db) + (dl-clear-idb! db) + (len (dl-relation db "parent")))) + 2) + ;; dl-eval-magic — routes single-goal queries through ;; magic-sets evaluation. (dl-api-test-set! "dl-eval-magic ancestor"