Ошибка CLIPS: шаблон xxx не существует для assert - PullRequest
0 голосов
/ 18 октября 2019
  • Версия CLIPS: 6.31
  • язык: c++ clips C API

Почему я получаю эту ошибку? Как мне исправить эту ошибку?

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

Процесс выглядит следующим образом: во-первых, я создаю среду CLIPS из полного кода правила клипов, используя функцию ClipsEnvLoadFromString, я получу нормальный результат в этой среде CLIPS, используя EnvLoadFactsFromStringfunction.Next Я хочу скопировать несколько сред 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

Параметр Facts функции EnvLoadFactsFromString выглядит следующим образом:

(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)

1 Ответ

0 голосов
/ 18 октября 2019

После загрузки бинарного изображения вы не можете создавать новые конструкции. Упорядоченные факты и шаблоны (те, которые не имеют соответствующей конструкции 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> 
...