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