我想在使用剪辑时重新匹配规则。但是,刷新命令并不是每次都能正常工作。所以我做了一些测试,但还是很困惑。
Q1:(刷新)可以使用那些修改事实的规则吗?我创建了一个.CLP:
> (defglobal ?*lock* = 0)
>
> (deftemplate counter
> (slot number))
>
> (deffacts initial-data
> (counter (number 0)))
>
> (defrule rule-1
> ?f<-(counter (number ?x))
> (test (= ?*lock* 0))
> =>
> (printout t "counter number1" crlf)
> (bind ?*lock* (+ ?*lock* 10))
> (modify ?f (number (+ ?x 1)))
> )
>
> (defrule rule-2
> ?f<-(counter (number ?x))
> (test (= ?*lock* 10))
> =>
> (printout t "counter number2" crlf)
> (bind ?*lock* 0)
> )第一次运行后,锁变为0。但我键入(刷新规则-1),规则-1没有进入议程。我想知道这是否是因为RHS的修改行为造成了问题。
Q2:当使用刷新时,全局值在LHS中工作吗?
另一个奇怪的问题是,在第一次跑步之后。锁已更改为0.I类型(刷新规则-2),并再次在日程中查找规则-2。但是规则2的LHS有限制,如果规则想要匹配的话,锁应该等于10。看来测试条件根本不起作用。但是,当我第一次运行系统时,测试条件实际上是有效的,我的意思是输入(重置)和(运行)来运行系统。航站楼上的节目是这样的:
CLIPS> (复位) ==>激活0规则-1: f-1 CLIPS> (facts) f-0 (初始事实) f-1 (计数器( 0))共2条facts.CLIPS> (run)计数器number1 ==>激活0规则-2:F2计数器number2 CLIPS> (刷新规则-1) CLIPS> (刷新规则-2) ==>激活0规则-2: f-2 CLIPS> (run)计数器number2
我想知道在触发规则时(运行)和(刷新)之间是否有什么不同?
这真的让我很困惑。谢谢你的回答。
发布于 2014-05-16 17:04:35
全局变量不会触发模式匹配,因此您不应该在规则的条件下使用它们,除非它们的值从未改变。使用事实或实例来存储值,而不是全局值。在基本编程指南( http://clipsrules.sourceforge.net/documentation/v630/bpg.htm )第6节中提供了有关全局用户行为的信息,并在这里对它们的行为进行了另一个讨论:Number equality test fails in CLIPS pattern matching?。
在这个特定的例子中,当您执行(重置)时,会断言反事实触发模式匹配。匹配规则-1和规则-2的第一个条件,然后使用全局的当前值计算包含全局的后续测试。
执行规则-1时,全局值首先更改。这不会触发任何模式匹配。只有当反事实被修改时,模式匹配才会被触发。然后重新评估规则-1和规则-2的第一个条件,然后评估包含全局值及其当前值的后续测试。
执行规则-2时,会再次更改全局,但这不会触发模式匹配。任何事实都没有改变。就规则-1和规则-2的条件而言,没有对数据进行任何更改,从而使规则得到满足。因此,在进行刷新时,这两个规则的条件都认为?lock的值为10。
CLIPS> (watch rules)
CLIPS> (watch globals)
CLIPS> (watch facts)
CLIPS> (watch activations)
CLIPS> (reset)
<== f-0 (initial-fact)
:== ?*lock* ==> 0 <== 0
==> f-0 (initial-fact)
==> f-1 (counter (number 0))
==> Activation 0 rule-1: f-1
CLIPS> (run)
FIRE 1 rule-1: f-1
counter number1
:== ?*lock* ==> 10 <== 0
<== f-1 (counter (number 0))
==> f-2 (counter (number 1))
==> Activation 0 rule-2: f-2
FIRE 2 rule-2: f-2
counter number2
:== ?*lock* ==> 0 <== 10
CLIPS>总之,不要以您一直使用的方式使用全局变量。它们不是为此目的而设计的。如果要将信息从一条规则传递到另一条规则的条件,请使用事实和/或实例。
https://stackoverflow.com/questions/23698181
复制相似问题