prolog: clause DB + loader (functor/arity → clauses), 14 tests green
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
@@ -230,3 +230,51 @@
|
||||
(pl-unify! t1 t2 trail)
|
||||
true
|
||||
(do (pl-trail-undo-to! trail mark) false)))))
|
||||
|
||||
(define pl-mk-db (fn () {:clauses {}}))
|
||||
|
||||
(define
|
||||
pl-head-key
|
||||
(fn
|
||||
(head)
|
||||
(cond
|
||||
((pl-compound? head) (str (pl-fun head) "/" (len (pl-args head))))
|
||||
((pl-atom? head) (str (pl-atom-name head) "/0"))
|
||||
(true (error "pl-head-key: invalid head")))))
|
||||
|
||||
(define pl-clause-key (fn (clause) (pl-head-key (nth clause 1))))
|
||||
|
||||
(define pl-goal-key (fn (goal) (pl-head-key goal)))
|
||||
|
||||
(define
|
||||
pl-db-add!
|
||||
(fn
|
||||
(db clause)
|
||||
(let
|
||||
((key (pl-clause-key clause)) (table (dict-get db :clauses)))
|
||||
(cond
|
||||
((nil? (dict-get table key)) (dict-set! table key (list clause)))
|
||||
(true (begin (append! (dict-get table key) clause) nil))))))
|
||||
|
||||
(define
|
||||
pl-db-load!
|
||||
(fn
|
||||
(db program)
|
||||
(cond
|
||||
((empty? program) nil)
|
||||
(true
|
||||
(begin
|
||||
(pl-db-add! db (first program))
|
||||
(pl-db-load! db (rest program)))))))
|
||||
|
||||
(define
|
||||
pl-db-lookup
|
||||
(fn
|
||||
(db key)
|
||||
(let
|
||||
((v (dict-get (dict-get db :clauses) key)))
|
||||
(cond ((nil? v) (list)) (true v)))))
|
||||
|
||||
(define
|
||||
pl-db-lookup-goal
|
||||
(fn (db goal) (pl-db-lookup db (pl-goal-key goal))))
|
||||
|
||||
Reference in New Issue
Block a user