这是我的情况: 我想定期运行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)
)
工作正常。我不知道为什么它在第一个例子中不起作用? 非常感谢任何建议。
答案 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))
)