Cybernetic1

backward chaining in Clojure

Apr 16th, 2012
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;; Backward chaining in Clojure
  2. ;; -- implemented as a parallel search
  3. ;; -- the search tree interleaves calling of solve-goal and solve-rule
  4. ;; -- solveGoals takes the first result available (OR)
  5. ;; -- solveRules collects all results before calculating an answer (AND)
  6. ;; -- technically this is called an AND-OR tree
  7.  
  8. (ns backward)
  9. (import '(java.util.concurrent Executors ExecutorCompletionService))
  10.  
  11. (declare start solve-goal solve-rule collect unify)
  12.  
  13. ;; Choose between using parallel collect or sequential collect.
  14. (def use-parallel-collect true)
  15.  
  16. (def completion-service (ExecutorCompletionService.
  17.     (Executors/newCachedThreadPool)))
  18.  
  19. (defn start []
  20.     (loop []
  21.         (loop []
  22.             (if (not (nil? (.poll completion-service)))
  23.                 (recur)))
  24.         (print "Enter query: ") (flush)
  25.         (let [query (read-line)
  26.               truth (solve-goal (symbol query))]
  27.             (printf "Answer is: %s\n" truth))
  28.         (recur)))
  29.  
  30. ;; The rule base
  31. (defn fetch-rules [goal]
  32.     (case goal
  33.         g '[[a,b,c],[d,e,f]]
  34.         a '[[e,f]]
  35.         b '[[c,d,e,f]]
  36.         c '[[e,f]]
  37.         d '[[e,f]]
  38.         e '[[]]
  39.         f '[[]]
  40.         true (throw (Exception. "No applicable rule"))))
  41.  
  42. (defn solve-goal [goal]
  43.     (let [rules (fetch-rules goal)]
  44.         (if (some empty? rules)
  45.             1.0     ; return a truth value
  46.             (do
  47.                 (doseq [rule rules]
  48.                     (.submit completion-service #(solve-rule rule)))
  49.                 (.get (.take completion-service))))))
  50.  
  51. (defn solve-rule [rule-tail]
  52.     (let [truths (collect solve-goal rule-tail)]
  53.         (apply + truths)))      ; sum up truth values -- for testing
  54.  
  55. ; Accumulate results
  56. (def collect (if use-parallel-collect pmap map))
Advertisement
Add Comment
Please, Sign In to add comment