2013-05-30 2 views
1

У меня есть функция C, называемая "amortiss.c", и я хочу подключить ее к CLIPS (Expert System Tool). Infact, я хочу передать переменную «result», возвращенное функцией "amortiss.c" в CLIPS так, что он сравнивает это «result» 1, а затем выводит на экран сообщения в зависимости от comparaisonСвязь между CLIPS (экспертная система) и C - CLIPS и MATLAB

if (result <1) then (do...); 
else if (result ==1) then do (...); 

Согласно направляющему I Clips пользователя должен определять внешнюю функцию, называемую пользовательской функцией. Проблема в том, что эта функция является функцией CLIPS, написанной в C ..так, я не вижу, как она помогает мне подключить мой «amortiss.c» к CLIPS.

Можно ли также подключить клипы к Matlab? (связь между файлом .clp и .m файлом)?

Я ценю все ваши предложения и советы.

+0

Есть ли кто-нибудь, кто может мне помочь общаться хотя бы между клипами и файлом .CSV? На самом деле, я хочу, чтобы моя функция C amortiss.c передавала результат в файл .CSV, а затем Clips использует этот результат для выполнения некоторых вычислений с помощью функции C (называемой функцией Clips: user defined). Мне нужна ваша помощь. Поэтому мольбы помогают мне !!! Я ценю все ваши предложения. Спасибо. –

ответ

0

Вам не нужно определять внешнюю функцию. Это было бы, если бы вы хотели, чтобы CLIPS вызывал функцию C.

Заканчивать раздел "4.4.4 CreateFact" в этом документе:

http://clipsrules.sourceforge.net/documentation/v624/apg.htm

Он показывает, как утверждать новые факты в окружающую среду CLIPS. В предыдущем разделе 4.4.3 приведен пример того, как утверждать новую строку в CLIPS. Я не тестировал строку assert, но могу подтвердить, что пример 4.4.4 работает с deftemplate.

Например, создайте текстовый файл, "foo.clp":

(deftemplate foo 
(slot x (type INTEGER)) 
(slot y (type INTEGER)) 
) 

(defrule IsOne 
?f<-(foo (x ?xval)) 
(test (= ?xval 1)) 
=> 
(printout t ?xval " is equal to 1" crlf) 
) 

(defrule NotOne 
?f<-(foo (x ?xval)) 
(test (!= ?xval 1)) 
=> 
(printout t ?xval " is not equal to 1" crlf) 
) 

И создать программу C "foo.c"

#include <stdio.h> 
#include "clips.h" 

int addFact(int result) 
{ 

    VOID *newFact; 
    VOID *templatePtr; 
    DATA_OBJECT theValue; 

    //================== 
    // Create the fact. 
    //================== 
    templatePtr = FindDeftemplate("foo"); 
    newFact = CreateFact(templatePtr); 

    if (newFact == NULL) return -1; 

    //====================================== 
    // Set the value of the x 
    //====================================== 
    theValue.type = INTEGER; 
    theValue.value = AddLong(result); 
    PutFactSlot(newFact,"x",&theValue); 

    int rval; 

    if (Assert(newFact) != NULL){ 
    Run(-1); 
    rval = 0; 
    } 
    else{ 
    rval = -2; 
    } 

    return rval; 
} 


int main(int argc, char *argv[]){ 

    if (argc < 2) { 
    printf("Usage: "); 
    printf(argv[0]); 
    printf(" <Clips File>\n"); 
    return 0; 
    } 
    else { 

    InitializeEnvironment(); 
    Reset(); 

    char *waveRules = argv[1];  
    int wv = Load(waveRules); 

    if(wv != 1){ 
     printf("Error opening wave rules!\n"); 
    } 

    int result = 1; 

    addFact(result); 
    result = 3; 
    addFact(result); 
    } 
    return 0; 

} 

Пробег с:

foo foo.clp 

Это может быть излишним, но я думаю, что он выполняет свою работу!