【问题标题】:How to Reset the fact-index when assert new fact?断言新事实时如何重置事实索引?
【发布时间】:2014-04-09 02:50:24
【问题描述】:

我已将 CLIPS 嵌入到 C 语言中。 我有这样的情况: 在 .clp 文件中,我有事实清单

(deftemplate sensor
 (slot name) 
 (slot status)) 

(deffacts FRONTSENSOR
(sensor (name 1) (status 1))
(sensor (name 2) (status 1))
(sensor (name 3) (status 0))
(sensor (name 4) (status 0))
(sensor (name 5) (status 1))
(sensor (name 6) (status 0))
(sensor (name 7) (status 0))
(sensor (name 8) (status 0))) 

现在我想取消这些事实并在列表中声明新的事实。 我使用Retract(factPtr); 取消事实并使用AssertString("(sensor (name 1) (status 0))"); 断言事实。 我打印事实清单,结果是

f-0     (initial-fact)
f-11    (sensor (name 1) (status 0))
f-12    (sensor (name 2) (status 0))
f-13    (sensor (name 3) (status 1))
f-14    (sensor (name 4) (status 0))
f-15    (sensor (name 5) (status 0))
f-16    (sensor (name 6) (status 0))
f-17    (sensor (name 7) (status 1))
f-18    (sensor (name 8) (status 1))
For a total of 9 facts.

fact-index 是从 11 开始而不是 1,我想知道新断言的事实是否可以从 f-1 开始的功能或解决方案。 ps:Clear()function 可以重置fact-index,但是规则也会被清理。好像没什么用。

感谢您的回答或任何想法。

【问题讨论】:

    标签: clips


    【解决方案1】:

    Reset() 函数将删除所有事实并重置事实索引而不删除任何规则。

    【讨论】:

    • 谢谢,但是如果使用 Reset() 函数,“deffacts FRONTSENSOR”也会再次断言到列表中。
    • 那么不,没有重置事实索引而不进行重置的机制。索引的分配是对事实的直接分配,然后递增下一个事实索引值,因此如果您将其重置为 0 而不删除所有现有事实,您最终会得到具有相同索引的多个事实。
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多