320 likes | 424 Views
InterProlog: uma API para integrar Prolog com Java. Marcelino Pereira CIn-UFPE. Roteiro. Motivação Interfaces Java/Prolog InterProlog Serialização de objetos Java Gramáticas de Cláusulas Definidas: ferramentas Prolog para Parsing e Geração Swing Chamar Java a partir de Prolog
E N D
InterProlog: uma API para integrar Prolog com Java Marcelino Pereira CIn-UFPE
Roteiro • Motivação • Interfaces Java/Prolog • InterProlog • Serialização de objetos Java • Gramáticas de Cláusulas Definidas: ferramentas Prolog para Parsing e Geração • Swing • Chamar Java a partir de Prolog • Chamar Prolog a partir de Java • DOODCI: exemplo de aplicação Java/Prolog • Conclusões
Pontos fortes da prog. em lógica raciocínio dedutivo built-in parsing e geração built-in (compilação, meta-prog., PLN) expressão de relações universalmente quantificadas e recursivas entre conceitos expressão declarativa do conhecimento comportamental concisão do código prototipagem rápido especificação formal executável Pontos fortes da prog. OO raciocínio por herança built-in encapsulamento expressão de estruturas complexas internas aos conceitos expressão declarativa do conhecimento terminológico robustez e extensibilidade do código metodologia de desenvolvimento informal, porém escalável para software de grande porte Motivação: porque integrar os paradigmas lógico e orientado a objetos ?
Motivação: porque integrar especificamente as linguagens Prolog e Java? • Quase todas as aplicações reais de IA são embutidas em aplicações multifacetadas • Envolvem também GUI, distribuição em redes, conectividade com BD, conectividade com software de legado convencionais, atuadores físicos, etc. • ex, comércio eletrônico, filtragem de informação na Internet, jogos, robótica, etc.
Motivação: porque integrar especificamente as linguagens Prolog e Java? • Prolog: • base mais versátil sobre a qual implementar serviços cognitivos • dedutivo, lingüístico, indutivo, abdutivo, probabilista • padrão em IA, usado também fora da IA (ex, BD), no entanto divulgação industrial permanece marginal • Java: • base mais versátil sobre a qual integrar todos os outros serviços • conjunto incomparável de API prontas para GUI, distribuição e mobilidade em redes, conectividade com qualquer coisa, segurança, etc. • linguagem mais maciçamente divulgada ao lado de C/C++ • Ambos compilados para código de máquina virtual
Arquiteturas de integração Prolog/Java • 1 camada • Um programa Prolog é transformado em um programa Java • 2 estratégias: • Pré-compilação de regras Prolog em classes Java • Extensão de Java, com construções para a definição de regras • 2 camadas • Máquina de inferência Prolog implementada em Java • ex, método unify, método search, método backtrack,... • 3 ou mais camadas • 2 processos rodando: uma máquina virtual Prolog e uma máquina virtual Java • os 2 comunicam: • via 3a linguagem (ex, C) pelo qual ambas máquinas virtuais tem API • ou via soquetes com conversão bi-direcional de objetos Java para termos Prolog (InterProlog)
InterProlog • API bidirecional entre XSB Prolog e Java padrão • execução de consultas Prolog em métodos Java • invocação de métodos Java em consulta ou premissa Prolog • Princípios básicos: • comunicação entre máquinas virtuais via soquetes • conversão bi-direcional de objetos Java para termos Prolog usando • serialização de objetos Java • parsing e geração de termos Prolog usando gramáticas de cláusula definidas (ou DCG do inglês Definite Clause Grammar) • 2 componentes: classes Java e regras Prolog • mecanismo built para geração de termos Prolog a partir de objetos Java • Origem: • Projeto PROLLOPE multi-institucional Univ. Nova de Lisboa, Univ. de Porto, Univ. de Hannover, ServiSoft (empresa)
Arquitetura de InterProlog
Serialização de objetos Java • Padrão de representação de objetos Java compilados na forma de bytecodes interpretáveis pela máquina virtual Java • Utilizado para: • armazenamento persistente • transferência de objetos pela rede em aplicações distribuídas
DCGs: Gramáticas de Cláusulas Definidas • Pré-processador built-in de Prolog • converte regras de gramáticas em cláusulas lógica • re-aproveita provador de teorema de Prolog • para implementar “de graça” parser ou gerador de frases • Usa diferença de listas como estrutura de dados: • frase da linguagem cuja gramática é representada pela DCG - lista de palavras ainda a ser processadas = listas de palavras já processadas • Cada regra DCG: • associada a uma categoria sintática genérica cat • instancia 2 argumentos adicionais implícitos: 1. lista de palavras do constituinte const da frase de catégoria cat 2. lista de palavras do resto da frase na direita de const
Regras de gramáticas: sn --> det, subs. Entradas do dicionário: det --> [o]. det--> [a]. det --> [os]. det --> [as]. subs --> [menino]. subs --> [meninos]. subs --> [menina]. subs --> [meninas]. Conversão para cláusulas Prolog: sn(Csn,Rsn) :- det(Csn,Rdet), subs(Rdet,Rsn). det([o|Rdet], Rdet). det([a|Rdet], Rdet). det([os|Rdet], Rdet). det([as|Rdet], Rdet). subs([menino|Rsubs], Rsubs). subs([meninos|Rsubs], Rsubs). subs([menina|Rsubs], Rsubs). subs([meninas|Rsubs], Rsubs). Exemplo mínimo de Prolog DCG: conversão regra DCG / cláusula Prolog
Regras de gramáticas: sn(G,N) --> det(G,N), subs(G,N). Entradas do dicionário: det(masc,sing) --> [o]. det(fem,sing) --> [a]. det(masc,plur) --> [os]. det(fem,plur) --> [as]. subs(masc,sing) --> [menino]. sub(masc,plur) --> [meninos]. subs(fem,sing) --> [menina]. subs(fem,plur) --> [meninas]. Conversão para cláusulas Prolog: sn(G,N,Csn,Rsn) :- det(G,N, Csn,Rdet), subs(G,N, Rdet,Rsn). det(masc,sing,[o|Rdet], Rdet). det(fem,sing,([a|Rdet], Rdet). det(masc,plur,[os|Rdet], Rdet). det(fem,plur,[as|Rdet], Rdet). subs(masc,sing,[menino|Rsubs], Rsubs). subs(masc,plur,[meninos|Rsubs], Rsubs). subs(fem,sing,[menina|Rsubs], Rsubs). subs(fem,plur,[meninas|Rsubs], Rsubs). Regras com argumentos de concordância
Regras genéricas com restrições • Regras de sintaxe: const(sn,G,N) --> const(det,G,N), const(subs,G,N). • Dicionário: const(subs,menino,masc,sing). const(det,o,masc,sing). • Regras de morfologia: const(Cat,LexMS,masc,sing) --> [LexMS], {member(Cat,[subs,adj,det])}. const(Cat,LexMS,masc,plur) --> [LexMP], {member(Cat,[subs,adj,det]), plur(LexMP,LexMS)}. const(Cat,LexMS,fem,sing) --> [LexFS], {member(Cat,[subs,adj,det]), fem(LexFS,LexMS)}. const(Cat,LexMS,fem,plur) --> [LexFP], {member(Cat,[subs,adj,det]), plur(LexFP,LexFS), fem(LexFS,LexSM). • Predicados de restrições: plur(LexMP,LexMS) :- concatom(LexMS,s,LexMP). fem(LexFS,LexMS) :- concatom(LexRad,a,LexFS), concatom(LexRad,o,LexMS). concatom(A,B,AB) :- name(A,Sa), list(La,Sa), name(B,Sb), list(Lb,Sb), append(La,Lb,Lab), list(Lab,Sab), name(AB,Sab).
Argumentos para mapeamento frase, estrutura sintática, conteúdo semântico sn(sn(Det,Subs),G,N) --> det(Det,G,N), subs(Subs,G,N). det(det(o),masc,sing) --> const(det,o,masc,sing). subs(subs(menino),masc,sing). --> const(subs,livro,masc,sing). const(Cat,LexMS,masc,sing) --> [LexMS], {member(Cat,[subs,adj,det])}. const(Cat,LexMS,masc,plur) --> [LexMP], {member(Cat,[subs,adj,det]), plur(LexMP,LexMS)}. const(Cat,LexMS,fem,sing) --> [LexFS], {member(Cat,[subs,adj,det]), fem(LexSF,LexMS)}. const(Cat,LexMS,fem,plur) --> [LexFP], {member(Cat,[subs,adj,det]), plur(LexFP,LexFS), fem(LexFS,LexSM).
DCG: interpretador ou gerador de frases ?- sn(ParseTree,G,N,[o,menino],[]). ParseTree = sn(det(o),subs(menino)), G = masc, N = sing. yes ?- sn(sn(det(o),subs(menino)),G,N,WordList,[]). WordList = [o, menino], G = masc, N = plur. yes ?- sn(sn(det(o),subs(menino)),_,_,[o,menino],[]). yes
SWING • Java Foundation Classes (JFC) extende o Abstract Windowing Toolkit (AWT), adicionando bibliotecas de classes GUI • JFC/Swing GUI Components • componentes escritos em Java sem código específico para sistema de janelas • facilita customização de visual • independência do sistema nativo de janelas • simplifica a extensão de aplicações
Chamar Java a partir de Prolog • O formato da sequência de bytes é padrão e público, e Interprolog sabe disso, em forma de uma Gramática de Cláusulas Assertivas • Esta gramática é capaz de fazer parse de objetos enviados por Java e de sintetizar novos objetos das especificações de termos Prolog, através da representação serializada da sequência de bytes
Chamar Java a partir de Prolog • javaMessage(Target,Result,Message) • sincronamente envia Message para o objeto Target obtendo o objeto Result • javaMessage(Target,Message): ?- javaMessage('java.lang.System'-out,println(string('Hello world!'))) • predicado pode ser usado para enviar qq mensagem p/ qq método público na classe Target ou superclasses (variedades)
Chamar Java a partir de Prolog • ipObjectSpec • especifica objetos da respectiva classe • ipObjectTemplate • substitui por variáveis lógicas as variáveis descritas na classe • ipPrologEngine • referencia PrologEngine
Chamar Java a partir de Prolog • BuildTermModel • constrói uma especificação de objeto para uma instância representando um termo • utilizado para passar termos Prolog para Java • browseTerm • cria janela com um browser de termo • browseTreeTerm • cria janela com um browser hierárquico • browseXSBTable • cria janela para navegação na avaliação corrente do predicado
Chamar Prolog a partir de Java • Classe PrologEngine • fornece ao programador Java acesso ao Prolog • cada processo background Prolog é encapsulado numa instância PrologEngine • Métodos disponíveis para: • solicitar ao Prolog para avaliar objetivos e obter um resultado num objeto • enviar texto ao seu stdin e coletar seu stdout utilizando um mecanismo listener simples baseado em processos background Java
Chamar Prolog a partir de Java • Classe addPrologOutputListener • faz com que o cliente receba mensagens • sendAndFlush • envia texto ao stdin do Prolog • interrupt(), shutdown() • simula um ctrl-c
Chamar Prolog a partir de Java • teachMoreObjects • envia um array de objetos p/ Prolog • registerJavaObject • registra um objeto com seu PrologEngine e retorna um ID integer p/ futura ref em Prolog • isAvailable • retorna true se o Prolog não estiver ocupado • deterministicGoal • chama o objetivo Prolog que retorna objetos que refletem a 1a solução encontrada
DOODCIUma API Prolog para OLAP • Deductive Object-Oriented Data Cube Interface • Integração • DW + OLAP + D. Mining + Dedução + PLN • Ambiente inteligente e abrangente para DSS e KDD • Projeto MATRIKS • Multidimensional Analysis and Textual Reporting for Insight Knowledge Search • BD multidimensionais + Sist. Dedutivos
DOODCIUma API Prolog para OLAP • Java + FLORA + XSB + InterProlog • Interprolog • permite a comunicação entre Java e o sistema dedutivo XSB • APIs (JDCI e DOODCI) • permitem comunicação entre o banco de dados multidimensional e dedutivo • A partir dos objetos FLORA será possível realizar consultas OLAP no paradigma lógico orientado a objetos
DOODCIUma API Prolog para OLAP • LoadCubes e ExecuteMDQuery • classes principais para converter os objetos Java em termos Prolog • LoadCubes • LoadCubes instanciada quando da conexão da JDCI ao esquema multidimensional • a partir de FLORA, utilizando InterProlog, LoadCubes é chamada • quando construtor classe é executado, metadados multidimensionais exportados pela JDCI são convertidos para termos XSB Prolog por meio do InterProlog.
DOODCIUma API Prolog para OLAP • ExecuteMDQuery • instanciada quando passa-se um string MDX, a partir de FLORA, para ser executada no esquema de dados multidimensionais conectado, na parte Java de DOODCI • na execução do construtor desta classe, os objetos criados do lado Java na execução da consulta MDX pela API JDCI são convertidos para termos XSB Prolog utilizando-se o InterProlog
Conclusões • Java • Reflexão/Serialização • Comunicação/GUI • InterProlog=poder/flexibilidade Prolog/Java • Ferramenta nova • Necessita ajustes • Flexibilidade e dinamismo • DOODCI • OLAP + Dedução Data Mining • Carência de documentação InterProlog
Conclusões • Prolog • representação dados • Java • manipulação eventos • aparência • edição • Java Foundation Classes (JFC) / SWING • fornece framework natural
Bibliografia • Calejo, Miguel (1998). Introduction to InterProlog. Servisoft. • Calejo, Miguel (1998). InterProlog: A simple yet powerful Java/Prolog interface. Servisoft. • Lino, Natasha C. Q. (2000). DOODCI - Uma API para Integração entre Bancos de Dados Multidimensionais e Sistemas Dedutivos. CIn/UFPE. • Projeto PROLOPPE (2000) em: http://www-ia.di.fct.unl.pt/7Elmp/documents/proloppe.html • Java+Prolog systems and interfaces (2000) em: http://www.declarativa.com/interprolog/systems.htm • Java API Documentation (2000) em: http://www.declarati va.com/interprolog/htmldocs/overview-summary.html