2016-01-19 29 views
0

CLIPS出現了一個奇怪的問題,它很難調試。 我有以下事實清單:CLIPS在FlushMultifields()中使用EnvEval和find-fact命令凍結

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. 

我試着去尋找℃以內的事實之一++和我這樣做以下列方式:

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

這一發現,其實函數實際上執行完畢,豪ver在函數FlushMultifields()剪輯卡住了......我錯過了什麼?提前致謝!

史蒂夫

+0

好吧,我打開了剪輯的調試標誌,並且它卡在FlushMultiflields函數中,因爲busyCount標誌設置爲1,無論如何。這裏是代碼段... 'while(theSegment!= NULL) { nextPtr = theSegment-> next; if(theSegment-> busyCount == 0) {' – steve

+0

您的問題中沒有足夠的信息來診斷問題。你的代碼片段包含一個簡單的EnvEval調用,它沒有什麼明顯的錯誤,並且它在你調用它的前幾次都是有效的。問題的最可能原因超出了您發佈的代碼範圍(例如,問題可能出現在EnvEval之後的代碼中)。 –

回答

0

所以我一直調試它,和加里提到的問題是地方完全人。我用一個已經指向現有事實的地址(在事實堆棧中這麼說)來斷言一個事實。不知道我在想什麼有...

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事實上,如果不存在,並返回事實地址這一事實。