Skip to content

Instantly share code, notes, and snippets.

@kognate
Created September 12, 2009 17:18
Show Gist options
  • Save kognate/185908 to your computer and use it in GitHub Desktop.
Save kognate/185908 to your computer and use it in GitHub Desktop.
(use 'clojure.contrib.datalog)
(use 'clojure.contrib.datalog.rules)
(use 'clojure.contrib.datalog.database)
(use 'clojure.contrib.datalog.util)
(def d (make-database
(relation :person [:name :room-id :seat-number])
(index :person :name)))
(def db (add-tuples d
[:person :name "Albert" :room-id 1 :seat-number 1]
[:person :name "Tom" :room-id 1 :seat-number 2]
[:person :name "Ted" :room-id 1 :seat-number 3]
[:person :name "Tom" :room-id 2 :seat-number 3]))
(def rules
(rules-set
(<- (:rooms-used :room ?x) (:person :name ?notused :room-id ?x :seat-number ?notusedeither))
(<- (:room-use :room ?x :person ?p :seat ?s) (:person :name ?p :room-id ?x :seat-number ?s))))
(def rooms-wp (build-work-plan rules (?- :rooms-used :room ?x)))
(run-work-plan rooms-wp db {})
(defn who-is-in-room
[room-id]
(let [in-room (build-work-plan rules (?- :room-use :room '??roomid :person ?p :seat ?s))]
(into [] (map #(% :person) (run-work-plan in-room db {'??roomid room-id})))))
(defn seat-in-room
[room-id]
(let [in-room (build-work-plan rules (?- :room-use :room '??roomid :person ?p :seat ?s))]
(into [] (map #(% :seat) (run-work-plan in-room db {'??roomid room-id})))))
(defn who-is-in-all-rooms
[]
(let [allrooms (run-work-plan rooms-wp db {})]
(into [] (map (fn [rmid] {:room-id (:room rmid) :seat-number (seat-in-room (:room rmid)) :players (who-is-in-room (:room rmid))}) allrooms))))
(who-is-in-all-rooms)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment