Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns clj-sp.core
- (:require [clojure.core.logic.pldb :as pldb]
- [clojure.core.logic :refer :all])
- (:refer-clojure :exclude [==]))
- (pldb/db-rel parent p1 p2)
- ; :jose
- ;:joao :mario :josefa
- ;:joana :maria :carlos
- ; :carla
- (def facts
- (pldb/db
- [parent :maria :joao]
- [parent :mario :joao]
- [parent :maria :joana]
- [parent :mario :joana]
- [parent :carlos :maria]
- [parent :carla :maria]
- [parent :jose :mario]
- [parent :josefa :mario]))
- (defn grandparent
- [x y]
- (fresh [z]
- (parent x z)
- (parent z y)))
- (pldb/with-db facts
- (run* [q]
- (grandparent :jose q)))
- ; => (:joao :joana)
- (pldb/with-db facts
- (run* [q]
- (fresh [gparent gchild]
- (grandparent gparent gchild)
- (== q [gparent gchild]))))
- ; => ([:carla :joana] [:carla :joao] [:jose :joao] [:jose :joana] [:carlos :joana] [:carlos :joao] [:josefa :joao] [:josefa :joana])
- (defn ancestor
- [x y]
- (fresh [z]
- (conde [(parent x z)
- (ancestor z y)]
- [(parent x y)])))
- (pldb/with-db facts
- (run* [q]
- (fresh [anc p]
- (ancestor anc p)
- (== q [anc p]))))
- ; => ([: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