2015-03-26 3 views
-1

Я написал код в JESS. Теперь я запускаю код с Java. Я столкнулся с этой проблемой, что хочу иметь команду engine.execute ("") в цикле for. Мой пример кода:running r.execute() из Java в цикле for

for (int i = 0; i < 10; i++){ 
    for (int j = 0; j < 10; j++){ 
r.executeCommand("(answer(ident headers.get(i)(text patientData.get(j).get(i))"); 
    } 
} 

где ответ является deftemplate в Джесс с двумя слотами. Я читаю текстовый файл в Java и вставляю значения в слоты deftemplate.

Спасибо, Али

+0

Вы действительно не задали вопрос или не предоставили никакой информации о том, какую ошибку вы имеете. Пожалуйста, предоставьте более подробную информацию о том, в чем проблема. –

+0

Ну, для начала вы не можете использовать имена переменных в строковых кавычках, потому что это будет печатать буквальное имя, а не значение. Для построения строки, содержащей переменные, вам необходимо использовать оператор строки concat. Ex: '' (answer (ident headers.get ("+ i +") (text patientData.get ("+ j +"). Get ("+ i +")) "' –

+0

Извините, я не добавил проблему, фраза в команде будет обрабатываться как строка, а headers.get() - это переменная в Java. Использование concat не работает. –

ответ

0

Если answer является deftemplate с прорезями ident и text, следующий фрагмент выглядит как строительство факта:

(answer(ident headers.get(i)(text patientData.get(j).get(i)) 
  • Голый факт не представляет Jess, которая может быть выполнена через Rete.executeCommand.
  • Вы не должны использовать устаревший метод executeCommand; использование eval.
  • Ваши скобки не сбалансированы должным образом, 6 открывают круглые скобки против 4 закрывающих.
  • Предполагая, что заголовки являются List<String> в вашем приложении Java, вы не можете просто вызвать вызов метода Java в Jess, который вначале не понимает синтаксис Java и (предположительно) не знает о pojo header вообще ,
  • То же самое верно для pojo patientData.
  • Хотя вы можете передать объектам из вашей программы Java на двигатель Jess, это абсолютно невозможно для простых переменных, таких как i и j.

Учитывая все это (большинство из которых легко узнать из отличной Jess руководства), используя

r.eval("(assert (answer (ident \"" + 
     headers.get(i) + 
     "\")(text \"" + 
     patientData.get(j).get(i) + 
     "\")))"); 

может иметь шансы на успех и в самом деле вставить новый факт в рабочую память.

+0

Спасибо за ответ Laune, теперь я вставлял факты. Правила срабатывают в моем .clp-файле, но я не могу утверждать deftemplates в файле .clp. Есть ли что-нибудь, что мне нужно сделать для каждого правила и утверждать, что я хочу сделать? Большое спасибо Ali –

+0

Вызов функции assert as it встроенный в eval-вызов в моем ответе, также может использоваться в файле CLP: '(assert (answer (ident" 123 ") (текст« некоторые данные »))' должен дать вам факт. – laune

+0

Только одно правило в .clp будет запущен, даже если факты должны содержать больше правил. Я должен добавить что-нибудь, чтобы все правила стреляли? Спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^