Связь между CLIPS (экспертная система) и C - CLIPS и MATLAB

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

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

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

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

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


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


Ответы (1)


Вам не нужно определять внешнюю функцию. Это было бы, если бы вы хотели, чтобы 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

Возможно, это перебор, но я думаю, что он выполняет свою работу!

person bonafidegeek    schedule 07.06.2013