Rules - Required bindings doesn't evaluate correctly
Nobody has claimed this yet.
- Dominant language
- Clojure
- Stars
- 5.8k
- Forks
- 318
- PR merge metrics
- No merged PRs in 30d
Description
Attempting to follow the Datomic Rules with required bindings documentation and discovered this bug in DataScript.
Here's a short example:
(d/q '[:find ?need
:in $ % ?name
:where (needs ?name ?need)]
'[["george" :wants :foo]
["george" :needs :foo]
["sally" :needs :bar]]
'[[(needs ?name ?need) [?name :needs ?need]]] "george")
;; => #{[:foo]} (expected)
;; Now try with ?name being a required binding by placing it in brackets
;; -- (needs ?name ?need) -> (needs [?name] ?need)
(d/q '[:find ?need
:in $ % ?name
:where (needs ?name ?need)]
'[["george" :wants :foo]
["george" :needs :foo]
["sally" :needs :bar]]
'[[(needs [?name] ?need) [?name :needs ?need]]] "george")
;; => #{[:foo :bar]} (incorrect)
It may be that the required binding version is always evaluating to true.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the two d/q examples from the issue and compare the results for ordinary and required bindings. Read the linked Datomic Rules documentation for the intended required-binding semantics, then trace DataScript's Datalog rule evaluation to find why the required binding admits :bar. Done means the second query returns only #{[:foo]}.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- clojure
- Domain
- databases
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100