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







Motivação: porque integrar os paradigmas
lógico e orientado a objetos ?

Pontos fortes da prog. em lógica

Pontos fortes da prog. OO
• raciocínio dedutivo built-in
• raciocínio por herança built-in
• parsing e geração built-in
(compilação, meta-prog., PLN)
• encapsulamento
• expressão de relações
universalmente quantificadas e
recursivas entre conceitos
• expressão de estruturas complexas
internas aos conceitos
• expressão declarativa do
conhecimento terminológico
• expressão declarativa do
conhecimento comportamental
• robustez e extensibilidade do
código
• concisão do código
• metodologia de desenvolvimento
informal, porém escalável para
software de grande porte
• prototipagem rápido
• especificação formal executável
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
Objec t network
in memory
J AVA
Serialization
API
Prolog
T erm
Stream bytes
InterProlog
Objec t
Grammar
objec t(c las s (...),...data)
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
Gramáticas de Cláusulas Definidas
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
Exemplo mínimo de Prolog DCG:
conversão regra DCG / cláusula Prolog
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).
Regras com argumentos de concordância
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 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
DOODCI
Uma 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
DOODCI
Uma 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
multidimensional e dedutivo

o
banco
de
dados
A partir dos objetos FLORA será possível realizar
consultas OLAP no paradigma lógico orientado a
objetos
DOODCI
Uma API Prolog para OLAP
Cliente
Dedutivo
DOODCI
ServidorOLAP
Usuário API DOODCI
(Analista ou Software
Externo)
Servidor OLAP
(OLE DB for OLAP
)
Objetos OLAP
O ObjetoFLORA
Camada Lógica da
API DOODCI
(XSB, FLORA)
API ADO MD
Objetos Java/COM
Termos XSB
Objetos Java
Remotos
Servidor API JDCI
(RMI)
Camada Java
InterProlog da API
DOODCI
(Cliente API JDCI)
DOODCI
Uma 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.
DOODCI
Uma 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

Java
Conclusões
• 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
Download

InterProlog