【问题标题】:CLIPS: One-time pattern matching a value of a multislotCLIPS:一次性模式匹配多槽的值
【发布时间】:2017-05-14 11:18:17
【问题描述】:

我在this 读到了,所以回答一下

创建或删除实例时,所有适用于 该对象已更新。然而,当一个槽被改变时,只有那些 在该插槽上显式匹配的模式会受到影响。

现在我有以下问题: 我有一个多槽,随着时间的推移接收越来越多的物品。

我有一条规则R1,如果"some_value" 包含在多槽中,就会触发该规则。当我将"some_value" 添加到多插槽时,一切都按预期工作。但是,如果我添加另一个项目,例如 "another_value" 到多槽,R1 会再次触发。这与我上面引用的一致,但这不是我想要的。如果"some_value" 包含在多槽中,我希望R1 仅触发一次,并且如果向多槽中添加另一个值,我不希望R1 再次触发。

我该怎么做?

我可以使用多个插槽而不是多插槽,但如果我不知道可能值的数量,这将不起作用。

【问题讨论】:

    标签: clips expert-system


    【解决方案1】:

    如果您无法将值分配给不同的槽(这是您通常处理所选更改的触发规则的方式),那么您需要跟踪哪些更改已被处理。跟踪已处理的规则或值将是最直接的方法。如果每个规则只处理一个值,那么跟踪规则会更好,这样您就可以为相同的值更改触发多个规则。这是一个示例,其中规则 R1 和 R2 仅限于一次更改,而规则 R3 展示了您当前遇到的行为:

    CLIPS> (clear)
    CLIPS> 
    (defclass XAMPL
       (is-a USER)
       (multislot properties)
       (multislot processed))
    CLIPS>    
    (definstances initial
      ([x1] of XAMPL))
    CLIPS> 
    (defrule add_some_value
       (declare (salience -1))
       ?o <- (object (name [x1])
                     (properties $?p&:(not (member$ some_value ?p))))
       =>
       (modify-instance ?o (properties some_value ?p)))  
    CLIPS> 
    (defrule add_another_value
       (declare (salience -2))
       ?o <- (object (name [x1])
                     (properties $?p&:(not (member$ another_value ?p))))
       =>
       (modify-instance ?o (properties another_value ?p)))  
    CLIPS>      
    (defrule R1
       ?o <- (object (name [x1])
                     (properties $?properties&:(member$ some_value ?properties))
                     (processed $?processed&:(not (member$ R1 ?processed))))
       =>
       (modify-instance ?o (processed ?processed R1))
       (printout t "Rule R1 fires" crlf))  
    CLIPS> 
    (defrule R2
       ?o <- (object (name [x1])
                     (properties $?properties&:(member$ some_value ?properties))
                     (processed $?processed&:(not (member$ some_value ?processed))))
       =>
       (modify-instance ?o (processed ?processed some_value))
       (printout t "Rule R2 fires" crlf))  
    CLIPS> 
    (defrule R3
       (object (name [x1])
               (properties $?properties&:(member$ some_value ?properties)))
       =>
       (printout t "Rule R3 fires" crlf))  
    CLIPS> (reset)
    CLIPS> (run)
    Rule R2 fires
    Rule R1 fires
    Rule R3 fires
    Rule R3 fires
    CLIPS>
    

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多