370 likes | 550 Views
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.
E N D
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 • 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
InterfaceProlog + assert(String) + checkGoal(String) + findAll(String) Objeto Classes Java que implementam o motor prolog Arquitetura em 2 camadas (ex.)
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
InterfaceProlog + assert(String) + checkGoal(String) + findAll(String) Objeto Rede ou JNI Motor prolog Arquitetura em 3 camadas (ex.)
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(...).
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 +/- +/- +/- + +/-
Kiev Prolog Café DGKS jProlog JavaLog LL Minerva Amzi Logic Server B-Prolog BinProlog Jasper JIPL (K-Prolog) JPL InterProlog Sistemas existentes
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)+”)”); } }); }
Predicados InterProlog Classes InterProlog Redirecionam. I/O Executável Prolog JVM sockets InterProlog - Arquitetura Programa Prolog Aplicações Java
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).
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)).
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