CLIPS 错误:断言模板 xxx 不存在

CLIPS Error:Template xxx does not exist for assert

为什么会出现此错误?我应该如何修复此错误?

[FACTRHS1] Template be-contact-model.riskLevel does not exist for assert.
Function load-facts encountered an error

过程如下:首先,我使用ClipsEnvLoadFromString函数从完整的剪辑规则代码创建一个CLIPS环境,我将在这个CLIPS环境中使用EnvLoadFactsFromString得到一个正常的结果function.Next我想复制多个CLIPS环境, 所以我使用 EnvBsave 函数将规则保存在二进制图像文件中,然后我使用 EnvBload 函数从二进制文件加载新环境,然后我使用 EnvLoadFactsFromString 函数加载用户 facts.But EnvLoadFactsFromString 函数 return 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> 

因此,您收到一条错误消息这一事实表明您正试图断言 none 个规则可以匹配的事实。

看起来你的事实是 attribute/value 对,所以如果你断言没有规则可以匹配的事实,你可以做的一件事是创建一个通用的 detemplate 来表示所有这些:

CLIPS> (clear)
CLIPS> (deftemplate av (slot a) (slot v))
CLIPS> (assert (av (a be-contact-model.riskLevel) (v "PASS")))
<Fact-1>
CLIPS>