[CLIPS][JAVA]Как получить строку из консоли и вставить входные данные

Я разрабатываю небольшую экспертную систему с Clips и Java, используя Clipsjni. У меня возникла проблема, и я не могу найти решение в Интернете, поэтому я обращаюсь к Вам. Я хочу поместить вывод функции clips.run() в JLable, потому что мне нужно использовать java Swing, и я хочу поместить ввод из TextBox, а не из консоли.

Вот пример программы, которая нормально работает с консолью:

import net.sf.clipsrules.jni.Environment;

public class Example {

    public static Environment clips = new Environment();
    public static void main (String[] args)
    {
        clips.load("hello.clp");
        clips.reset();
        clips.run();
    }
}

А это мой Hello.clp:

(defrule question
=>
(printout t "How old are you?" crlf)
(assert (age (read)))
)

это то, что я получаю из системной консоли:

Сколько тебе лет? 12

Итак, я хочу, чтобы "Сколько вам лет?" сохранялось в типе String и помещалось "12" из строки. Как я могу это решить? Надеюсь на вашу помощь!


person Pasq    schedule 13.09.2016    source источник


Ответы (2)


Вместо того, чтобы размещать строки, которые увидит пользователь, непосредственно в правилах, вместо этого используйте факты.

CLIPS> 
(deftemplate question
  (slot id)
  (slot text))
CLIPS>   
(deftemplate value
  (slot id)
  (slot value))
CLIPS>   
(defrule ask-question
  (question (id ?id)
            (text ?text))
  =>
  (printout t ?text " ")
  (assert (value (id ?id) (value (read)))))
CLIPS> (assert (question (id age) (text "How old are you?")))
<Fact-1>
CLIPS> (run)
How old are you? 44
CLIPS> (facts)
f-0     (initial-fact)
f-1     (question (id age) (text "How old are you?"))
f-2     (value (id age) (value 44))
For a total of 3 facts.
CLIPS> (reset)
CLIPS> (assert (question (id age) (text "Wie alt sind Sie?")))
<Fact-1>
CLIPS> (run)
Wie alt sind Sie? 44
CLIPS> (facts)
f-0     (initial-fact)
f-1     (question (id age) (text "Wie alt sind Sie?"))
f-2     (value (id age) (value 44))
For a total of 3 facts.
CLIPS> 

В CLIPSJNI вы можете использовать функцию assertString для утверждения фактов в CLIPS из вашего приложения Swing. Например, вот фрагмент из примера WineDemo, включенного в CLIPSJNI:

clips.assertString("(attribute (name sauce) (value unknown))");

Используйте функции запроса фактов для извлечения информации из фактов. Например, вот фрагмент из примера SudokoDemo, включенного в CLIPSJNI:

 String evalStr;
 String messageStr = "<html><p style=\"font-size:95%\">";

 evalStr = "(find-all-facts ((?f technique)) TRUE)";

 MultifieldValue mv = (MultifieldValue) clips.eval(evalStr);
 int tNum = mv.size();

 for (int i = 1; i <= tNum; i++)
   {
    evalStr = "(find-fact ((?f technique-employed)) " +
                   "(eq ?f:priority " + i + "))";

    mv = (MultifieldValue) clips.eval(evalStr);
    if (mv.size() == 0) continue;

    FactAddressValue fv = (FactAddressValue) mv.get(0);

    messageStr = messageStr + ((NumberValue) fv.getFactSlot("priority")).intValue() + ". " +
                              ((LexemeValue) fv.getFactSlot("reason")).lexemeValue() + "<br>";
   }
JOptionPane.showMessageDialog(jfrm,messageStr,sudokuResources.getString("SolutionTechniques"),JOptionPane.PLAIN_MESSAGE);

В основном вы используете функцию eval для выполнения запроса и возврата списка фактов в значении мультиполя CLIPS. Вы извлекаете факты из мультиполя, а затем используете функцию getFactSlot для получения определенных значений слота.

person Gary Riley    schedule 14.09.2016

person    schedule
comment
Добро пожаловать в переполнение стека! Вы ответили на старый вопрос, и ваш ответ совпадает с существующим ответом. Чтобы собрать больше голосов, вы должны четко указать, чем ваш ответ отличается от существующего ответа, и немного написать о том, как это работает. См. раздел написание хороших ответов. - person totokaka; 29.12.2018