Created
September 12, 2009 17:18
-
-
Save kognate/185908 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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