Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Introducing InterProlog • Architecture • Functionality and examples – – – – From Prolog side From Java side A Java-Prolog-Java event roundtrip Term displayers etc. • Under the hood 1 1st InterProlog architecture - sockets Terms Objects A Java application A Prolog application InterProlog classes InterProlog predicates Java VM Prolog executable sockets, console redirection 2 InterProlog architecture (cont.) • Java/Prolog connection – Sockets (SubprocessEngine) • Java program linked to Prolog through I/O and object sockets, launches “PrologEngines” – currently XSB, SWI, YAP – JNI (NativeEngine) • native methods and built-in predicate for callbacks were added to XSB Prolog 2.5 and later • Dynamic Prolog->Java calls using Reflection • Serialized objects are parsed/generated by a Definite Clause Grammar :-) 3 Yet another use for DCGs :-) Object network in memory JAVA Serialization API Prolog Term Stream bytes InterProlog Object Grammar object(class(...),...data) 4 Programming on the Prolog side • I think I’m under a console process – The listener window and the first “Hello, World” ?- writeln('Hello, world!'). • javaMessage(Target,Message(Args)) javaMessage( ‘java.lang.System’-out, println(string(‘hello, world’)) ) – – – – Cynical’s perspective: yet another RPC Wide open API, as far as Java security allows Variations handle exceptions, return value, cf. docs Full version: javaMessage( Target, Result, Exception, MessageName, ArgList, NewArgList ) • Needed: a generic approach to specifying objects and basic type values, stay tuned… 5 Object specifications in Prolog • string(Atom) and 'null' • ipObjectSpec('InvisibleObject',X,[ID],_) – Object X should be the object already existing and registered as (int) ID on the Java side • ipObjectSpec('IPClassObject',X,[C],_) – X is the class object for class with name C • ipObjectSpec('IPClassVariable',X,[C,V],_) – X is the class variable V of class C • ipObjectSpec(boolean,X,[B],_) – X is a boolean basic type for B (which should be 1 or 0); similar ipObjectSpec facts are available for the remaining basic types: byte, small, int, long, float, double, char • ipObjectSpec(C,X,Variables,_) – (Generic case) New object X of class C; C must be the fully qualified class name – How to add mine? to be seen in Sudoku example 6 Hello world, in a window javaMessage('javax.swing.JFrame',W,'JFrame'(string(myTitle))), javaMessage(W,C,getContentPane), javaMessage('javax.swing.JLabel',L, 'JLabel'(string('Hello Prolog, greetings from Swing:-)')) ), javaMessage(C,add(string('Center'),L)), javaMessage(W,pack), javaMessage(W,show). Note concerning previous slide: • javaMessage/3 calls ipObjectSpecification/4 before calling javaMessage/6. A first look at interprolog.P 7 Programming on the Java side basics • 1 PrologEngine <-> 1 XSB (or SWI or YAP) engine – Implementation restrictions • Object[] deterministicGoal( String G, String Ovars, Object[] objectsP, String RVars ) – object specification subgoals must be included in G to accept objectsP (in Ovars list) and to generate the result (in RVars list) – Simpler variantes are available, e.g. not requiring input objects or not returning bindings, cf. Javadoc • int registerJavaObject(Object x) – Allow Prolog to refer x by an integer key reference • interrupt(), shutdown() 8 Programming on the Java side PrologEngine engine = new SWISubprocessEngine(); engine.consultFromJar("test.pl"); /* or consultRelative (to the class location), or consultAbsolute(File),…*/ Object[] bindings = engine.deterministicGoal( "descendent_of(X,someAncestor)", "[string(X)]" ); if(bindings!=null){// succeeded String X = (String)bindings[0]; System.out.println( "X = " + X); } 9 Programming on the Java side Object[] bindings = engine.deterministicGoal( “X=string(helloWorld), ipObjectSpec(‘java.lang.Integer’,Y,[value=13]”, ”[X,Y]” ); String hw = (String)bindings[0]; Integer lucky = (Integer)bindings[1]; • The deterministicGoal variants • More examples – see packages com.declarativa.interprolog.gui, com.declarativa.interprolog.examples, PrologEngineTest class 10 “Hello World”, with a roundtrip CREATING WINDOW FROM PROLOG: ipPrologEngine(Engine), javaMessage( 'com.declarativa.interprolog.examples.Hel loWindow', 'HelloWindow'(Engine)) 11 Control flow in “Hello World” a JButton a JTe xtFiel d actio nPerfo rmed() a Prol ogEventBroke r se tText("Hel lo World!") de termi nisticGoa l("gree tat(BUTTONID)") a Prolog Engin e a Ca llba ckHa ndle r gre etat(T) :j avaMessa ge(T,strin g('Hel lo World!')) 12 Prolog Term displayers • browseList([one(X),two(Y),1+1+1,X/Y]). • browseLiteralInstances(foo('First','Last'), [foo('Miguel','Calejo'),foo('Terry','Swift'),foo('David','Warren'),foo('Robert','Pokorn y')]). • browseTreeTerm(t(root,[t(child1,[]),t(child2,[]),t(child3,[t(granchild31,[t(grandgr andchild311,[])])])])). 13 More Prolog support stuff • The TermModel class – A convenient way to have Prolog term copies on the Java side • Building a Java representation of an arbitrary Prolog term… – buildTermModel(Term,TermModel) • …and vice-versa – recoverTermModel(TermModel,Term) • How to write a visual term browser – Hint: TermModel implements TreeModel 14 Playing with several Prologs callAnotherProlog(Engine,G) :- buildTermModel(G,GM), javaMessage(Engine,SM,deterministicGoal(GM)), recoverTermModel(SM,G). ?- javaMessage( 'com.declarativa.interprolog.SWISubprocessEngine', SWI,'SWISubprocessEngine'), callAnotherProlog(SWI, findall(op(P,T,Name), current_op(P,T,Name), SWIops)), findall(op(XSBP,XSBT,XSBO), ( current_op(XSBP,XSBT,XSBO), not(member(op(XSBP,XSBT,XSBO),SWIops) ), XSBonly). 15 A larger example: Sudoku puzzle editor and solver • Java side – A Sudoku board in a window (to start, call its constructor) – SudokuWindow class with inner classes • • • • SudokuBoard extends JTable SudokuModel implements TableModel A few others Menus call Prolog goals • Prolog side – Known numbers Ni in predicate facts n(X,Y,Ni) – resolve(PlacedNumbers1,PlacedNumbersN) – Front-end "action" predicates act on current puzzle • newPuzzle, openPuzzle(File,Array), savePuzzle(File) • How is data passed between Java and Prolog? 16 Getting object specification predicates from object examples • Sudoku example uses two object types for communication: – int[][] matrix for "bulk assigment" of the whole board model in one step – CellValue[] objects, representing a few cells, for "sparse" (a few at a time) assigment • Teaching InterProlog about my classes – teachMoreObjects(ObjectExamplePair[]) 17 “Under the hood”: Java package/file structure • com.declarativa.interprolog – – – – com.declarativa.interprolog.gui com.declarativa.interprolog.examples com.declarativa.interprolog.util xsb,swi,yap,gnu subdirectories with specific Prolog file • com.xsb.interprolog – NativeEngine and two related classes 18 “Under the hood” • The serialization grammar • About javaMessage – javaMessage/2, javaMessage/3, javaMessage/6 – Returning objects rather than references: getRealJavaObject • A special Java object – ipPrologEngine(E) • The deterministicGoal/javaMessage tandem • Prolog peer classes – Supporting multiple Prolog systems – Walkthrough of ipPrologEngine(E), javaMessage(E,R,getPrologVersion) 19 Installation • Make sure Java and the Prolog systems work • Download and expand interprolog.zip • Edit windowsVariables – There are other ways to let InterProlog find the Prolog executables • Running – Use script to launch listener window – JUnit test – Use script to launch your app using the interprolog.jar 20