Upload
sergio-castro
View
103
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Logic languages are well suited for declaratively solving computational problems that require knowledge representation and reasoning. Object-oriented programming languages benefit from mature software ecosystems featuring rich libraries and developer tools. Several integration solutions exist that allow a software system to be decomposed into a combination of modules implemented in both a logic and an object-oriented language. Unfortunately, significative amounts of boilerplate code must still be written to accomplish the required interoperability. In addition, such approaches often are not amenable to custom context-dependent reification of objects in the logic world and custom mappings of arbitrary logic terms to objects in the object-oriented world. Furthermore, in the specific case of Prolog-Java integration, existing solutions are often compatible with only a single or a restricted set of Prolog engines and thus suffer from portability issues. To address these problems, we introduce a portable framework, relying on linguistic integration, for transparently and (semi-)automatically enabling communication between routines in these two worlds, as well as a simple mechanism for customising how native artefacts in one language should be reified in the other language. We validate our approach with case studies requiring a seamless integration of declarative programs in Prolog with libraries belonging to the Java ecosystem.
Citation preview
A Portable and Extensible Approach for Linguistic Symbiosis between an Object-Oriented and a Logic
Programming Language
Sergio Castro [email protected]
RELEASeD LABUniversité catholique de Louvain
Belgium
1
LogicObjects
Monday 26 August 13
2
OOprogramming
Logicprogramming
Useful for modellingnon-declarative concepts
Often enjoy rich softwareecosystems
Declarative reasoning &Knowledge representation
Monday 26 August 13
2
OOprogramming
Logicprogramming
Useful for modellingnon-declarative concepts
Often enjoy rich softwareecosystems
Declarative reasoning &Knowledge representation
Monday 26 August 13
2
OOprogramming
Logicprogramming
Useful for modellingnon-declarative concepts
Often enjoy rich softwareecosystems
Declarative reasoning &Knowledge representation
Monday 26 August 13
2
OOprogramming
Logicprogramming
Useful for modellingnon-declarative concepts
Often enjoy rich softwareecosystems
Declarative reasoning &Knowledge representation
Monday 26 August 13
3
Monday 26 August 13
Considerable amount of integration tools and techniques
4
Monday 26 August 13
Considerable amount of integration tools and techniques
4
SOUL
TyRuBaJPL
InterProlog
PDT Connector
TuPrologLogicJava Jiprolog
Kernel-Prolog CIAO Prolog
Jasper
Jekejeke PrologKiev
PrologBeans
PrologCafeJavaLogMINERVA
jProlog
ProvaK-PrologCommonRules Styla
Jinni Prolog
Yajxb
Monday 26 August 13
Research scope
5
“Bidirectional linguistic integration between Prolog and a statically typed, class based OO language (Java)”
Monday 26 August 13
But... why Java ?
• A huge Java ecosystem.
• Emerging languages running on the JVM (e.g. Scala, Clojure, etc.).
• A large user base.6
We recognize the advantages of:
Monday 26 August 13
Outline
• JPC: a portable Java-Prolog interoperability layer.
• LogicObjects: a linguistic integration framework.
• Research status.
• Future work.
• Conclusions.
7
Monday 26 August 13
8
Prolog engines
Bridge libraries
JPC drivers
JPC library
Java-Prolog applications
Java-Prolog frameworks
(layer coupling denoted by the direction of the arrows)
High level architectural overview
Monday 26 August 13
• Attempts to facilitate the creation of hybrid Java-Prolog applications and frameworks.
• Inspired by JPL, InterProlog and Google’s Gson libraries.
• Compatible with some popular open source Prolog engines (XSB,YAP, SWI) and more coming soon.
• Available at the Maven central snapshot repository and GitHub1 (currently) under the LGPL license.
9
1https://github.com/sergio-castro/
JPC: Java-Prolog connectivity
Monday 26 August 13
JPC features
• A portable abstraction of a Prolog virtual machine.
• A set of utilities for dealing with common Java-Prolog interoperability problems.
• High level support for :
•Mapping between Java objects and Prolog terms.
•Dealing with object references and object serialization in Prolog.
10
Monday 26 August 13
11
Converter manager
Instantiation managerType solver
JPC Context
A conversion context as a first order entity
Monday 26 August 13
12
Converter1 Converter2 Converter3
Dispatcher
Converter manager
The converter manager
Monday 26 August 13
12
Converter1 Converter2 Converter3
Dispatcher
(chain of responsibility pattern)
Converter manager
The converter manager
Monday 26 August 13
12
Converter1 Converter2 Converter3
Dispatcher
(chain of responsibility pattern)
Converter manager
The converter manager
primitive types converters,exception converters, multi-valued converters, etc.
Monday 26 August 13
Modularising mappings between Java objects and Prolog terms
public class StationConverter extends JpcConverter<Station, Compound> { public static final String STATION_FUNCTOR = "station"; @Override public Compound toTerm(Station station, Jpc context) { return new Compound(STATION_FUNCTOR, asList(new Atom(station.getName()))); } @Override public Station fromTerm(Compound term, Jpc context) { String stationName = ((Atom)term.arg(1)).getName(); return new StationJpc(stationName); }}
13
Monday 26 August 13
Modularising mappings between Java objects and Prolog terms
public class StationConverter extends JpcConverter<Station, Compound> { public static final String STATION_FUNCTOR = "station"; @Override public Compound toTerm(Station station, Jpc context) { return new Compound(STATION_FUNCTOR, asList(new Atom(station.getName()))); } @Override public Station fromTerm(Compound term, Jpc context) { String stationName = ((Atom)term.arg(1)).getName(); return new StationJpc(stationName); }}
13
Java type
Monday 26 August 13
Modularising mappings between Java objects and Prolog terms
public class StationConverter extends JpcConverter<Station, Compound> { public static final String STATION_FUNCTOR = "station"; @Override public Compound toTerm(Station station, Jpc context) { return new Compound(STATION_FUNCTOR, asList(new Atom(station.getName()))); } @Override public Station fromTerm(Compound term, Jpc context) { String stationName = ((Atom)term.arg(1)).getName(); return new StationJpc(stationName); }}
13
Prolog type
Monday 26 August 13
Modularising mappings between Java objects and Prolog terms
public class StationConverter extends JpcConverter<Station, Compound> { public static final String STATION_FUNCTOR = "station"; @Override public Compound toTerm(Station station, Jpc context) { return new Compound(STATION_FUNCTOR, asList(new Atom(station.getName()))); } @Override public Station fromTerm(Compound term, Jpc context) { String stationName = ((Atom)term.arg(1)).getName(); return new StationJpc(stationName); }}
13
Monday 26 August 13
Modularising mappings between Java objects and Prolog terms
public class StationConverter extends JpcConverter<Station, Compound> { public static final String STATION_FUNCTOR = "station"; @Override public Compound toTerm(Station station, Jpc context) { return new Compound(STATION_FUNCTOR, asList(new Atom(station.getName()))); } @Override public Station fromTerm(Compound term, Jpc context) { String stationName = ((Atom)term.arg(1)).getName(); return new StationJpc(stationName); }}
13
Monday 26 August 13
Configuring a JPC context with a custom converter
Jpc jpcContext = JpcBuilder.create().registerConverter(new StationConverter()).build();
14
Monday 26 August 13
Configuring a JPC context with a custom converter
Jpc jpcContext = JpcBuilder.create().registerConverter(new StationConverter()).build();
14
Default builder (includes pre-defined converters)
Monday 26 August 13
Configuring a JPC context with a custom converter
Jpc jpcContext = JpcBuilder.create().registerConverter(new StationConverter()).build();
14
Default builder (includes pre-defined converters)
Extending JPC with new conversions
Monday 26 August 13
Querying Prolog with JPC
15
public class StationManager {public static final Jpc jpcContext = ... //context includes StationConverter...public Station mainStation() { String stationVarName = "Station"; Term goal = new Compound("main_station", asList(new Variable(stationVarName))); Query query = getPrologEngine().query(goal, jpcContext); return query.<Station>selectObject(stationVarName).oneSolutionOrThrow();}
}
Monday 26 August 13
Querying Prolog with JPC
15
public class StationManager {public static final Jpc jpcContext = ... //context includes StationConverter...public Station mainStation() { String stationVarName = "Station"; Term goal = new Compound("main_station", asList(new Variable(stationVarName))); Query query = getPrologEngine().query(goal, jpcContext); return query.<Station>selectObject(stationVarName).oneSolutionOrThrow();}
}
main_station(Station)
Monday 26 August 13
Querying Prolog with JPC
15
public class StationManager {public static final Jpc jpcContext = ... //context includes StationConverter...public Station mainStation() { String stationVarName = "Station"; Term goal = new Compound("main_station", asList(new Variable(stationVarName))); Query query = getPrologEngine().query(goal, jpcContext); return query.<Station>selectObject(stationVarName).oneSolutionOrThrow();}
}
Monday 26 August 13
Querying Prolog with JPC
15
public class StationManager {public static final Jpc jpcContext = ... //context includes StationConverter...public Station mainStation() { String stationVarName = "Station"; Term goal = new Compound("main_station", asList(new Variable(stationVarName))); Query query = getPrologEngine().query(goal, jpcContext); return query.<Station>selectObject(stationVarName).oneSolutionOrThrow();}
}binding of Station as a Java object
Monday 26 August 13
Dealing with object references@Testpublic void testJRef() {
Object o = new Object();Term jRef = RefManager.jRefTerm(o);assertTrue(o == jpc.fromTerm(jRef));o = null;System.gc();try {
jpc.fromTerm(jRef); fail();
} catch(RuntimeException e) {}}
16
Monday 26 August 13
Dealing with serialized objects
@Testpublic void testSerializedTerm() { String s = "hello"; Term term = SerializedObject.serializedObjectTerm(s); String s2 = jpc.fromTerm(term); assertFalse(s == s2); assertEquals(s, s2);}
17
Monday 26 August 13
18
A Prolog query browser based on
JPC
Monday 26 August 13
19
Monday 26 August 13
JPC as a library for implementing Java-Prolog frameworks
20
Prolog engines
Bridge libraries
JPC drivers
JPC library
Java-Prolog applications
Java-Prolog frameworks
(layer coupling denoted by the direction of the arrows)
Monday 26 August 13
JPC as a library for implementing Java-Prolog frameworks
20
Prolog engines
Bridge libraries
JPC drivers
JPC library
Java-Prolog applications
Java-Prolog frameworks
(layer coupling denoted by the direction of the arrows)
e.g. LogicObjects
Monday 26 August 13
LogicObjects
• A portable Java-Prolog linguistic symbiosis framework.
• Implemented on top of the JPC library.
• Provides obliviousness concerning integration (in common scenarios).
• Based on annotations for customising the integration and minimising programming effort.
21
Monday 26 August 13
Symbiosis
22
“The intimate living together of two dissimilar organisms in a mutually beneficial relationship.” (Merriam-Webster dictionary)
Monday 26 August 13
Linguistic symbiosis
• Objects from different worlds must understand each other.
• Invoking routines from another language as if they were defined in their own language.
23
• Easier to achieve if the languages belong to the same paradigm.
Monday 26 August 13
A paradigm leak
“The event of concepts leaking from one programming paradigm to another”
24
* Brichau, J. et al.Towards linguistic symbiosis of an object-oriented and a logic programming language.
In Proceedings of the Workshop on Multiparadigm Programming with Object-Oriented Languages. (2002)
*
Monday 26 August 13
The inhabitants of our two worlds
25
The OOworld
The logicworld
Monday 26 August 13
The inhabitants of our two worlds
25
ClassesObjects
MessagesMethods
Return valuesPackages The OO
worldThe logic
world
FactsRulesTerms
QueriesQuery solutions
Modules
Monday 26 August 13
Reducing the gap with Logtalk
26
The OOworld
The logicworld
Monday 26 August 13
Reducing the gap with Logtalk
26
The OOworld
The logicworld
LogtalkAn object-oriented layer
Monday 26 August 13
Case study
27
The London underground
from:
Monday 26 August 13
Relevant concepts
28
The London underground
Monday 26 August 13
Relevant concepts
28
The London underground
stations
linesmetro
Monday 26 August 13
A rule based system using Prolog
connected(station(bond_street), station(oxford_circus), line(central)). connected(station(oxford_circus), station(tottenham_court_road), line(central)). ...
nearby(S1,S2) :- connected(S1,S2,_). nearby(S1,S2) :- connected(S1,S3,L), connected(S3,S2,L).
reachable(S1,S2,[]) :- connected(S1,S2,_). reachable(S1,S2,[S3|Ss]) :- connected(S1,S3,_), reachable(S3,S2,Ss).
line(Name) :- setof(L, S1^S2^connected(S1,S2,L), Ls), list::member(line(Name), Ls).
29
Monday 26 August 13
A rule based system using Prolog
connected(station(bond_street), station(oxford_circus), line(central)). connected(station(oxford_circus), station(tottenham_court_road), line(central)). ...
nearby(S1,S2) :- connected(S1,S2,_). nearby(S1,S2) :- connected(S1,S3,L), connected(S3,S2,L).
reachable(S1,S2,[]) :- connected(S1,S2,_). reachable(S1,S2,[S3|Ss]) :- connected(S1,S3,_), reachable(S3,S2,Ss).
line(Name) :- setof(L, S1^S2^connected(S1,S2,L), Ls), list::member(line(Name), Ls).
29
FACTS
Monday 26 August 13
A rule based system using Prolog
connected(station(bond_street), station(oxford_circus), line(central)). connected(station(oxford_circus), station(tottenham_court_road), line(central)). ...
nearby(S1,S2) :- connected(S1,S2,_). nearby(S1,S2) :- connected(S1,S3,L), connected(S3,S2,L).
reachable(S1,S2,[]) :- connected(S1,S2,_). reachable(S1,S2,[S3|Ss]) :- connected(S1,S3,_), reachable(S3,S2,Ss).
line(Name) :- setof(L, S1^S2^connected(S1,S2,L), Ls), list::member(line(Name), Ls).
29
RULES
Monday 26 August 13
Adding an object-oriented layer with Logtalk
connected(station(bond_street), station(oxford_circus), line(central)). connected(station(oxford_circus), station(tottenham_court_road), line(central)). ...
nearby(S1,S2) :- connected(S1,S2,_). nearby(S1,S2) :- connected(S1,S3,L), connected(S3,S2,L).
reachable(S1,S2,[]) :- connected(S1,S2,_). reachable(S1,S2,[S3|Ss]) :- connected(S1,S3,_), reachable(S3,S2,Ss).
line(Name) :- setof(L, S1^S2^connected(S1,S2,L), Ls), list::member(line(Name), Ls).
30
:- object(metro).
:- end_object.
Monday 26 August 13
Adding an object-oriented layer with Logtalk
connected(station(bond_street), station(oxford_circus), line(central)). connected(station(oxford_circus), station(tottenham_court_road), line(central)). ...
nearby(S1,S2) :- connected(S1,S2,_). nearby(S1,S2) :- connected(S1,S3,L), connected(S3,S2,L).
reachable(S1,S2,[]) :- connected(S1,S2,_). reachable(S1,S2,[S3|Ss]) :- connected(S1,S3,_), reachable(S3,S2,Ss).
line(Name) :- setof(L, S1^S2^connected(S1,S2,L), Ls), list::member(line(Name), Ls).
30
:- object(metro).
:- end_object.
Monday 26 August 13
Adding an object-oriented layer with Logtalk
connected(station(bond_street), station(oxford_circus), line(central)). connected(station(oxford_circus), station(tottenham_court_road), line(central)). ...
nearby(S1,S2) :- connected(S1,S2,_). nearby(S1,S2) :- connected(S1,S3,L), connected(S3,S2,L).
reachable(S1,S2,[]) :- connected(S1,S2,_). reachable(S1,S2,[S3|Ss]) :- connected(S1,S3,_), reachable(S3,S2,Ss).
line(Name) :- setof(L, S1^S2^connected(S1,S2,L), Ls), list::member(line(Name), Ls).
30
:- object(metro).
:- end_object.
:- public([connected/3, nearby/2, reachable/3, line/1]). ACCESS MODIFIERS
Monday 26 August 13
Logtalk parametric objects
31
:- object(line(_Name)).
:- public([name/1, connects/2]). name(Name) :- parameter(1, Name). ...
:- end_object.
:- object(station(_Name)).
:- public([name/1, connected/2, nearby/1, reachable/2]). name(Name) :- parameter(1, Name). ...
:- end_object.
Monday 26 August 13
PARAMETRIC OBJECT
Logtalk parametric objects
31
:- object(line(_Name)).
:- public([name/1, connects/2]). name(Name) :- parameter(1, Name). ...
:- end_object.
:- object(station(_Name)).
:- public([name/1, connected/2, nearby/1, reachable/2]). name(Name) :- parameter(1, Name). ...
:- end_object.
Monday 26 August 13
PARAMETRIC OBJECT
PARAMETRIC OBJECT
Logtalk parametric objects
31
:- object(line(_Name)).
:- public([name/1, connects/2]). name(Name) :- parameter(1, Name). ...
:- end_object.
:- object(station(_Name)).
:- public([name/1, connected/2, nearby/1, reachable/2]). name(Name) :- parameter(1, Name). ...
:- end_object.
Monday 26 August 13
Invoking a Logtak method
Messages in Logtalk are expressed with the :: operator.
For example:
line(central)::connects(Station1, Station2)
Answers all the stations connected by the line ‘central’
32
Monday 26 August 13
Invoking a Logtak method
Messages in Logtalk are expressed with the :: operator.
For example:
line(central)::connects(Station1, Station2)
Answers all the stations connected by the line ‘central’
32
Monday 26 August 13
Meta-level artefacts from the two worlds
33
Monday 26 August 13
The Java world
34
public abstract class Line { String name; public Line(String name) {this.name = name;} public abstract boolean connects(Station s1, Station s2); public abstract int segments();}
public abstract class Station { ...}
public abstract class Metro { ...}
Monday 26 August 13
The Java world
34
public abstract class Line { String name; public Line(String name) {this.name = name;} public abstract boolean connects(Station s1, Station s2); public abstract int segments();}
public abstract class Station { ...}
public abstract class Metro { ...}
@LObject(args={“name”})
@LMethod(name={“connects”}, args={“_”, “_”})
@LObject(args={“name”})
Monday 26 August 13
Linguistic symbiosis challenges
• Translating objects to logic terms (and back).
•Mapping OO methods to logic queries.
•Dealing with unbound variables.
• Returning values from queries.
•Managing multiplicity.
35
* Some of them presented a bit differently in:D'Hondt, M. et al.Seamless integration of rule-based knowledge and object-oriented functionality with linguistic symbiosis. In Proceedings of the 2004 ACM symposium on Applied computing.(2004)
*
Monday 26 August 13
public abstract class Metro {...}
@LObject(name = "my_metro")public abstract class Metro {...}
@LObject(args = {"name"})public abstract class Line { private String name; ...}
metro
my_metro
line(lineName)
Translating objects to logic terms
36
Java Prolog
Monday 26 August 13
public abstract class Metro {...}
@LObject(name = "my_metro")public abstract class Metro {...}
@LObject(args = {"name"})public abstract class Line { private String name; ...}
metro
my_metro
line(lineName)
Translating objects to logic terms
36
Java Prolog
Monday 26 August 13
public abstract class Metro {...}
@LObject(name = "my_metro")public abstract class Metro {...}
@LObject(args = {"name"})public abstract class Line { private String name; ...}
metro
my_metro
line(lineName)
Translating objects to logic terms
36
Java Prolog
Monday 26 August 13
public abstract class Metro {...}
@LObject(name = "my_metro")public abstract class Metro {...}
@LObject(args = {"name"})public abstract class Line { private String name; ...}
metro
my_metro
line(lineName)
Translating objects to logic terms
36
Java Prolog
Monday 26 August 13
line(lName)::connects( station(s1Name), station(s2Name)).
line(lName)::connects(_, _).
Mapping Java methods to Logtalk methods
37
@LObject(args = {"name"})public abstract class Line { private String name;
public abstract boolean connects(Station s1, Station s2); @LMethod(name = "connects", args = {"_", "_"}) public abstract int segments();}
Java Prolog
Monday 26 August 13
line(lName)::connects( station(s1Name), station(s2Name)).
line(lName)::connects(_, _).
Mapping Java methods to Logtalk methods
37
@LObject(args = {"name"})public abstract class Line { private String name;
public abstract boolean connects(Station s1, Station s2); @LMethod(name = "connects", args = {"_", "_"}) public abstract int segments();}
Java Prolog
Monday 26 August 13
line(lName)::connects( station(s1Name), station(s2Name)).
line(lName)::connects(_, _).
Mapping Java methods to Logtalk methods
37
@LObject(args = {"name"})public abstract class Line { private String name;
public abstract boolean connects(Station s1, Station s2); @LMethod(name = "connects", args = {"_", "_"}) public abstract int segments();}
Java Prolog
Monday 26 August 13
line(lName)::connects( station(s1Name), station(s2Name)).
line(lName)::connects(_, _).
Mapping Java methods to Logtalk methods
37
@LObject(args = {"name"})public abstract class Line { private String name;
public abstract boolean connects(Station s1, Station s2); @LMethod(name = "connects", args = {"_", "_"}) public abstract int segments();}
Java Prolog
anonymous variables
Monday 26 August 13
38
Interpreting a query result as a Java object
The logic solutions
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
Varxn xn, Varyn yn
Monday 26 August 13
38
Interpreting a query result as a Java object
The logic solutions
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
Varxn xn, Varyn yn(set of frames binding logic
variables to terms)
frame 1frame 2
frame n
Monday 26 August 13
39
Interpreting a query result as a Java object
The logic solutions
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
Varxn xn, Varyn yn(set of frames binding logic
variables to terms)
Monday 26 August 13
39
Interpreting a query result as a Java object
The logic solutions The method return value
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
aJavaObject
Varxn xn, Varyn yn(set of frames binding logic
variables to terms)
Monday 26 August 13
40
The logic solutions
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
Varxn xn, Varyn yn(set of frames binding logic
variables to terms)
Returning values from one solution
Monday 26 August 13
40
The logic solutions The method return value
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
aJavaObject
Varxn xn, Varyn yn(set of frames binding logic
variables to terms)
Returning values from one solution
Monday 26 August 13
41
Returning values from one solution
The logic solutions The method return valueterm(Varx1, Vary1)
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
Varxn xn, Varyn yn(set of frames binding logic
variables to terms)
Monday 26 August 13
41
Returning values from one solution
The logic solutions The method return valueterm(Varx1, Vary1)
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
Varxn xn, Varyn yn(set of frames binding logic
variables to terms)
(specified in a methodwith @LSolution)
Monday 26 August 13
41
Returning values from one solution
The logic solutions The method return valueterm(Varx1, Vary1)
Varx1 x1, Vary1 y1 term(x1, y1)Varx2 x2, Vary2 y2 term(x2, y2)
Varxn xn, Varyn yn term(xn, yn)(set of frames binding logic
variables to terms)
(specified in a methodwith @LSolution)
(default solution)
Monday 26 August 13
42
Explicit specification of return values
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...
Monday 26 August 13
42
Explicit specification of return values
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...
Monday 26 August 13
• Preprocessing macros and Java exp.
• Convert arguments to terms.
• Convert method to a predicate.
• Convert receiver object to a term.
• Build a query.
• Determine solution heuristic.
• Convert solution terms back to objects.
43
• $1 => station (method parameter).
• (station(a), IStations)
• intermediateStations => reachable/2.
• station(b)
• station(b)::reachable(station(a), IStations)
• Binding of IStations (first solution).
• [station(x), station(y)] => List<Station>
Processing Steps Outcome
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...}
Monday 26 August 13
first Java method parameter
• Preprocessing macros and Java exp.
• Convert arguments to terms.
• Convert method to a predicate.
• Convert receiver object to a term.
• Build a query.
• Determine solution heuristic.
• Convert solution terms back to objects.
43
• $1 => station (method parameter).
• (station(a), IStations)
• intermediateStations => reachable/2.
• station(b)
• station(b)::reachable(station(a), IStations)
• Binding of IStations (first solution).
• [station(x), station(y)] => List<Station>
Processing Steps Outcome
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...}
Monday 26 August 13
first Java method parameter
• Preprocessing macros and Java exp.
• Convert arguments to terms.
• Convert method to a predicate.
• Convert receiver object to a term.
• Build a query.
• Determine solution heuristic.
• Convert solution terms back to objects.
43
• $1 => station (method parameter).
• (station(a), IStations)
• intermediateStations => reachable/2.
• station(b)
• station(b)::reachable(station(a), IStations)
• Binding of IStations (first solution).
• [station(x), station(y)] => List<Station>
Processing Steps Outcome
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...}
unbound Prolog variable
(as term)
Monday 26 August 13
• Preprocessing macros and Java exp.
• Convert arguments to terms.
• Convert method to a predicate.
• Convert receiver object to a term.
• Build a query.
• Determine solution heuristic.
• Convert solution terms back to objects.
43
• $1 => station (method parameter).
• (station(a), IStations)
• intermediateStations => reachable/2.
• station(b)
• station(b)::reachable(station(a), IStations)
• Binding of IStations (first solution).
• [station(x), station(y)] => List<Station>
Processing Steps Outcome
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...}
Monday 26 August 13
• Preprocessing macros and Java exp.
• Convert arguments to terms.
• Convert method to a predicate.
• Convert receiver object to a term.
• Build a query.
• Determine solution heuristic.
• Convert solution terms back to objects.
43
• $1 => station (method parameter).
• (station(a), IStations)
• intermediateStations => reachable/2.
• station(b)
• station(b)::reachable(station(a), IStations)
• Binding of IStations (first solution).
• [station(x), station(y)] => List<Station>
Processing Steps Outcome
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...}
(instance of)
Monday 26 August 13
station(b)::reachable(station(a), IStations)
• Preprocessing macros and Java exp.
• Convert arguments to terms.
• Convert method to a predicate.
• Convert receiver object to a term.
• Build a query.
• Determine solution heuristic.
• Convert solution terms back to objects.
43
• $1 => station (method parameter).
• (station(a), IStations)
• intermediateStations => reachable/2.
• station(b)
• station(b)::reachable(station(a), IStations)
• Binding of IStations (first solution).
• [station(x), station(y)] => List<Station>
Processing Steps Outcome
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...}
Monday 26 August 13
station(b)::reachable(station(a), IStations)
• Preprocessing macros and Java exp.
• Convert arguments to terms.
• Convert method to a predicate.
• Convert receiver object to a term.
• Build a query.
• Determine solution heuristic.
• Convert solution terms back to objects.
43
• $1 => station (method parameter).
• (station(a), IStations)
• intermediateStations => reachable/2.
• station(b)
• station(b)::reachable(station(a), IStations)
• Binding of IStations (first solution).
• [station(x), station(y)] => List<Station>
Processing Steps Outcome
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...}
Monday 26 August 13
station(b)::reachable(station(a), IStations)
• Preprocessing macros and Java exp.
• Convert arguments to terms.
• Convert method to a predicate.
• Convert receiver object to a term.
• Build a query.
• Determine solution heuristic.
• Convert solution terms back to objects.
43
• $1 => station (method parameter).
• (station(a), IStations)
• intermediateStations => reachable/2.
• station(b)
• station(b)::reachable(station(a), IStations)
• Binding of IStations (first solution).
• [station(x), station(y)] => List<Station>
Processing Steps Outcome
@LObject(args = {"name"})public abstract class Station {
@LSolution("IStations") @LMethod(name = "reachable", args = {"$1", "IStations"}) public abstract List<Station> intermediateStations(Station station); ...}
Monday 26 August 13
44
Returning multiple values from queries
The logic solutions The method return valueterm(Varx1, Vary1)
Varx1 x1, Vary1 y1 term(x1, y1)Varx2 x2, Vary2 y2 term(x2, y2)
Varxn xn, Varyn yn term(xn, yn)
Monday 26 August 13
44
Returning multiple values from queries
The logic solutions The method return valueterm(Varx1, Vary1)
Varx1 x1, Vary1 y1 term(x1, y1)Varx2 x2, Vary2 y2 term(x2, y2)
Varxn xn, Varyn yn term(xn, yn)
a composed solution (specified in a methodwith @LComposition)
Monday 26 August 13
45
The logic solutions The method return value(a property of the result set)
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
Varxn xn, Varyn yn
Returning a property of the result set
}
Monday 26 August 13
45
The logic solutions The method return value(a property of the result set)
Varx1 x1, Vary1 y1Varx2 x2, Vary2 y2
Varxn xn, Varyn yn
is there a solution ?
Returning a property of the result set
how many solutions ?}
Monday 26 August 13
Returning a property of the result set
46
@LObject(args = {"name"})public abstract class Line { private String name;
public abstract boolean connects(Station s1, Station s2); @LMethod(name = "connects", args = {"_", "_"}) public abstract int segments();}
Monday 26 August 13
Returning a property of the result set
46
@LObject(args = {"name"})public abstract class Line { private String name;
public abstract boolean connects(Station s1, Station s2); @LMethod(name = "connects", args = {"_", "_"}) public abstract int segments();}
should return if logic method succeeds or not
Monday 26 August 13
Returning a property of the result set
46
@LObject(args = {"name"})public abstract class Line { private String name;
public abstract boolean connects(Station s1, Station s2); @LMethod(name = "connects", args = {"_", "_"}) public abstract int segments();}
should return if logic method succeeds or not
should return the number of solutions
Monday 26 August 13
Instantiating a symbiotic object in Java
Line line = newLogicObject(Line.class, “central”);System.out.println("Number of segments of line " + line + ": " + line.segments());
47
Monday 26 August 13
Instantiating a symbiotic object in Java
Line line = newLogicObject(Line.class, “central”);System.out.println("Number of segments of line " + line + ": " + line.segments());
47
Monday 26 August 13
Instantiating a symbiotic object in Java
Line line = newLogicObject(Line.class, “central”);System.out.println("Number of segments of line " + line + ": " + line.segments());
47
Monday 26 August 13
Other features
• Java expressions embedded in logic terms (symbiosis terms).
•Dependency management support.
• Integration with plain Prolog (without Logtalk).
•Not constrained to a specific execution environment (e.g. an Eclipse plugin).
48
Monday 26 August 13
Inspiration from other domains
• Common interoperability layer : JDBC.
•Mapping artefacts using annotations: JAXB.
• Context dependent conversions: GSON.
• Linguistic symbiosis concepts: SOUL.
49
1http://www.oracle.com/technetwork/java/javase/jdbc/2https://jaxb.java.net/3http://code.google.com/p/google-gson/4http://soft.vub.ac.be/SOUL/
1
2
3
4
Monday 26 August 13
implemented
pending
if time allows it
• Integration direction• OO to Prolog• Prolog to OO
• Linguistic symbiosis• Automation• Transparency• Customisation
• Preserving causality• Inter-language reflection
• Code querying• Code transformation• Code generation• Symbiotic inter-language reflection
• Portability
Research status
50
Monday 26 August 13
Future work
• Finishing a full bidirectional linguistic symbiosis framework.
• Exploring the feasibility of our approach for symbiotic inter-language reflection.
• Adding support for more Prolog engines (e.g. an embedded one).
• Continue the development of reusable hybrid components.
51
Monday 26 August 13
Conclusions
•We are actively exploring how far we can get in automation/transparency regarding Java-Prolog linguistic integration.
•We are attempting to provide reusable hybrid components and frameworks that may be helpful to the community.
• And we are trying to do this in a portable way.
52
Monday 26 August 13