A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

A integração entre dois mundos

Apresentações semelhantes


Apresentação em tema: "A integração entre dois mundos"— Transcrição da apresentação:

1 A integração entre dois mundos
Java  Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho

2 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

3 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

4 Arquiteturas 1 camada (tier) 2 camadas 3 ou mais camadas
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

5 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

6 Arquitetura em 1 camada (ex.)
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).

7 Arquitetura em 1 camada (ex. 2)
Exemplo de regra Kiev String[] strArray = {“one”, “two”, “three”}; public static rule check(pvar String s) { s ?= “hello” ; strArray } public static void main(String[] args) { PVar<String> s = new PVar<String>(); foreach (check(s)) { System.out.println(s.$var); }

8 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

9 Arquitetura em 2 camadas (ex.)
+ assert(String) + checkGoal(String) + findAll(String) InterfaceProlog Objeto Classes Java que implementam o motor prolog

10 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

11 Arquitetura em 3 camadas (ex.)
+ assert(String) + checkGoal(String) + findAll(String) InterfaceProlog Objeto Rede ou JNI Motor prolog

12 Arquitetura em 3 camadas (ex. 2)
termoProlog :- javaMessage(...). javaMessage(T,R,E,M,A,RA,N) :- socket_get(S,T,...), socket_put(S,T,M,...)... InterfaceJava.pl Rede ou JNI Objetos Java

13 Arquiteturas - comparação
1-tier tradução 1-tier extensão 2-tier 3-tier sockets 3-tier JNI Desempenho + + +/- +/- +/- Depuração via IDEs + - + +/- +/- Similaridade das Regras +/- - +/- + + Robustez + + + +/- + Time-to-market +/- - +/- +/- + Facilidade de uso +/- +/- +/- + +/-

14 Sistemas existentes Kiev  Prolog Café  DGKS  jProlog JavaLog LL
Minerva Amzi Logic Server  B-Prolog BinProlog Jasper JIPL (K-Prolog) JPL InterProlog 

15 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

16 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”) ...

17 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); }

18 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

19 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()); }

20 Jasper (exemplo 2) Em Java: Em Prolog: 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 ?

21 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

22 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

23 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’()).

24 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!’))).

25 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)+”)”); } });

26 InterProlog - Arquitetura
Aplicações Java Programa Prolog Classes InterProlog JVM Predicados Executável Prolog sockets Redirecionam. I/O

27 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()); } )

28 Java / Prolog - Exemplo (cont.)
acao(Jogador) :- acaoATomar(Jogador, _, _, _). acaoATomar(Exerc, Loc, Cid, ExercInim) :- atacar(Exerc, Loc), javaMessage(Exerc, ‘ataca’(Loc)). defenderAtacar(Exercito, Cid, ExercInim), local(Cid, Loc), javaMessage(Exercito, ‘ataca’(Loc)).

29 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).

30 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()).

31 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 + “)”)); }

32 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); }

33 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’()).

34 Conclusões Comparação com EOOPS Uniformidade Eficiência
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

35 Referências Amzi Logic Server DGKS InterProlog B-Prolog
B-Prolog BinProlog (e JINNI) DGKS InterProlog

36 Referências Jasper jProlog Kiev JavaLog JPL
JavaLog JPL jProlog Kiev

37 Referências LL Prolog Cafe K-Prolog Minerva
LL Minerva Prolog Cafe


Carregar ppt "A integração entre dois mundos"

Apresentações semelhantes


Anúncios Google