Я пытаюсь реализовать возможные ходы слона на шахматном столе, у которого могут быть другие фигуры на случайных клетках. Мне удалось сделать набросок ответа, но он не обнаружил другие фрагменты.
Ранее к этому правилу я написал некоторый код, который создает факт, подобный следующему, для каждой ячейки таблицы, указывая ее содержимое:
(cell-info (coor {i} {j}) (contents {empty|black|white}))
и факт, показывающий положение фигуры:
(piece (row {r}) (column {c}) (type {t}) (color {col}))
А вот мое правило (возможно, оно тоже не слишком эффективно):
(defrule bishop-moves
(declare (salience 30))
(piece (row ?rb) (column ?cb) (type bishop) (color black))
(cell-info (coor ?i ?j) (contents empty|white))
=>
(loop-for-count (?n 1 8)
(if (or (and (= ?i (+ ?rb ?n)) (= ?j (+ ?cb ?n)))
(and (= ?i (- ?rb ?n)) (= ?j (- ?cb ?n)))
(and (= ?i (+ ?rb ?n)) (= ?j (- ?cb ?n)))
(and (= ?i (- ?rb ?n)) (= ?j (+ ?cb ?n))))
then (assert (movement-allowed
(destination-cell ?i ?j)
(type bishop)
(start-cell ?rb ?cb))))))
Кто-нибудь теперь, что я мог сделать? Заранее спасибо.