2010-01-20 141 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

相關問題