;; Magic Squares ;; (deffacts init ;; init the array elements (element 1 1 2) ;; changing any val => NOT MAGIC (element 1 2 1) ;; fact is: element (element 1 3 1) (element 2 1 1) (element 2 2 1) (element 2 3 1) (element 3 1 1) (element 3 2 1) (element 3 3 1) ;; init the array size (size 3) ;; init the accumulators (sum row 1 0) (sum row 2 0) (sum row 3 0) (sum col 1 0) (sum col 2 0) (sum col 3 0) (sum diag 1 0) (sum diag 2 0) ) ;; ================================== ;; make a 'addition' term's for for rows, cols and diags (2) (defrule make-terms (declare (salience 300)) (size ?n) (element ?r ?c ?v) => (assert (term row ?r ?c ?v) ;; addends for rows and col (term col ?c ?r ?v)) (if (= ?r ?c) then (assert (term diag 1 ?r ?v))) ;; addend for diag2 (if (= (+ ?r ?c) (+ 1 ?n)) then (assert (term diag 2 ?r ?v)))) ;; addend for diag2 ;;================================== ;; add ?val of term on {row | col | diag} ?i ?j ;; to sum of {row | col | diag } ?i (defrule addem (declare (salience 300)) ?f1<-(sum ?type ?i ?sv) ?f2<-(term ?type ?i ? ?ev) => (retract ?f1 ?f2) (assert (sum ?type ?i (+ ?sv ?ev)))) ;; check if not magic (defrule not-magic (declare (salience 200)) (sum ?x ?i ?s) (sum ?y ?l ?r) (test (<> ?r ?s)) => (printout t "Not Magic." crlf) (halt)) (defrule magic (declare (salience 100)) (not (term $?)) => (printout t "Magic!!" crlf) )