View
124
Download
2
Category
Preview:
Citation preview
Java PrologJava x Prolog
A integração entre dois mundos
Carlos Figueira Filho
csff@di.ufpe.br
Conteúdo
• Motivação• Arquiteturas• Sistemas Existentes
– Java com Prolog– Prolog com Java– Java com Prolog com Java com ...
• Exemplo - InterProlog• Conclusões• Referências
Motivação
• Utilização do mecanismo de busca e inferência de prolog em programas Java
• Utilização das vantagens de Java em programas prolog
• Ampliação do domínio dos termos prolog– De Strings a objetos
Arquiteturas
• 1 camada (tier)– Um programa Prolog é transformado em um
programa Java
• 2 camadas– Emulação de um motor Prolog emulado em Java
• 3 ou mais camadas– Programas Java fazem chamadas a uma
camada intermediária, que por sua vez invoca o motor Prolog
– Programas Prolog fazem chamadas a uma camada intermediária, que as repassam para a JVM
Arquitetura em 1 camada
• Pré-compilação de regras prolog em classes Java, que implementam o mecanismo de busca e inferência prolog.
• 2 estratégias:– Pré-compilação de regras prolog em classes
Java• Ex.: Prolog Café, LLPj
– Extensão da linguagem Java, com construções para a definição de regras
• Ex.: Kiev
Programa Java (Familia.java)public class Familia { private static Set fatos = new HashSet(); static { fatos.add(new Fato(“Mae”, “Marta”, “Joao”)); fatos.add(new Fato(“Mae”, “Maria”, “Silvia”)); fatos.add(new Fato(“Pai”, “Jose”, “Joao”)); . . . } public static boolean Avo(String x, Sting y) { return (Avo_1(x,y) || Avo_2(x,y) || Avo_3(x,y) || Avo_4(x,y)); } private static boolean Avo_1(String x, String y) { for (Iterator i = fatos.iterator(); i.hasNext(); ) { Fato f = (Fato) i.next(); if (f.getPredicateName().equals(“Pai”) && g.getParam(1).equals(x) { Fato aux = new Fato(“Pai”, f.getParam(2), y); if (fatos.contains(aux)) return true; } } return false; } . . .}
Programa Prolog (familia.pl)
avo(X,Z) :- pai(X,Y), pai(Y,Z).avo(X,Z) :- pai(X,Y), mae(Y,Z).avo(X,Z) :- mae(X,Y), pai(Y,Z).avo(X,Z) :- mae(X,Y), mae(Y,Z).mae(marta, joao).mae(maria, silvia).pai(jose, joao).pai(joao, marcos).mae(sandra, jose).pai(pedro, jose).
Arquitetura em 1 camada (ex.)
Arquitetura em 1 camada (ex. 2)
Exemplo de regra Kiev
String[] strArray = {“one”, “two”, “three”};
public static rule check(pvar String s) {
s ?= “hello” ;
s @= strArray
}
public static void main(String[] args) {
PVar<String> s = new PVar<String>();
foreach (check(s)) { System.out.println(s.$var); }
}
Arquitetura em 2 camadas
• Biblioteca de classes Java que implementam a funcionalidade do motor de prolog
• Emulação do motor prolog em Java• Exemplos
– jProlog, JavaLog, LL
Arquitetura em 2 camadas (ex.)
Objeto + assert(String)+ checkGoal(String)+ findAll(String)
InterfaceProlog
Classes Java queimplementamo motor prolog
Arquitetura em 3 camadas
• Biblioteca de classes Java servem como ponte para algum sistema já existente
• 2 estratégias:– Comunicação da JVM com o runtime prolog
via sockets (ou similar)• Ex.: InterProlog
– Ponte Java para algum sistema integrado de alguma linguagem (geralmente C) com prolog.
• Interface com diversas outras linguagens.• Exs.: Amzi Logic Server, BinProlog
Arquitetura em 3 camadas (ex.)
Objeto + assert(String)+ checkGoal(String)+ findAll(String)
InterfaceProlog
Motor prolog
Rede ou JNI
Arquitetura em 3 camadas (ex. 2)
javaMessage(T,R,E,M,A,RA,N) :- socket_get(S,T,...), socket_put(S,T,M,...)...
InterfaceJava.pl
Objetos Java
Rede ou JNI
termoProlog :- javaMessage(...).
Arquiteturas - comparação
Desempenho
Depuraçãovia IDEs
Similaridadedas Regras
1-tiertradução
1-tierextensão
2-tier 3-tiersockets
3-tierJNI
Robustez
+ + +/- +/- +/-
+ - + +/- +/-
+/- - +/- + +
+ + + +/- +
Time-to-market +/- - +/- +/- +
Facilidadede uso +/- +/- +/- + +/-
Sistemas existentes
• Kiev
• Prolog Café
• DGKS • jProlog• JavaLog• LL• Minerva
• Amzi Logic Server
• B-Prolog• BinProlog• Jasper• JIPL (K-Prolog)• JPL
• InterProlog
Kiev
• Extensão da linguagem Pizza, que por sua vez é uma extensão de Java
• Tipos parametrizados, funções de alta ordem, “foreach”, switch para objetos, ...
• Motor de busca embutido na linguagem• http://www.forestro.com/kiev/
Kiev - exemplo
• Exemplo public rule avo(String nome, pvar String neto)
pvar String paiOuMae;
{
pai(nome, paiOuMae), pai(paiOuMae, neto)
; pai(nome, paiOuMae), mae(paiOuMae, neto)
; mae(nome, paiOuMae), pai(paiOuMae, neto)
; mae(nome, paiOuMae), mae(paiOuMae, neto)
}
public rule pai(String oPai, String oFilho) {
oPai.equals(“jose”), oFilho.equals(“joao”) ;
oPai.equals(“joao”), oFilho.equals(“marcos”) ...
}
Kiev - exemplo (cont.)
• Exemplo (cont.)
public static void main(String[] args) {
foreach(PVar<String> netos = new PVar<String>();
avo(“marta”, netos); ) {
System.out.println(netos);
}
}
Jasper
• Desenvolvido para o SICStus Prolog• Boa integração Java Prolog• Integração razoável no sentido Prolog
Java– Necessária uma etapa de compilação dos
wrappers para métodos Java• http://cswww.essex.ac.uk/TechnicalGroup/sicstus/
sicstus_12.html
Jasper (exemplo 1)
• Exemplo SICStus sp = new SICStus(new String[], null);
sp.load(“familia.pl”);
SPPredicate pred =
new SPPredicate(sp, “avo”, 2, “”);
SPTerm maria = new SPTerm(sp, “maria”);
SPTerm netos = new SPTerm(sp).putVariable();
SPQuery query = new Query(pred,
new SPTerm[] {maria, netos});
while (query.nextSolution()) {
System.out.println(way.toString());
}
Jasper (exemplo 2)
• Em Java: public class Teste {
public static int strlen(String nome) {
return nome.length(); } }
• Em Prolog: :- module(strlen, [strlen/2]).
:- use_module(library(jasper)).
:- load_foreign_resource(strlen). foreign(method(‘Teste’, ‘strlen’, [static]), java,
strlen(+string,[-integer])).
foreign_resource(strlen,
[ method(‘Teste’, ‘strlen’, [static]) ]).
c:\>splfr strlen strlen.pl
?- compile(strlen).
?- strlen(‘Hello, world’, L).
L = 11 ?
InterProlog
• Sistema 3-tier que integra Java e Prolog via comunicação Runtime prolog JVM via sockets– Boa integração Prolog Java– Integração razoável Java Prolog
• Desenvolvido para o XSB Prolog• Diferenciação explícita dos dois
mundos, com possibilidade de comunicação
• http://dev.servisoft.pt/interprolog/
InterProlog - Prolog Java
• Predicado javaMessage usado para enviar mensagens a objetos Java
• 3 sabores:– javaMessage(Objeto, Mensagem)– javaMessage(Objeto, Resultado, Mensagem)– javaMessage(Objeto, Resultado, Excecao,
Mensagem, Argumentos, ArgumentosDepois)
• Objetos referenciados por identificadores
InterProlog - Prolog Java (cont).
• Exemplo:javaMessage(‘java.util.Date’, Hoje, ‘Date’),
javaMessage(‘System’ -out, println(Hoje)).
javaMessage(‘java.awt.Frame’, Frame, ‘Frame’(string(‘Frame Teste’))),
javaMessage(‘java.awt.Button, Botao, ‘Button’(string(‘Press me’))),
javaMessage(Frame, ‘add’(Botao)),
javaMessage(Frame, ‘setSize’(100,200)),
javaMessage(Frame, ‘show’()).
InterProlog - Java Prolog
• Classe PrologEngine– registerJavaObject(Object)– addPrologOutputListener(PrologOutputListener)– deterministicGoal(String)– sendAndFlush(String)
• Exemplo (lado de Prolog):
dizAloEm(TextID) :- javaMessage(TextID, setText(string(‘Hello, world!’))).
InterProlog - Java Prolog (cont)
• Exemplo (lado de Java): public static void main(String[] args) {
Frame f = new Frame(“Teste InterProlog”);
final TextField tf = new TextField(15);
Button bt = new Button(“Alo!”);
PrologEngine motor = new PrologEngine(...);
...
bt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
motor.deterministicGoal(“dizAloEm(“+
motor.registerJavaObject(tf)+”)”);
}
});
}
InterProlog - Arquitetura
AplicaçõesJava
ProgramaProlog
ClassesInterProlog
JVM
PredicadosInterProlog
ExecutávelPrologsockets
Redirecionam. I/O
Java / Prolog - Exemplo(Relembrando Civilization...
• Já sei me defender... quero agora ampliar meus domínios...
rule atacaCidade { // Se eu estiver perto de uma cidade inimiga, declarations // devo atacá-la!!! Jogador eu; Cidade cid; UnidCombate meuExerc; preconditions eu.getNome().equals(“Carlos”); cid.getDono() != eu; meuExerc.getDono() == eu; meuExerc.getAtaque() >= 3; // Não vou atacar com qualquer um cid.getLocal().dist(meuExerc.getLocal()) <= meuExerc.getMovim(); !eu.emPaz(cid.getDono()); actions meuExerc.ataca(cid.getLocal());}
)
Java / Prolog - Exemplo (cont.)
• acao(Jogador) :-
acaoATomar(Jogador, _, _, _).
• acaoATomar(Exerc, Loc, Cid, ExercInim) :-
atacar(Exerc, Loc),
javaMessage(Exerc, ‘ataca’(Loc)).• acaoATomar(Exerc, Loc, Cid, ExercInim) :-
defenderAtacar(Exercito, Cid, ExercInim),
local(Cid, Loc),
javaMessage(Exercito, ‘ataca’(Loc)).
Java / Prolog - Exemplo (cont.)
• atacar(Exercito, LocCidade) :-
dono(Exercito, Jogador),
Nome(Jogador, ‘Carlos’),
local(Cidade, LocCidade),
dono(Cidade, Jogador2),
diferente(Jogador, Jogador2),
forcaAtaque(Exercito, Forca),
maiorOuIgual(Forca,3),
emGuerra(Jogador, Jogador2),
local(Exercito, LocExercito),
distancia(LocCidade, LocExercito, DistExCid),
movimento(Exercito, MovExercito),
maiorOuIgual(MovExercito, DistExCid).
Java / Prolog - Exemplo (cont.)
• dono(Exercito, Jogador) :-
javaMessage(Exercito, Jogador, getDono()).• nome(Jogador, Nome) :-
javaMessage(Jogador, Nome, getNome()).• forcaAtaque(Exercito, Forca) :-
javaMessage(Exercito, Forca, getAtaque()).• emGuerra(Jogador1, Jogador2) :-
javaMessage(Jogador1, yes,
emPazCom(Jogador2)).• local(Objeto, Local) :-
javaMessage(Objeto, Local, getLocal()).• distancia(Local1, Local2, Dist) :-
javaMessage(Local1, Dist, dist(Local2)).
• local(Objeto, Local) :-
javaMessage(Objeto, Local, getLocal()).
Java / Prolog - Exemplo (cont.)
• E o lado Java... public static void main(String[] args) { PrologEngine pe = new PrologEngine(); Jogador eu = new Jogador(“Carlos”, “Brasil”); int euId = pe.registerJavaObject(eu); pe.registerJavaObject(new Settler(eu, Localizacao.getRandom())); ... while (pe.deterministicGoal(“acaoATomar(”+ euId + “)”)); }
Java / Prolog - Exemplo 2
• Ou ainda eu posso criar uma nova cidade...rule criaCidade { declarations Jogador eu; Settler meuExerc; preconditions eu.getNome().equals(“Carlos”); meuExerc.getDono() == eu; meuExerc.getLocal().haOceanoPorPerto(); meuExerc.getLocal().haComidaPorPerto(); !meuExerc.getLocal().haCidadePorPerto(); actions Cidade nova = new Cidade(eu); retract(meuExerc); assert(nova); }
Java / Prolog - Exemplo 2
criaCidade(Settler) :- dono(Settler, Jogador), nome(Jogador, “Carlos”), local(Settler, Local), javaMessage(Local, yes, ‘haOceanoPorPerto’()), javaMessage(Local, yes, ‘haComidaPorPerto’()), javaMessage(Local, no, ‘haCidadePorPerto’()), javaMessage(Settler, Classe, ‘getClass()’)., javaMessage(Classe, string(‘Settler’),
‘getName’()).
Conclusões
• Comparação com EOOPS– Uniformidade
• Duas linguagens• Uma linguages
– Eficiência• Depende da arquitetura utilizada• Depende da estratégia de unificação utilizada
– Facilidade de uso• Para programadores OO + Prolog• Para programadores OO
Referências
• Amzi Logic Server– http://www.cs.toronto.edu/~mes/ai/amzi_doc/
• B-Prolog– http://www.cad.mse.kyutech.ac.jp/people/zhou/bprolog/bprolog.html
• BinProlog (e JINNI)– http://www.binnetcorp.com/BinProlog/interface.html
• DGKS– http://www.geocities.com/SiliconValley/Campus/7816/
• InterProlog– http://dev.servisoft.pt/interprolog/
Referências
• Jasper– http://cswww.essex.ac.uk/TechnicalGroup/sicstus/
sicstus_12.html
• JavaLog– http://www.exa.unicen.edu.ar/~azunino/javalog.html
• JPL– http://blackcat.cat.syr.edu/~fadushin/software/jpl/
• jProlog– http://www.cs.kuleuven.ac.be/~bmd/PrologInJava/
• Kiev– http://www.forestro.com/kiev/
Referências
• K-Prolog– http://prolog.isac.co.jp/doc/en/jipl.html
• LL– http://www.uni-koblenz.de/~motzek/html/progsp/
lleng.html
• Minerva– http://www.ifcomputer.com/Products/MINERVA/
home_en.html
• Prolog Cafe– http://pascal.seg.kobe-u.ac.jp/~banbara/PrologCafe/
index.html
Recommended