Cybernetic1

Untitled

Apr 16th, 2012
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;; Backward Chaining
  2.  
  3. (ns backward)
  4. (import '(java.util.concurrent Executors ExecutorCompletionService))
  5.  
  6. (declare start solve-goal solve-rule collect unify)
  7.  
  8. ; Choose between using parallel collect or sequential collect.
  9. (def use-parallel-collect true)
  10.  
  11. (def completion-service (ExecutorCompletionService.
  12.     (Executors/newCachedThreadPool)))
  13.  
  14. (defn start []
  15.     (loop []
  16.         (print "Enter query: ") (flush)
  17.         (let [query (read-line)
  18.             truth (solve-goal (symbol query))]
  19.             (printf "Answer is: %s\n" truth))
  20.         (recur)))
  21.  
  22. (defn fetch-rules [goal]
  23.     (case goal
  24.         g '[[a,b,c],[d,e,f]]
  25.         a '[[e,f]]
  26.         b '[[c,d,e,f]]
  27.         c '[[e,f]]
  28.         d '[[e,f]]
  29.         e '[[]]
  30.         f '[[]]
  31.         true (throw (Exception. "No applicable rule"))))
  32.  
  33. (defn solve-goal [goal]
  34.     (let [rules (fetch-rules goal)]
  35.         (if (some empty? rules)
  36.             1.0     ; return a truth value
  37.             (do
  38.                 (doseq [rule rules]
  39.                     (.submit completion-service #(solve-rule rule)))
  40.                 (.get (.take completion-service))))))
  41.  
  42. ; Move minimization logic here from collect.
  43. (defn solve-rule [rule-tail]
  44.     (let [truths (collect solve-goal rule-tail)]
  45.         (apply + truths)))
  46.  
  47. ; Accumulate results
  48. (def collect (if use-parallel-collect pmap map))
Advertisement
Add Comment
Please, Sign In to add comment