Skip to content

Instantly share code, notes, and snippets.

@SegFaultAX
Created September 3, 2012 02:41
Show Gist options
  • Save SegFaultAX/3606387 to your computer and use it in GitHub Desktop.
Save SegFaultAX/3606387 to your computer and use it in GitHub Desktop.
Transitive Closure of a Binary Relation
(defn transitive-closure [rel]
(let [roots (into {} (for [[k v] (group-by first rel)] [k (mapv second v)]))
children (fn children [rels e]
(let [cs (get rels e [])]
(cons e (mapcat #(children rels %) cs))))]
(set (mapcat #(map vector (repeat %) (rest (children roots %))) (keys roots)))))
(transitive-closure #{[8 4] [9 3] [4 2] [27 9]})
(transitive-closure #{["cat" "man"] ["man" "snake"] ["spider" "cat"]})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment