Skip to content

Instantly share code, notes, and snippets.

@dustingetz
Forked from eraserhd/forall.clj
Created December 21, 2018 15:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dustingetz/f11a3f341b483c1d7203181ac34f19bf to your computer and use it in GitHub Desktop.
Save dustingetz/f11a3f341b483c1d7203181ac34f19bf 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