【问题标题】:Illogical unmatch in clips剪辑中不合逻辑的不匹配
【发布时间】:2016-03-18 12:26:59
【问题描述】:

我对 Clips 中的规则匹配有疑问,尤其是我无法理解为什么此规则不起作用!。 我有一个名为 REASONING 的模块,我用这个 deftemplate 定义了一个事实 (deftemplate planning (slot value (allowed-values start stop)))。 我第一次关注这个模块时,我用这个规则来断言这个事实

(defrule start-reasoning
 (declare (salience 90))
 (not (planning))
 =>
 (assert (planning (value start)))
)

接下来,这个事实将永远不会收回,而只会修改它的插槽。 在我定义 planning 的同一个模块中,我有另一个规则,它从开始到停止改变了值。

(defrule plan-done
    (declare (salience 60))
    ?<-(planning(value start)
    =>
    (modify ?p (value stop))
)

这是此模块激活的最后一条规则。之后剪辑执行一个弹出焦点。现在轮到再次关注这个模块时,我发现 (planning (value stop))

f-4839  (explore-memory (pos-r 2) (pos-c 5) (direction west)(action turnleft)
(param1 nil) (param2 nil) (param3 nil) (open-depth 0) (ident 0))
f-4843  (planning (value stop))
f-4845  (exec (step 0)(action turnleft)(param1 nil)(param2 nil) (param3 nil))
f-5029  (exec (step 1)(action turnright)(param1 nil)(param2 nil)(param3 nil))

所以我希望必须激活所写的规则,但它不会发生! 再次更改插槽值的条件是在模块 PLAN_MANAGER 中,因此我不能在 REASONING 中激活任何其他规则,直到 Clips 不执行关注 PLAN_MANAGER。

(defrule go-to-plan-manager
  (declare (salience 90))
  (planning (value stop))
  =>
  (focus PLAN_MANAGER)
) 

奇怪的是,如果我调用匹配函数,我会得到这个输出。

>(matches go-to-plan-manager)
Matches for Pattern 1
f-4843
Activations
None

任何人都可以帮助我理解为什么 CLIPS 没有列入议程 go-to-plan-manager ?我哪里错了?

【问题讨论】:

    标签: clips expert-system inference-engine


    【解决方案1】:

    鉴于缺乏可重现的示例来证明其他情况,最可能的解释是 go-to-plan-manager 在焦点最初弹出之前的某个时间点执行。重新关注模块只会更改从中提取激活的议程,但不会重新激活之前执行的规则。

    我可以根据您包含的代码片段创建的最简单示例表明,您的 go-to-plan-manager 规则将在 plan-done 规则之后立即执行,除非有其他一些显着性为 90 或更高的规则在 go-to-plan-manager 规则执行之前弹出焦点。

    CLIPS> (deftemplate planning (slot value (allowed-values start stop)))
    CLIPS> 
    (defrule start-reasoning
     (declare (salience 90))
     (not (planning))
     =>
     (assert (planning (value start))))
    CLIPS> 
    (defrule plan-done
        (declare (salience 60))
        ?p<-(planning(value start))
        =>
        (modify ?p (value stop)))
    CLIPS> 
    (defrule go-to-plan-manager
      (declare (salience 90))
      (planning (value stop))
      =>
      (printout t "go-to-plan-manager executed" crlf))
    CLIPS> (reset)
    CLIPS> (watch rules)
    CLIPS> (run)
    FIRE    1 start-reasoning: *
    FIRE    2 plan-done: f-1
    FIRE    3 go-to-plan-manager: f-2
    go-to-plan-manager executed
    CLIPS> (matches go-to-plan-manager)
    Matches for Pattern 1
    f-2
    Activations
     None
    (1 0 0)
    CLIPS> 
    

    【讨论】:

    • 非常感谢,有一条显着性较高的规则在执行 go-to-plan-manager 之前执行了 pop-focus。
    猜你喜欢
    • 2021-03-19
    • 2017-03-02
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多