首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLIPS在FlushMultifields()中使用EnvEval和查找事实命令冻结。

CLIPS在FlushMultifields()中使用EnvEval和查找事实命令冻结。
EN

Stack Overflow用户
提问于 2016-01-19 16:15:09
回答 1查看 68关注 0票数 0

我在剪辑中遇到了一个很难调试的奇怪问题。我有以下事实清单:

代码语言:javascript
复制
f-0     (initial-fact)
f-1     (SpinWave (quantum_number_names "charge" "isospin" "spin" "parity" "cparity") (quantum_number_values 0 1 2 -1 -1))
f-2     (SpinWave (quantum_number_names "charge" "isospin" "spin" "parity" "cparity") (quantum_number_values 0 1 3 -1 -1))
f-3     (SpinWave (quantum_number_names "charge" "isospin" "spin" "parity" "cparity") (quantum_number_values 0 1 4 -1 -1))
f-4     (SpinWave (quantum_number_names "charge" "isospin" "spin" "parity" "cparity") (quantum_number_values 0 3 1 -1 1))
f-5     (ViolatingRulesForDecay (list_of_violated_rules))
f-6     (SpinQuantumNumber (unique_id 1) (numerator 0) (denominator 1) (z_component_numerator 0))
f-7     (SpinQuantumNumber (unique_id 2) (numerator 1) (denominator 1) (z_component_numerator -1))
f-8     (SpinQuantumNumber (unique_id 3) (numerator 1) (denominator 1) (z_component_numerator 0))
f-9     (SpinQuantumNumber (unique_id 4) (numerator 1) (denominator 1) (z_component_numerator 1))
f-10    (SpinQuantumNumber (unique_id 5) (numerator 2) (denominator 1) (z_component_numerator -2))
f-11    (SpinQuantumNumber (unique_id 6) (numerator 2) (denominator 1) (z_component_numerator -1))
f-12    (SpinQuantumNumber (unique_id 7) (numerator 2) (denominator 1) (z_component_numerator 0))
f-13    (SpinQuantumNumber (unique_id 8) (numerator 2) (denominator 1) (z_component_numerator 1))
f-14    (SpinQuantumNumber (unique_id 9) (numerator 2) (denominator 1) (z_component_numerator 2))
f-15    (AllowedQuantumNumbers (name "spin") (values 1 2 3 4 5 6 7 8 9))
f-16    (AllowedQuantumNumbers (name "isospin") (values 1 2 3 4))
f-17    (AllowedQuantumNumbers (name "charge") (values -1 0 1))
f-18    (AllowedQuantumNumbers (name "parity") (values -1 1))
f-19    (AllowedQuantumNumbers (name "cparity") (values -1 1))
For a total of 20 facts.

我试图在c++中寻找其中一个事实,我这样做的方式如下:

代码语言:javascript
复制
DATA_OBJECT found_spin_quantum_number_facts;
std::stringstream clips_query;
clips_query << "(find-fact ((?f SpinQuantumNumber)) 
(and (= ?f:numerator " << spin_state.J_numerator_ << ") (and (= 
?f:denominator " << spin_state.J_denominator_ << ") (= 
?f:z_component_numerator " << spin_state.J_z_numerator_ << "))))";

std::cout << clips_query.str() << std::endl;
EnvEval(clips_environment_, clips_query.str().c_str(),
  &found_spin_quantum_number_facts);

它工作了好几次,直到它用下面的剪辑表达式中断为止(在我看来是合法的,直到它失败了几次):

代码语言:javascript
复制
(find-fact ((?f SpinQuantumNumber)) (and (= ?f:numerator 0) (and (= ?f:denominator 1) (= ?f:z_component_numerator 0))))

查找事实函数实际上完成了执行,但是在函数FlushMultifields()剪辑中卡住了.我遗漏了什么?提前感谢!

史蒂夫

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-20 06:54:44

所以我继续调试它,正如Gary提到的,这个问题完全是在其他地方发生的。我用一个已经指向现有事实的地址断言了一个事实(可以这么说,在事实堆栈上)。不知道我当时在想什么..。

代码语言:javascript
复制
void* ifs_template = EnvFindDeftemplate(clips_environment_,
  "InitialAndFinalState");
void* ifs_fact = EnvCreateFact(clips_environment_, ifs_template);
if (ifs_fact != NULL) {
  DATA_OBJECT field;
  field.type = FACT_ADDRESS;

  OLD-CODE: field.value = EnvAssert(clips_environment_,
    addSpinWaveToClipsEnvironment(initial_state));
  NEW-CODE: field.value = 
    addSpinWaveToClipsEnvironment(initial_state);
  EnvPutFactSlot(clips_environment_, ifs_fact, "initial_state", &field);

addSpinWaveToClipsEnvironment()函数创建一个新的SpinWave事实(如果不存在),并将事实地址返回给这个事实。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34881690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档