代码之家  ›  专栏  ›  技术社区  ›  steve

CLIPS使用EnvEval和find fact命令在FlushMultifields()中冻结

  •  0
  • steve  · 技术社区  · 9 年前

    我发现CLIPS有一个奇怪的问题,很难调试。 我有以下事实清单:

    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++中搜索其中一个事实,我用以下方法进行搜索:

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

    它可以工作几次,直到它与以下剪辑表达式(在我看来是合法的,并且可以工作几遍,直到它失败)断开:

    (find-fact ((?f SpinQuantumNumber)) (and (= ?f:numerator 0) (and (= ?f:denominator 1) (= ?f:z_component_numerator 0))))
    

    find-fact函数实际上完成了执行,但是在函数FlushMultifields()中,剪辑被卡住了…我缺少什么?提前谢谢!

    史蒂夫

    1 回复  |  直到 9 年前
        1
  •  0
  •   steve    9 年前

    所以我一直在调试它,正如Gary提到的,问题完全出在别的地方。我用一个已经指向现有事实(可以说是事实堆栈上)的地址断言一个事实。不知道我在想什么。。。

    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事实(如果不存在),并返回该事实的事实地址。