1 / 37

Java x Prolog

Java  Prolog. Java 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.

israel
Download Presentation

Java x Prolog

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java  Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br

  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” ; s @= 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. InterfaceProlog + assert(String) + checkGoal(String) + findAll(String) Objeto Classes Java que implementam o motor prolog Arquitetura em 2 camadas (ex.)

  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. InterfaceProlog + assert(String) + checkGoal(String) + findAll(String) Objeto Rede ou JNI Motor prolog Arquitetura em 3 camadas (ex.)

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

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

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

  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 • http://www.forestro.com/kiev/

  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 • http://cswww.essex.ac.uk/TechnicalGroup/sicstus/sicstus_12.html

  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 • http://dev.servisoft.pt/interprolog/

  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. Predicados InterProlog Classes InterProlog Redirecionam. I/O Executável Prolog JVM sockets InterProlog - Arquitetura Programa Prolog Aplicações Java

  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. local(Objeto, Local) :- javaMessage(Objeto, Local, getLocal()). 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)).

  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

More Related