4

SWI-Prologが提供するJPLを使用して Javaから Prolog を呼び出すアプリケーションを Java で作成しています。

IDEとしてEclipseを使用しています。オンラインで見つけたこの例を開始する方法がわかりません:

ここに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

問題はおそらく、例えばJava UIアプリケーションが通常そうであるように、Prologテキストが反転スタイルで書かれていないことです。

したがって、別のスレッドでPrologシステムを起動します。Prologテキストのすべてのread/1とwrite/1を大まかに次のように置き換えます。

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

my_write(Label、Value):-set_UI_result(Label、Value)。

また、2番目の別のスレッドで実行されているため、値を入力してボタンを押すと、UIアプリケーションはnotify(signal)する必要があります。

または、エキスパートシステムのロジックを書き直して、クエリまたは回答につながる推論を外部から段階的に呼び出すことができるようにします。ただし、推論に時間がかかる可能性があるため、スレッドを生成することもお勧めします。

よろしくお願いします

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 に答える