Advertisement
maurolopes

core.logic básico

Mar 1st, 2015
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns clj-sp.core
  2.   (:require [clojure.core.logic.pldb :as pldb]
  3.             [clojure.core.logic :refer :all])
  4.   (:refer-clojure :exclude [==]))
  5.  
  6. (pldb/db-rel parent p1 p2)
  7.  
  8. ;               :jose
  9. ;:joao  :mario  :josefa
  10. ;:joana :maria  :carlos
  11. ;               :carla
  12.  
  13.  
  14. (def facts
  15.   (pldb/db
  16.     [parent :maria :joao]
  17.     [parent :mario :joao]
  18.     [parent :maria :joana]
  19.     [parent :mario :joana]
  20.     [parent :carlos :maria]
  21.     [parent :carla :maria]
  22.     [parent :jose :mario]
  23.     [parent :josefa :mario]))
  24.  
  25. (defn grandparent
  26.   [x y]
  27.   (fresh [z]
  28.          (parent x z)
  29.          (parent z y)))
  30.  
  31. (pldb/with-db facts
  32.   (run* [q]
  33.         (grandparent :jose q)))
  34. ; => (:joao :joana)
  35.  
  36. (pldb/with-db facts
  37.   (run* [q]
  38.         (fresh [gparent gchild]
  39.                (grandparent gparent gchild)
  40.                (== q [gparent gchild]))))
  41. ; => ([:carla :joana] [:carla :joao] [:jose :joao] [:jose :joana] [:carlos :joana] [:carlos :joao] [:josefa :joao] [:josefa :joana])
  42.  
  43. (defn ancestor
  44.   [x y]
  45.   (fresh [z]
  46.          (conde [(parent x z)
  47.                  (ancestor z y)]
  48.                 [(parent x y)])))
  49.  
  50. (pldb/with-db facts
  51.               (run* [q]
  52.                     (fresh [anc p]
  53.                            (ancestor anc p)
  54.                            (== q [anc p]))))
  55. ; => ([:mario :joao] [:carla :maria] [:maria :joana] [:maria :joao] [:mario :joana] [:jose :mario] [:carlos :maria] [:josefa :mario] [:carla :joana] [:carla :joao] [:jose :joao] [:jose :joana] [:carlos :joana] [:carlos :joao] [:josefa :joao] [:josefa :joana])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement