执行自动聚焦规则后CLIPS聚焦模块

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

在 CLIPS 中,如果我们使用模块,那么我们可以对模块中的规则使用自动聚焦:

自动对焦规则属性允许自动对焦命令 每当规则激活时执行。如果自动对焦属性 如果规则为 TRUE,则将焦点命令集中在该规则所在的模块上 定义的规则在激活规则时会自动执行。

我的问题是:

如果我有两个模块 A 和 B,其中 B 有一个具有自动对焦属性的规则,并且当前我位于模块 A,则 B 中的规则将被激活,并且由于“自动对焦属性”,模块 B 会自动激活,规则执行后,焦点会回到模块A还是?

c clips expert-system
1个回答
0
投票

当您聚焦于某个模块时(使用焦点命令或自动聚焦),该模块将被推入堆栈。当该模块中的规则完成后,当前焦点将从堆栈中弹出,并且先前的模块现在将具有焦点。因此,在您的示例中,一旦模块 B 中的议程上没有更多规则,焦点将返回到模块 A。

         CLIPS (6.4.1 4/8/23)
CLIPS> (defmodule A (export ?ALL))
CLIPS> (deftemplate flag)
CLIPS> (defrule a1 => (assert (flag)))
CLIPS> (defrule a2 (flag) => (println "a2"))
CLIPS> (defmodule B (import A ?ALL))
CLIPS> (defrule b1 (declare (auto-focus TRUE)) (flag) => (println "b1"))
CLIPS> (reset)
CLIPS> (focus A)
TRUE
CLIPS> (list-focus-stack)
A
MAIN
CLIPS> (agenda)
0      a1: *
For a total of 1 activation.
CLIPS> (run 1)
CLIPS> (agenda *)
MAIN:
A:
   0      a2: f-1
B:
   0      b1: f-1
For a total of 2 activations.
CLIPS> (list-focus-stack)
B
A
MAIN
CLIPS> (run 1)
b1
CLIPS> (list-focus-stack)
A
MAIN
CLIPS> (run)
a2
CLIPS> 
© www.soinside.com 2019 - 2024. All rights reserved.