SHOW:
|
|
- or go back to the newest paste.
1 | ;; Backward Chaining | |
2 | - | (doseq [rule (fetch-rules goal)] |
2 | + | |
3 | - | (if (empty? rule) |
3 | + | (ns backward) |
4 | - | 0.9 ; a truth value |
4 | + | (import '(java.util.concurrent Executors ExecutorCompletionService)) |
5 | - | (.submit completion-service (solve-rule rule)))) |
5 | + | |
6 | - | ; take the first result |
6 | + | (declare start solve-goal solve-rule collect unify) |
7 | - | (if (= result 0.9) |
7 | + | |
8 | - | result |
8 | + | ; Choose between using parallel collect or sequential collect. |
9 | - | (.get (.take completion-service)))) |
9 | + | (def use-parallel-collect true) |
10 | ||
11 | (def completion-service (ExecutorCompletionService. | |
12 | (Executors/newCachedThreadPool))) | |
13 | ||
14 | (defn start [] | |
15 | (print "Enter query: ") (flush) | |
16 | (let [query (read-line) | |
17 | truth (solve-goal (symbol query))] | |
18 | (printf "Answer is: %s\n" truth))) | |
19 | ||
20 | (defn fetch-rules [goal] | |
21 | (case goal | |
22 | g '[[a,b,c],[d,e,f]] | |
23 | a '[[]] | |
24 | b '[[]] | |
25 | c '[[]] | |
26 | d '[[]] | |
27 | e '[[]] | |
28 | f '[[]] | |
29 | true (throw (Exception. "No applicable rules")))) | |
30 | ||
31 | (defn solve-goal [goal] | |
32 | (let [rules (fetch-rules goal)] | |
33 | (if (some empty? rules) | |
34 | 1.0 ; return a truth value | |
35 | (do | |
36 | (doseq [rule rules] | |
37 | (.submit completion-service (solve-rule rule))) | |
38 | (.get (.take completion-service)))))) | |
39 | ||
40 | ; Move minimization logic here from collect. | |
41 | (defn solve-rule [rule-tail] | |
42 | (let [truths (collect solve-goal rule-tail)] | |
43 | (apply min truths))) | |
44 | ||
45 | ; Accumulate results | |
46 | (def collect (if use-parallel-collect pmap map)) |