4

我正在使用SWI-Prolog提供的JPL在 Java 中编写一个应用程序,以从 Java 调用 Prolog。

我使用 Eclipse 作为 IDE。我不知道如何开始我在网上找到的这个例子:

这里的java代码:

package prolog;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import jpl.Atom;
import jpl.Compound;
import jpl.Variable;
import jpl.Term;
import jpl.Query;
import jpl.JPL;


@SuppressWarnings({ "unchecked", "deprecation", "serial" })
public class JavaProlog extends JFrame {

 JButton  startButton = new JButton("Start");
 JTextArea  textArea = new JTextArea("A Diagnostic Expert System \n" +
           "for respiratory diseases and lung.");

 /**
  */
 JavaProlog(){
  Container cp=getContentPane();
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  setLocation (200,200);
  setSize  (300,200);
  setLayout (new FlowLayout());


  startButton.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
    startDiagnose();
   }
  });

  cp.add(textArea);
  cp.add(startButton);

  setVisible(true); 
 }

 private void startDiagnose(){
  Term consult_arg[] = { 
          new Atom( "C://Users//i_vista//workspace//mdc.pl" ) 
      };
      Query consult_query = 
          new Query( 
              "consult", 
              consult_arg );

      boolean consulted = consult_query.query();

      if ( !consulted ){
          System.err.println( "Consult failed" );
          System.exit( 1 );
      }
 }

 public static void main( String argv[] ){
  JPL.init();
  JavaProlog jpTest = new JavaProlog();

}

如果我直接从 Prolog 运行 Prolog 程序,它可以正常工作,并且当我从 Java 应用程序调用它时也一样。

我还可以在 Eclipse 控制台中看到输出,并且可以回答问题。

但是我想为用户和系统之间的交互构建一个Java UI,但是我不知道如何从Java中的Prolog中获取代码并将其放入UI中。

例如,如何从 Java UI 捕获输入并将其传递给 Prolog 代码?

4

1 回答 1

1

问题可能是您的 Prolog 文本不是以反转样式编写的,例如 Java UI 应用程序通常是这样。

所以在一个单独的线程中启动你的 Prolog 系统。将 Prolog 文本中的所有 read/1 和 write/1 大致替换为:

my_read(Prompt,Value) :- set_UI_prompt(Prompt)、wait(signal)、get_UI_value(Value)。

my_write(标签,值):- set_UI_result(标签,值)。

由于也在第二个单独的线程中运行,因此在输入一个值并点击某个按钮时,UI 应用程序应该通知(信号)。

或者重写专家系统的逻辑,以便可以从外部以逐步方式调用导致查询或答案的推理。但也建议生成一个线程,因为推理可能需要时间。

此致

PS:如果您的应用程序是倒置的,您可以轻松地将其设置为几个不同的 UI: http: //www.jekejeke.ch/idatab/doclet/prod/en/docs/10_pro08/13_press/02_deploy/package.html

于 2011-04-13T09:59:04.577 回答