在使用CLIPS时,如何在不重置事实的情况下运行剪辑

时间:2014-05-15 16:53:04

标签: clips

这是我的情况: 我想定期运行CLIPS,系统可以记录它运行的次数。 例如:我输入终端"运行"很多次定期打电话给系统。然后系统可以记录系统运行的数量并在屏幕上显示。这是我的.clp文件

(defglobal ?*lock* = 0)

(deftemplate counter
    (slot number))

(deffacts initial_data
    (counter (number 0))
)

(defrule set_counter
    ?f<-(counter (number ?x))
    (test (= ?*lock* 0))
=>
    (bind ?*lock* 1)
    (printout t "plus 1" crlf)
    (modify ?f (number (+ ?x 1)))
)

(defrule show_result
    ?f<-(counter (number ?x))
    (test (= ?*lock* 1))
=>
    (printout t "the counter value has been changed:" crlf)
    (ppfact (fact-index ?f) t)
    (bind ?*lock* 0)
)

我使用全局值作为锁来控制规则并将运行时间存储在名为counter的事实中。现在是我的问题:一旦系统第一次运行完毕。议程中没有规则了。我希望系统可以在不重置事实的情况下再次运行,系统可以处理从第一个运行过程中保存的事实。如何更新议程或重新匹配规则而不重置事实?

我找到了一些命令,如(刷新规则名称)和(刷新日程),但它们无法解决我的问题。我只需输入&#34;(刷新set_counter)&#34;和&#34;(刷新议程)&#34;在&#34;(运行)&#34;之后。但是,没有任何规则被添加到议程中。

我不知道我的问题是否有解决办法,或者剪辑不能像这样工作?

另一个问题是我尝试(刷新规则名称)

(defglobal ?*lock* = 0)

(deftemplate counter
    (slot number))

(deftemplate set
    (slot number))

(deffacts initial_data
    (counter (number 0))
)
    (defrule set_counter
        (initial-fact)
    =>
        (bind ?*lock* (+ ?*lock* 1))
        (printout t ?*lock* crlf)
    )

工作正常。我不知道为什么它在第一个例子中不起作用? 非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

全局变量不会触发模式匹配,因此除非值永远不会更改,否则您不应在规则条件下使用它们。如果使用事实来表示锁定,则规则将按指定的周期执行:

(deftemplate lock
    (slot value))

(deftemplate counter
    (slot number))

(deffacts initial_data
    (counter (number 0))
    (lock (value 0))
)

(defrule set_counter
    ?f <- (counter (number ?x))
    ?l <- (lock (value 0))
=>
    (modify ?l (value 1))
    (printout t "plus 1" crlf)
    (modify ?f (number (+ ?x 1)))
)

(defrule show_result
    ?f <- (counter (number ?x))
    ?l <- (lock (value 1))
=>
    (printout t "the counter value has been changed:" crlf)
    (ppfact (fact-index ?f) t)
    (modify ?l (value 0))
)