Как подключить мой пользовательский интерфейс Java к приложению JPL Prolog?
Я пишу приложение на Java, используя JPL, предоставленный SWI-Prolog для вызова Prolog из Java.
Я использую 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 для взаимодействия между пользователем и системой, но я не знаю, как взять код из Пролога в Java и поместить его в пользовательский интерфейс.
Например, как я могу получить входные данные из пользовательского интерфейса Java и передать их в код Пролога?
1 ответ
Возможно, проблема в том, что ваш текст на Прологе написан не в перевернутом стиле, как, например, приложения Java-интерфейса.
Итак, запустите вашу систему Prolog в отдельном потоке. Замените все read/1 и write/1 в вашем тексте Prolog примерно:
my_read (Prompt, Value): - set_UI_prompt (Prompt), wait (сигнал), get_UI_value (Value).
my_write (Метка, Значение):- set_UI_result(Метка, Значение).
Поскольку он также запускается во втором отдельном потоке, после ввода значения и нажатия какой-либо кнопки приложение пользовательского интерфейса должно уведомить (подать сигнал).
Или переписать логику экспертной системы, чтобы выводы, приводящие к запросу или ответу, могли вызываться извне пошаговым способом. Но также рекомендуется порождение потока, поскольку вывод может занять время.
С уважением
PS: Если ваше приложение было инвертировано, вы могли бы легко сделать его несколькими различными пользовательскими интерфейсами: http://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_pro08/13_press/02_deploy/package.html