Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho [email protected] 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 Arquitetura em 1 camada (ex.) Programa Java (Familia.java) public class Familia { private static Set fatos = new HashSet(); Programa Prolog (familia.pl) static { fatos.add(new Fato(“Mae”, “Marta”, “Joao”)); fatos.add(new Fato(“Mae”, “Maria”,pai(Y,Z). “Silvia”)); avo(X,Z) :- pai(X,Y), fatos.add(new Fato(“Pai”, “Jose”, “Joao”)); avo(X,Z) :- pai(X,Y), mae(Y,Z). . . . avo(X,Z) :- mae(X,Y), pai(Y,Z). } public static boolean Avo(String x, Sting y) { avo(X,Z) :- mae(X,Y), mae(Y,Z). return (Avo_1(x,y) || Avo_2(x,y) mae(marta, joao). || Avo_3(x,y) || Avo_4(x,y)); } mae(maria, silvia). private static boolean Avo_1(String x, String y) { joao). for (Iterator ipai(jose, = fatos.iterator(); i.hasNext(); ) { Fato f = (Fato) i.next(); pai(joao, marcos). if (f.getPredicateName().equals(“Pai”) && mae(sandra, jose). g.getParam(1).equals(x) { jose). f.getParam(2), y); Fato aux = pai(pedro, new Fato(“Pai”, if (fatos.contains(aux)) return true; } } return false; } . . . } 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.) InterfaceProlog Objeto + assert(String) + checkGoal(String) + findAll(String) Classes Java que implementam o 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.) InterfaceProlog Objeto + assert(String) + checkGoal(String) + findAll(String) Rede ou JNI Motor prolog Arquitetura em 3 camadas (ex. 2) termoProlog :javaMessage(...). InterfaceJava.pl javaMessage(T,R,E,M,A,RA,N) :socket_get(S,T,...), socket_put(S,T,M,...)... Rede ou JNI Objetos Java 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 +/- - +/- + + + + + +/- + Time-to-market +/- - +/- +/- + Facilidade de uso +/- +/- +/- + +/- Robustez 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 pvar String paiOuMae; { pai(nome, paiOuMae), ; pai(nome, paiOuMae), ; mae(nome, paiOuMae), ; mae(nome, paiOuMae), } public rule pai(String oPai.equals(“jose”), oPai.equals(“joao”), } nome, pvar String neto) pai(paiOuMae, mae(paiOuMae, pai(paiOuMae, mae(paiOuMae, neto) neto) neto) neto) oPai, String oFilho) { oFilho.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ções Java Programa Prolog Classes InterProlog Predicados InterProlog JVM Redirecionam. I/O sockets Executável Prolog 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)). 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