(defglobal ?*N* = 8 ) (deffunction free_table (?n) (loop-for-count (?nr 1 ?n) do (loop-for-count (?letter 1 ?n) do (assert(free ?nr ?letter)) ) ) (return) ) ;(deffacts alphabet ; (letters a b c d e g h i j k l m n o p q r s t u v w x y z) ;) (defrule init-table (initial-fact) => (free_table ?*N*) ) (defrule place_first_queen (not (queen ? ?)) (free ? ?) => (assert(queen 1 1)) (assert(level 2)) ) ; level - next' column index (defrule next_queen (declare (salience 10)) ?level_fact <- (level ?column) ?free_fact <- (free ?line ?column) (not (non_free ?line ?column)) (test (<= ?column ?*N*)) => (assert (queen ?line ?column)) (retract ?free_fact) (retract ?level_fact) (assert (level (+ 1 ?column))) ) (defrule update_spaces (declare (salience 20)) (queen ?l ?c) ?free_fact <- (free ?fl ?fc) (or (test (= ?fl ?l)) (test (= ?fc ?c)) (test (= (- ?fc ?c) (- ?fl ?l))) (test (= (+ ?fc ?fl) (+ ?l ?c))) (non_free ?fl ?fc) ) => (retract ?free_fact) ) (defrule back (declare (salience 0)) ?level_fact <- (level ?level) ?queen_fact <- (queen ?line ?column) (test (= ?level (+ 1 ?column))) (not (free ? ?level)) => (free_table ?*N*) (retract ?queen_fact) (retract ?level_fact) (assert (non_free ?line ?column)) (assert (level ?column)) ) (defrule exit (declare (salience 1000)) (level ?level) (test (> ?level ?*N*)) => (halt) ) (defrule control_non_free_fields (declare (salience 10)) (level ?level) ?non_free_fact <- (non_free ?line ?column) (test (>= ?column ?level)) => (retract ?non_free_fact) )