6.31
c++
clips C API
为什么会出现此错误?我该如何解决该错误?
[FACTRHS1] Template be-contact-model.riskLevel does not exist for assert.
Function load-facts encountered an error
[过程如下:首先,我使用ClipsEnvLoadFromString
函数从完整剪辑规则代码创建一个CLIPS环境,使用EnvLoadFactsFromString
函数在此CLIPS环境中将获得正常结果。接下来,我要复制多个CLIPS环境,因此,我使用EnvBsave
函数将规则保存在二进制映像文件中,然后使用EnvBload
函数从二进制文件加载新环境,然后使用EnvLoadFactsFromString
函数加载用户事实。但是EnvLoadFactsFromString
函数返回false,cli stdout
得到错误字符串:
[FACTRHS1] Template be-contact-model.riskLevel does not exist for assert.
Function load-facts encountered an error
EnvLoadFactsFromString
函数的facts参数如下:
(appId "TEST")
(be-contact-model.riskLevel "PASS")
(be-contact-model.score 0)
(channel "POST_TEXT.RlokQwRlVjUrTUlkIqOg.COMMENT")
(constantKey "constantKey")
(contact.model "contact_detector(GO)")
(contact.nicknameResult.has_contact FALSE)
(contact.nicknameResult.has_qq FALSE)
(contact.nicknameResult.has_tel FALSE)
(contact.nicknameResult.has_url FALSE)
(contact.nicknameResult.has_wechat FALSE)
(contact.riskLevel "PASS")
(contact.score 0)
(contact.textResult.baidusearch.REJECT_LEVEL 0)
(contact.textResult.has_contact FALSE)
(contact.textResult.has_qq FALSE)
(contact.textResult.has_tel FALSE)
(contact.textResult.has_url FALSE)
(contact.textResult.has_wechat FALSE)
一旦加载了二进制映像,就无法创建任何新构造。有序事实和模式(没有相应的deftemplate构造的事实和模式)会自动创建deftemplate。如果您的规则尚未创建此自动deftemplate,则在加载二进制图像后将无法创建它:
CLIPS (6.31 6/12/19)
CLIPS> (bsave example.bin)
TRUE
CLIPS> (bload example.bin)
TRUE
CLIPS> (assert (be-contact-model.riskLevel "PASS"))
[FACTRHS1] Template be-contact-model.riskLevel does not exist for assert.
CLIPS>
如果您有与排序的事实匹配的规则,则可以在加载二进制图像后断言这种类型的事实。
CLIPS> (clear)
CLIPS>
(defrule r1
(be-contact-model.riskLevel ?)
=>)
CLIPS> (bsave example.bin)
TRUE
CLIPS> (clear)
CLIPS> (bload example.bin)
TRUE
CLIPS> (assert (be-contact-model.riskLevel "PASS"))
<Fact-0>
CLIPS>
因此,您收到一条错误消息的事实表明您正在尝试断言任何规则都无法匹配的事实。
看起来您的事实是属性/值对,因此,如果您断言没有规则可以匹配的事实,您可以做的一件事就是创建一个通用的deftemplate来代表所有这些特征:
CLIPS> (clear)
CLIPS> (deftemplate av (slot a) (slot v))
CLIPS> (assert (av (a be-contact-model.riskLevel) (v "PASS")))
<Fact-1>
CLIPS>