Как изменить локальные переменные в правиле? Система производства CLIPS - PullRequest
0 голосов
/ 08 февраля 2020

Я новичок в CLIPS, я был бы очень признателен за представление о моей проблеме. Таким образом, у меня есть шаблон, который отображает 3x3 со значениями числительных c, такими как судоку, каждое значение? V имеет свою строку? F1, столбец? C1 и характеристику c, называемую "состояние" типа строки, которая может быть активной или неактивно.

(deftemplate box
  (slot row)
  (slot column)
  (slot value)
  (slot state
  (allowed-values active inactive)
  (default inactive)))

(deffacts initial-values
  (box (row 1) (column 1) (value 1))
  (box (row 1) (column 2) (value 1))
  (box (row 1) (column 3) (value 1))
  (box (row 2) (column 1) (value 2))
  (box (row 2) (column 2) (value 3))
  (box (row 2) (column 3) (value 1))
  (box (row 3) (column 1) (value 2))
  (box (row 3) (column 2) (value 3))
  (box (row 3) (column 3) (value 56)))

Я написал правило, которое проверяет, есть ли значение, которое не повторяется в той же строке ни в одном столбце. Если это условие ИСТИНА, я хочу изменить статус на активный, потому что по умолчанию все значения неактивны, я рассмотрел синтаксис и не смог обработать эти переменные.

 (defrule uniqueness
   (exists (box (row ?f1) (column ?c1) (value ?v)(state inactive))
           (not (and (box (row ?f2) (column ?c2) (value ?v))
                     (test (or (!= ?f1 ?f2) (!= ?c1 ?c2))))))

   =>
   (printout t "There are values that are not repeated" crlf)
   ;;(modify (state active)) ;;this line causes me problems
   )

1 Ответ

1 голос
/ 10 февраля 2020

Существующий условный элемент сопоставляется только один раз, независимо от количества совпадений, которые он содержит, поэтому вне контекста существования не имеет смысла ссылаться на факты и переменные, которые были связаны с ним. Вы используете «существует», если хотите узнать в общем, соответствует ли хотя бы один факт набору условий, но вы не используете его, если вам нужно выполнить действие с указанным c фактом.

Чтобы решить ваша проблема, удалите существующее, а затем свяжите факт, соответствующий шаблону блока, с переменной, чтобы вы могли использовать эту переменную с командой изменения:

(defrule uniqueness
   ?b <- (box (row ?f1) (column ?c1) (value ?v) (state inactive))
   (not (and (box (row ?f2) (column ?c2) (value ?v))
             (test (or (!= ?f1 ?f2) (!= ?c1 ?c2)))))

   =>
   (printout t "There are values that are not repeated" crlf)
   (modify ?b (state active)))
...