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

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

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

Apresentações semelhantes


Apresentação em tema: "Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho"— Transcrição da apresentação:

1 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) –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 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.)

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 s = new PVar (); 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.) Objeto + assert(String) + checkGoal(String) + findAll(String) InterfaceProlog 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.) Objeto + assert(String) + checkGoal(String) + findAll(String) InterfaceProlog Motor prolog Rede ou JNI

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

13 Arquiteturas - comparação Desempenho Depuração via IDEs Similaridade das Regras 1-tier tradução 1-tier extensão 2-tier3-tier sockets 3-tier JNI 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 netos = new PVar (); 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: 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 InterProlog 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)). acaoATomar(Exerc, Loc, Cid, ExercInim) :- 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 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 –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/

36 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/

37 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


Carregar ppt "Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho"

Apresentações semelhantes


Anúncios Google