Skip to content

Instantly share code, notes, and snippets.

@eraserhd
Created December 21, 2018 14:30
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save eraserhd/c918cd1fa8cf06694b071c135e532125 to your computer and use it in GitHub Desktop.
Save eraserhd/c918cd1fa8cf06694b071c135e532125 to your computer and use it in GitHub Desktop.
;; Because in formal logic, ∀x.P(x) = ¬∃x.¬P(x)
(d/q '[:find ?id
:in $ [?interest ...]
:where
[?a :account/id ?id]
(not-join [?a ?interest]
[?a :account/interest ?i]
(not [(= ?i ?interest)]))])
;; It is harder to understand when you bind interest as above if you
;; are thinking in terms of iterative binding (but it still should
;; work!) If you make 'interests' a data source, it looks like this:
(d/q '[:find ?id
:in $ $interests
:where
[?a :account/id ?id]
(not-join [?a]
[?a :account/interest ?i]
(not [$interests ?i]))]
db
(map vector interests))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment