如何在规则中修改局部变量? CLIPS生产系统

问题描述 投票:0回答:1

我是CLIPS的新手,非常感谢您对我的问题的任何想法。总而言之,我有一个模板,该模板用诸如sudoku的数值绘制3x3的图形,每个值?v都有其行?f1,列?c1和一个称为“状态”的字符串类型的特征,该特征可以是活动的或不活动的。

(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)))

我编写了一个规则,用于验证是否在同一行和同一列中都没有重复该值。如果此条件为TRUE,那么我想将状态更改为active,因为默认情况下所有值都是非活动的,我已经检查了语法,并且无法处理这些变量。

 (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
   )

clips expert-system
1个回答
0
投票

存在条件元素无论匹配包含多少匹配项,都仅匹配一次,因此,在存在条件范围之外,引用约束在其中的事实和变量没有意义。如果您想总体上知道至少一个事实是否符合一组条件,则使用存在,但是如果您需要对特定事实执行操作,则不使用它。

要解决您的问题,请删除存在的内容,然后将与框模式匹配的事实绑定到变量,以便您可以通过Modify命令使用该变量:

(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)))
© www.soinside.com 2019 - 2024. All rights reserved.