SHOW:
|
|
- or go back to the newest paste.
| 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 | - | (print "Enter query: ") (flush) |
| 15 | + | (loop [] |
| 16 | - | (let [query (read-line) |
| 16 | + | (print "Enter query: ") (flush) |
| 17 | - | truth (solve-goal (symbol query))] |
| 17 | + | (let [query (read-line) |
| 18 | - | (printf "Answer is: %s\n" truth))) |
| 18 | + | truth (solve-goal (symbol query))] |
| 19 | (printf "Answer is: %s\n" truth)) | |
| 20 | (recur))) | |
| 21 | ||
| 22 | (defn fetch-rules [goal] | |
| 23 | - | a '[[]] |
| 23 | + | |
| 24 | - | b '[[]] |
| 24 | + | |
| 25 | - | c '[[]] |
| 25 | + | a '[[e,f]] |
| 26 | - | d '[[]] |
| 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 | - | (apply min truths))) |
| 43 | + | |
| 44 | (let [truths (collect solve-goal rule-tail)] | |
| 45 | (apply + truths))) | |
| 46 | ||
| 47 | ; Accumulate results | |
| 48 | (def collect (if use-parallel-collect pmap map)) |