检查是否发生了 CLIPS RHS 匹配条件

Check if a CLIPS RHS Match condition happened

我正在使用 CLIPS 环境来创建这样的规则:

(defrule rule1
(ACTIVE)
(AGE_YEARS ?ay)
=>
(if (< ?ay 15) then
    (assert (Please do not enter))
    )
(if (> ?ay 18) then
    (assert (Go ahead and enter))
    )
)

如果我发送事实 (ACTIVE) 和 (AGE_YEARS 10),我可以使用匹配命令(匹配规则 1)来查看它是否被激活,因为两个条件都为真,但我想知道是否有从 RHS 部分检查的“匹配”命令类型,如果完全匹配,则条件匹配...正如我本可以发送的 (AGE_YEARS 17),规则仍将被触发,但 RHS 条件不会匹配。

matches 命令显示匹配条件的当前状态。它没有显示如果执行规则的操作会发生什么。如果您创建多个规则,您可以将条件从规则的 RHS 部分移动到 LHS,这样如果没有匹配的规则,matches 命令将显示给您。

CLIPS> 
(defrule rule1-lt-15
   (ACTIVE)
   (AGE_YEARS ?ay&:(< ?ay 15))
   =>
   (assert (Please do not enter)))
CLIPS>    
(defrule rule1-gt-18
   (ACTIVE)
   (AGE_YEARS ?ay&:(> ?ay 18))
   =>
   (assert (Go ahead and enter)))
CLIPS> (assert (ACTIVE))
<Fact-1>
CLIPS> (assert (AGE_YEARS 17))
<Fact-2>
CLIPS> (agenda)
CLIPS> (assert (AGE_YEARS 10))
<Fact-3>
CLIPS> (agenda)
0      rule1-lt-15: f-1,f-3
For a total of 1 activation.
CLIPS> 

或者,您可以使用事实来表示 RHS 中当前使用的条件,然后将它们放在 LHS 中,这样您就可以保留一条规则。

CLIPS> (clear)
CLIPS> 
(deftemplate rhsc
   (multislot condition)
   (multislot action))
CLIPS> 
(deffacts rhs-conditions
   (rhsc (condition < 15) (action Please do not enter))
   (rhsc (condition > 18) (action Go ahead and enter)))
CLIPS>    
(defrule rule1
   (ACTIVE)
   (AGE_YEARS ?ay)
   (rhsc (condition ?o ?v) (action $?action))
   (test (funcall ?o ?ay ?v))
   =>
   (assert (result ?action)))
CLIPS> (reset)
CLIPS> (assert (ACTIVE))
<Fact-3>
CLIPS> (assert (AGE_YEARS 10))
<Fact-4>
CLIPS> (agenda)
0      rule1: f-3,f-4,f-1
For a total of 1 activation.
CLIPS> (run)
CLIPS> (facts)
f-1     (rhsc (condition < 15) (action Please do not enter))
f-2     (rhsc (condition > 18) (action Go ahead and enter))
f-3     (ACTIVE)
f-4     (AGE_YEARS 10)
f-5     (result Please do not enter)
For a total of 5 facts.
CLIPS> (assert (AGE_YEARS 17))
<Fact-6>
CLIPS> (agenda)
CLIPS> (assert (AGE_YEARS 19))
<Fact-7>
CLIPS> (agenda)
0      rule1: f-3,f-7,f-2
For a total of 1 activation.
CLIPS> (run)
CLIPS> (facts)
f-1     (rhsc (condition < 15) (action Please do not enter))
f-2     (rhsc (condition > 18) (action Go ahead and enter))
f-3     (ACTIVE)
f-4     (AGE_YEARS 10)
f-5     (result Please do not enter)
f-6     (AGE_YEARS 17)
f-7     (AGE_YEARS 19)
f-8     (result Go ahead and enter)
For a total of 8 facts.
CLIPS>