2010-01-20 144 views
5

我正在写使用SWI-Prolog提供JPL从Java调用Prolog的在Java的应用程序。如何将我的Java用户界面连接到JPL 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代码?

回答

1

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

所以在一个单独的线程中启动你的Prolog系统。在您的Prolog文本中大致替换所有读取/ 1和写入/ 1 大致为:

my_read(提示,值): - set_UI_prompt(提示),wait(信号),get_UI_value(值)。

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

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

或者重写专家系统的逻辑,以便导致查询或答案的推论 可以以明智的方式从外部调用。但随后也产生线程建议,因为 推断可能需要一段时间。

问候

P.S:如果您选择的应用程序倒置,你可以很容易地使 这几个不同的UI: http://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_pro08/13_press/02_deploy/package.html

相关问题