View difference between Paste ID: 5g3fjeN0 and BGFs91sK
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))