Backchaining Code
backchain works as follows: if the goal is known to be a fact, return true. Otherwise, try rules to see if some rule has the goal as conclusion and has premises that are true (using backchain).
(defn backchain [goal rules facts]  ; true if
 (or (member goal facts)    ; goal is known fact
     (some            ; or there is some rule
       (fn [rule]     ;  that concludes
         (and (= (first rule) goal) ;  goal
              (every?  ; and every premise
                (fn [premise]  ; can be proved
                  (backchain premise rules facts))
                (rest rule))))
       rules)) )
>(backchain 'e '((c a b) (e c d)) '(a b d)) true
This form of backchaining is useful when there are relatively few rules but many facts, e.g. stored in a separate database.