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

问题描述 投票:0回答:1
  • CLIPS版本: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)
rules rule-engine clips expert-system
1个回答
0
投票

一旦加载了二进制映像,就无法创建任何新构造。有序事实和模式(没有相应的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> 
© www.soinside.com 2019 - 2024. All rights reserved.