Skip to content

Instantly share code, notes, and snippets.

@ahoy-jon
Created January 20, 2014 00:08
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 ahoy-jon/cd0f025276234de464d5 to your computer and use it in GitHub Desktop.
Save ahoy-jon/cd0f025276234de464d5 to your computer and use it in GitHub Desktop.
(ns cdl.core
(:refer-clojure :exclude [==])
(:use [clojure.core.logic][clojure.core.logic.pldb]))
;; Some outer join examples with mini-kanren
;; this is not relational, it use nafc.
;; but nafc is IMHO way better than conda, you can still reorder goals, so it stays simple.
(db-rel men m)
(db-rel robot m)
(db-rel language l d)
(def mydb (db
[men 'Michel]
[men 'Joe]
[men 'Martin]
[robot 'Borg]
[language 'Martin 'Scala]
[language 'Martin 'Java]
[language 'Joe 'Erlang]
[language 'Joe 'Prolog]
[language 'Borg 'Zorg]))
;; outer is the union of inner, left and right.
(with-db mydb
(run* [e men? lang]
(conde
[ (language e lang) (men e)(== men? true)] ;; inner
[ (language e lang) (nafc men e)(== men? false)] ;; left
[(nafc #(fresh [l] (language % l)) e) (men e)(== men? true)]))) ;; right
;;
'([Martin true Scala] [Michel true _0] [Martin true Java] [Borg false Zorg] [Joe true Prolog] [Joe true Erlang])
;; more SQL-ish concerning variables
(with-db mydb
(run* [e men? lang]
(fresh [m l]
(!= e nil)
(conde
[(== m e)(== m l)]
[(== l e)(== m nil)]
[(== m e)(== l nil)])
(conde
[(language l lang)]
[(== l nil)(nafc #(fresh [x] (language % x)) m)])
(conde
[(men m)(== men? true)]
[(== m nil)(nafc men l)(== men? false)]))))
;;
'([Martin true Scala] [Martin true Java] [Joe true Prolog] [Joe true Erlang] [Michel true _0] [Borg false Zorg])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment