[CLIPS][JAVA]如何从控制台获取字符串并插入输入

[CLIPS][JAVA]How to acquire string from console and insert inputs

我正在使用 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)))
)

这是我从系统控制台得到的:

How old are you? 12

所以我想将“你多大了?”保存为字符串类型,并从字符串中输入“12”。我该如何解决这个问题? 希望得到您的帮助!

与其将用户直接看到的字符串放在规则中,不如使用事实。

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 函数将事实从您的 Swing 应用程序断言到 CLIPS 中。例如,这是 CLIPSJNI 中包含的 WineDemo 示例的片段:

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

使用事实查询功能从事实中提取信息。例如,这是 CLIPSJNI 中包含的 SudokoDemo 示例的片段:

 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 函数来执行查询和 return CLIPS 多字段值中的事实列表。您从多字段中检索事实,然后使用 getFactSlot 函数检索特定槽值。

   FactAddressValue fv = (FactAddressValue) ((MultifieldValue) clips.eval("(find-fact ((?f flower_name)) TRUE)")).get(0); // "flower_name"  is deftemplate name 

   String ou = fv.getFactSlot("name").toString() ; // "name" is the slot name 
    //String ou = value.toString() ; 
    System.out.println(ou) ;