integracaojavaprolog.pdf

Upload: rafael-quirino

Post on 13-Oct-2015

20 views

Category:

Documents


0 download

TRANSCRIPT

  • Integrao de Java e Prolog com JPL

    R. M. Teles C. L. de Carvalho

    Technical Report - RT-INF_000-09 - Relatrio Tcnico

    December - 2009 - Dezembro

    The contents of this document are the sole responsibility of the authors.

    O contedo do presente documento de nica responsabilidade dos autores.

    Instituto de Informtica

    Universidade Federal de Gois

    www.inf.ufg.br

  • Integrao de Java e Prolog com JPL

    R. M. Teles

    [email protected]

    Cedric L. de Carvalho

    [email protected]

    16/12/2009

    Abstract. Create intelligent systems based on mathematical logic is a complicated jobthat requires a good inference engine. The success in creating good inference engineof Prolog created the need to use these engines in software made in other paradigms.The goal is provide artificial intelligence techniques to software that were not cre-ated in the paradigm of mathematical logic programming using a integration othersoftware created in this paradigm. This paper presents a way to integrate programswritten in Java language with Prolog language, more specifically with the implemen-tation of SWI-Prolog.

    Keywords: Intelligent systems, Prolog language, Java language

    Resumo. Criar sistemas inteligentes com base em lgica matemtica um trabalhocomplicado que exige um bom motor de inferncia. O sucesso na criao de bons mo-tores de inferncia da linguagem Prolog criou a necessidade de aproveitamento destesmotores em softwares feitos em outros paradigmas. O objetivo prover tcnicas deinteligncia artificial a softwares que no foram criados no paradigma de progra-mao em lgica matemtica utilizando uma integrao com outro software criadoneste paradigma. Este trabalho apresenta uma forma de integrar programas feitos nalinguagem Java com a linguagem Prolog, mais especificamente com a implementaoSWI-Prolog.

    Palavras-Chave: Sistemas inteligentes, linguagem Prolog, linguagem Java

    1 IntroduoCriar sistemas inteligentes tornou-se um requisito comum tendo em vista as necessidades

    dos usurios em obter bons resultados em problemas de otimizao e tambm boas sugestesem Sistemas de Apoio Deciso (SAD).

    A criao de sistemas inteligentes feita com base em lgica matemtica, permitindo queo prprio sistema possa inferir valores com base nos fatos e regras que foram informados.

    Na prtica existem duas grandes linguagens para programao de sistemas inteligentes, alinguagem Lisp e a linguagem Prolog [4] na qual este trabalho se fundamenta.Mestrando em Cincia da Computao INF/UFG.Orientador INF/UFG.

    1

  • Integrao de Java e Prolog com JPL 2

    A linguagem Prolog foi criada em 1972 por Alain Colmerauer e Robert Kowalski. Onome Prolog significa Programmation en Logique referenciando diretamente o paradigma deprogramao em lgica matemtica.

    Apesar de ser uma linguagem muito boa para o desenvolvimento de sistemas inteligentes,poucas pessoas programam neste paradigma, este fato se torna mais claro quando o tema desenvolvimento de grandes softwares para mesa de trabalho ou para a World Wide Web (Web)[1].

    Nestas duas categorias de softwares existe uma grande preocupao na interao com ousurio.

    Os programas criados na linguagem Prolog resultam em executveis via console, ondeo interrogador deve saber digitar as perguntas ou adicionar novas asseres, utilizando umalinguagem que no natural atravs dos fatos e regras definidos pelo programador.

    Ao contrrio da linguagem Prolog, muitos programas feitos na linguagem Java [7] obje-tivam uma interface rica com o usurio, tanto na criao de softwares para mesa de trabalhoquanto para Web, principalmente com a criao do JavaFX [6].

    Desta forma, pode-se pensar em criar um ncleo de raciocnio na linguagem Prolog e umainterface grfica na linguagem Java. O grande problema como integrar os programas feitosnestas duas linguagens de paradigmas diferentes.

    Existem vrios arcabouos que fazem a integrao ou que simulam as regras de infer-ncia definidas por um programa Prolog ou definidas diretamente na linguagem Java. Pormutilizar tais simuladores no so viveis tendo em vista que eles no conseguem simular todosos comportamentos de inferncia. Logo, a ideia que permite uma melhor continuidade e apri-moramento do software utilizar um programa que interaja diretamente com um interpretadorProlog.

    Esta interao pode ser feita atravs da API (Application Programming Interface) JPL,uma interface bidirecional entre Prolog e Java, que utiliza a implementao SWI-Prolog [8].

    Na seo 2 ser mostrado como compilar os programas necessrios e configurar o ambi-ente para interao do programa Java com o programa Prolog. Na seo 3 sero apresentadasas principais classes de integrao com o Prolog. Na seo 4 sero apresentados exemplos deimplementaes de interao de programas escritos na linguagem Java com programas escritosem Prolog. Finalmente, na seo 5, so apresentadas as consideraes finais.

    2 Configurao do AmbienteEsta seo apresenta as configuraes necessrias para compilao do SWI-Prolog e in-

    tegrao com a linguagem Java. Nota-se que no ser objeto de estudo desta seo a instalaoda linguagem Java.

    2.1 Instalao do SWI-PrologEsta subseo apresenta como instalar o SWI-Prolog no sistema operacional Linux. Antes

    de iniciar a instalao necessrio obter o cdigo fonte do SWI-Prolog no endereo http://www.swi-prolog.org/download/stable.

    Depois de extrair o arquivo, normalmente nomeado como pl-VERSO.tar.gz, onde VER-SO o nmero da verso do SWI-Prolog, necessrio executar o comando ./configure, senenhuma dependncia de biblioteca for encontrada o comando make pode ser executado emseguida, aps este comando, necessrio executar comando make install com o usurio rootpara instalar o SWI-Prolog no sistema operacional.

  • Integrao de Java e Prolog com JPL 3

    Aps compilar e instalar o SWI-Prolog necessrio compilar o JPL separadamente. OJPL pode ser encontrado na pasta packages/jpl relativa a pasta raiz do cdigo fonte do SWI-Prolog. Nesta pasta, deve se executar o comando ./configure, da mesma forma, se nenhumadependncia for encontrada, o comando make deve ser executado seguido do comando makeinstall.

    Depois compilar os cdigos do JPL ser criado um arquivo chamado jpl.jar na pasta doJPL. Este arquivo dever ser includo no classpath quando o programa Java for compilado ouexecutado.

    Quando o processo de compilao tiver acabado, ser criada automaticamente uma pastaem /usr/local/lib/pl-VERSO/lib/ARQUITETURA-linux, onde ARQUITETURA a arquiteturado computador, por exemplo i686. Esta pasta ser utilizada como parmetro ao executar oprograma escrito na linguagem Java.

    2.2 Configuraes necessrias na integraoAps todo o processo de compilao e instalao, para informar ao programa Java que

    deve utilizar esta biblioteca necessrio adicionar o parmetro java.library.path com o valor dapasta "/usr/local/lib/pl-VERSO/lib/ARQUITETURA-linux".

    Desta forma o comando de execuo do programa : java -jar meu.jar -Djava.library.path="/usr/local/lib/pl-VERSO/lib/ARQUITETURA-linux". Nota-se que o ar-quivo jpl.jar deve estar no classpath ou ento passado como parmetro ao executvel java.

    Para realizar esta configurao no NetBeans [5], necessrio editar as propriedades doprojeto e adicionar o parmetro assim como apresentado na Figura 1.

    Figura 1: Configurao no NetBeans 6.8

  • Integrao de Java e Prolog com JPL 4

    3 Principais classes para integraoEsta seo apresenta as principais classes e funes utilizadas na integrao de um pro-

    grama Java com um programa Prolog. A Figura 2 apresenta estas classes e funes utilizando anotao da UML (Unified Modeling Language) [2].

    Figura 2: UML das principais classes do JPL

    3.1 A classe QueryA classe Query utilizada para realizar consultas no Prolog. Uma consulta pode ser aberta

    pelo mtodo open() ou fechada pelo mtodo close()1, quando aberta, mantem uma conexo como motor do Prolog.

    Como pode ser visto na Figura 2, a classe Query implementa a interface Enumerationdo Java. Desta forma, pode-se chamar sucessivas vezes o mtodo hasMoreElements(), caso aconsulta tenha sucesso ser retornado true, caso contrrio false.

    Para obter um elemento do resultado necessrio chamar o mtodo nextElement() queretorna uma Hashtable. Os elementos da Hashtable so termos da classe Term, mapeados pelosnomes das variveis que esto associados.

    Atravs do mtodo oneSolution() possvel visualizar apenas a primeira soluo. Paraobter todas as solues de uma nica vez, pode-se utilizar o mtodo allSolutions().

    1Certifique-se de fechar a consulta sempre que no necessitar mais da conexo.

  • Integrao de Java e Prolog com JPL 5

    3.2 A classe Term e a VariableA classe Term a classe abstrata para as classes Compound, Atom, Variable e outras

    classes menos importantes. Desta forma, no possvel criar uma instncia direta da classeTerm, mas sim de suas subclasses.

    Como uma alternativa, pode-se utilizar o mtodo textToTerm() da classe Util para criarum termo assim como feito no Prolog.

    A classe Variable representa uma varivel do Prolog.

    3.3 A classe Compound e a AtomA classe Compound representa um termo composto por uma funo e argumentos. A

    classe Atom uma classe Compound onde a quantidade de argumentos zero (0).Desta forma, tentar construir um Compound com zero argumentos, lana uma exceo do

    tipo JPLException.A aridade (atributo arity) de uma instncia da classe Compound a quantidade de argu-

    mentos que ele possui. Depois de construdo, nem o nome nem a aridade de uma instnciada classe Compound pode ser alterada. Porm, um argumento pode ser substitudo atravs domtodo setArg().

    Da mesma forma como a classe Compound, depois de instanciar um objeto da classeAtom, no permitido alterar o seu nome.

    Um objeto do tipo Atom pode ser usado em vrios objetos do tipo Compound como argu-mento. Dois elementos do tipo Atom so iguais se e somente se possuem os mesmos nomes.

    4 Exemplo de implementaoO primeiro e mais clssico exemplo uma rvore genealgica [3]. A Figura 3 apresenta

    a rvore genealgica, onde cada vrtice representa uma pessoa e cada arco representa a relaogenitor.

    Figura 3: rvore genealgica

    O Exemplo 1 apresenta o cdigo Prolog da rvore genealgica apresentada na Figura 3.

    Exemplo 1: Cdigo Prolog da rvore genealgica1 / P r i m e i r o n v e l da r v o r e /2 p e s s o a ( j o a o ) .3 p e s s o a ( mar i a ) .

  • Integrao de Java e Prolog com JPL 6

    45 p e s s o a ( j o s e ) .6 p e s s o a ( ra imunda ) .78 / Segundo n v e l da r v o r e /9 p e s s o a ( s e b a s t i a o ) .

    10 p e s s o a ( v i l a n i ) .1112 / l t imo n v e l da r v o r e /13 p e s s o a ( r o n n e e r y ) .14 p e s s o a ( r o n n e e s l e y ) .1516 / R e l a e s de g e n i t o r e s /17 g e n i t o r ( joao , s e b a s t i a o ) .18 g e n i t o r ( maria , s e b a s t i a o ) .1920 g e n i t o r ( j o s e , v i l a n i ) .21 g e n i t o r ( ra imunda , v i l a n i ) .2223 g e n i t o r ( s e b a s t i a o , r o n n e e r y ) .24 g e n i t o r ( v i l a n i , r o n n e e r y ) .2526 g e n i t o r ( s e b a s t i a o , r o n n e e s l e y ) .27 g e n i t o r ( v i l a n i , r o n n e e s l e y ) .

    No Exemplo 1, as linhas 1 a 14, relacionam os tomos joao, maria, jose, raimunda,sebastiao, vilani, ronneery e ronneesley ao predicado pessoa. As linhas 17 a 27 relacionam ospessoas ao predicado genitor, assim como apresentado na Figura 3.

    4.1 Consulta das pessoas no PrologUm primeiro programa que pode ser feito em Java a lista das pessoas declaradas no

    programa Prolog. Em Prolog esta lista poderia ser obtida atravs da pergunta pessoa(X), ondeX uma varivel.

    O Exemplo 2 apresenta o cdigo Java para a consulta das pessoas. Nota-se que o ambientedeve estar configurado assim como foi apresentado na seo 2.

    Exemplo 2: Cdigo Java que consulta as pessoas1 package j a v a p r o l o g ;23 import j a v a . u t i l . H a s h t a b l e ;4 import j p l . ;56 p u b l i c c l a s s C o n s u l t a P e s s o a s {7 p u b l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {8 Query que ry = new Query ( " c o n s u l t " ,9 new Term [ ] { new Atom ( " . . / . . / r e c u r s o s / p r o l o g / p a r e n t e s . p l " ) } ) ;

    1011 t r y {12 query . h a s S o l u t i o n ( ) ;13

  • Integrao de Java e Prolog com JPL 7

    14 V a r i a b l e X = new V a r i a b l e ( "X" ) ;15 Query c o n s u l t a P e s s o a s = new Query ( " p e s s o a " , new Term [ ] {X} ) ;1617 System . o u t . p r i n t l n ( " L i s t agem de p e s s o a s " ) ;18 whi le ( c o n s u l t a P e s s o a s . hasMoreElements ( ) ) {19 H a s h t a b l e t a b e l a = c o n s u l t a P e s s o a s . n e x t S o l u t i o n ( ) ;2021 System . o u t . p r i n t l n ( t a b e l a . g e t (X. name ( ) ) ) ;22 }2324 } catch ( P r o l o g E x c e p t i o n pe ) {25 System . o u t . p r i n t l n ( "O a r q u i v o P r o l o g no f o i e n c o n t r a d o . " ) ;2627 pe . p r i n t S t a c k T r a c e ( ) ;28 }29 }30 }

    No Exemplo 2, as linhas 8 e 9 preparam a consulta con-sult(../../recursos/prolog/parentes.pl). Neste caso no necessrio colocar os apstrofes(), pois o prprio arcabouo JPL ir coloc-los.

    A linha 12 executa a consulta da varivel query, caso algum erro seja encontrado, serlanada uma exceo, modificando o fluxo do programa para o bloco de cdigo catch, naslinhas 24 a 28.

    Se a primeira consulta for executada com sucesso, ento pode-se preparar a segunda con-sulta que pessoa(X). Para montar esta consulta, necessrio declarar uma varivel chamada Xna linha 14 e criar a varivel consultaPessoas assim como apresentado na linha 15.

    Finalmente, nas linhas 17 a 22, so exibidos os resultados da consulta pessoa(X). Paraisto, criou-se o lao da linha 18 que ir buscar os resultados enquanto houverem2.

    A linha 19 solicita o prximo resultado que ser armazenado na Hashtable chamadatabela. E a linha 21 exibe o resultado na sada padro, atravs do nome da varivel X.

    O Exemplo 3 apresenta o resultado da execuo do Exemplo 2.

    Exemplo 3: Resultado da execuo do Exemplo 21 Lis t agem de p e s s o a s2 j o a o3 mar i a4 j o s e5 ra imunda6 s e b a s t i a o7 v i l a n i8 r o n n e e r y9 r o n n e e s l e y 4.2 Consulta dos genitores no Prolog

    O segundo programa apresenta os genitores de todas as pessoas. Em Prolog esta listapoderia ser obtida atravs da pergunta genitor(X, Y), pessoa(Y). O Exemplo 4 apresenta o cdigoJava para a consulta dos genitores de uma pessoa.

    2Nota-se que a funo hasMoreElements() poderia ser substituda pela funo hasMoreSolutions().

  • Integrao de Java e Prolog com JPL 8

    Exemplo 4: Cdigo Java que consulta os genitores1 package j a v a p r o l o g ;23 import j a v a . u t i l . H a s h t a b l e ;4 import j p l . ;5 import j p l . V a r i a b l e ;67 p u b l i c c l a s s C o n s u l t a G e n i t o r e s {8 p u b l i c s t a t i c vo id main ( S t r i n g [ ] a r g s ) {9 Query que ry = new Query ( " c o n s u l t " ,

    10 new Term [ ] { new Atom ( " . . / . . / r e c u r s o s / p r o l o g / p a r e n t e s . p l " ) } ) ;1112 t r y {13 query . h a s S o l u t i o n ( ) ;1415 V a r i a b l e X = new V a r i a b l e ( "X" ) ;16 Query c o n s u l t a P e s s o a s = new Query ( " p e s s o a " , new Term [ ] {X} ) ;1718 System . o u t . p r i n t l n ( " L i s t agem de g e n i t o r e s " ) ;19 whi le ( c o n s u l t a P e s s o a s . hasMoreElements ( ) ) {20 H a s h t a b l e t a b e l a = c o n s u l t a P e s s o a s . n e x t S o l u t i o n ( ) ;2122 Term p e s s o a = ( Term ) t a b e l a . g e t (X. name ( ) ) ;2324 V a r i a b l e P a i = new V a r i a b l e ( " P a i " ) ;25 Query c o n s u l t a P a i s = new Query ( " g e n i t o r " ,26 new Term [ ] { Pai , p e s s o a } ) ;2728 i f ( c o n s u l t a P a i s . h a s S o l u t i o n ( ) ) {29 i n t c o n t = 0 ;30 whi le ( c o n s u l t a P a i s . hasMoreElements ( ) ) {31 i f ( c o n t ++ != 0) System . o u t . p r i n t ( " e " ) ;3233 H a s h t a b l e t a b e l a P a i = c o n s u l t a P a i s . n e x t S o l u t i o n ( ) ;3435 System . o u t . p r i n t ( t a b e l a P a i . g e t ( P a i . name ( ) ) ) ;36 }3738 System . o u t . p r i n t ( " so os g e n i t o r e s de " ) ;39 System . o u t . p r i n t l n ( p e s s o a . name ( ) ) ;40 }41 }42 } catch ( P r o l o g E x c e p t i o n pe ) {43 System . o u t . p r i n t l n ( "O a r q u i v o P r o l o g no f o i e n c o n t r a d o . " ) ;4445 pe . p r i n t S t a c k T r a c e ( ) ;46 }47 }48 }

  • Integrao de Java e Prolog com JPL 9

    No Exemplo 4, at a linha 20, a consulta a mesma do Exemplo 2. Na linha 22 ocorrea primeira diferena, pois o nome da pessoa armazenado em um Termo, no de ser escritodiretamente na sada padro.

    Nas linhas 24 a 26 a consulta do genitor formada utilizando uma varvel chamada dePai e o termo pessoa.

    De forma parecida com o lao nas linhas 19 a 41, o lao das linhas 30 a 36 exibe os geni-tores de uma pessoa. Nota-se que o programa s ir exibir as pessoas que possurem genitores,por causa da condio na linha 28.

    O Exemplo 5 apresenta o resultado da execuo do Exemplo 4.

    Exemplo 5: Resultado da execuo do Exemplo 41 Lis t agem de g e n i t o r e s2 j o a o e mar i a so os g e n i t o r e s de s e b a s t i a o3 j o s e e ra imunda so os g e n i t o r e s de v i l a n i4 s e b a s t i a o e v i l a n i so os g e n i t o r e s de r o n n e e r y5 s e b a s t i a o e v i l a n i so os g e n i t o r e s de r o n n e e s l e y 4.3 Integrao com ambiente visual

    Se as pesquisas mostradas nas subsees 4.1 e 4.2 fossem alteradas para retornarem dadosno lugar de imprimi-los na sada padro, seria possvel construir uma interface visual amigvel,assim como apresentada na Figura 4.

    Figura 4: Integrao com ambiente visual Swing do Java

    O Exemplo 6 apresenta o componente que retorna os dados, no lugar de imprimi-los nasada padro.

  • Integrao de Java e Prolog com JPL 10

    Exemplo 6: Componente de dados1 package j a v a p r o l o g . modelo . dao ;23 import j a v a . u t i l . A r r a y L i s t ;4 import j a v a . u t i l . H a s h t a b l e ;5 import j a v a . u t i l . L i s t ;6 import j p l . ;78 p u b l i c c l a s s PessoaDAO {9 / / Arqu ivo com os f a t o s e r e g r a s do Pro log

    10 p u b l i c s t a t i c S t r i n g f o n t e P r o l o g =11 " . . / . . / r e c u r s o s / p r o l o g / p a r e n t e s . p l " ;1213 / 14 L i s t a t o d a s as p e s s o a s15 /16 p u b l i c L i s t l i s t a r ( ) throws E x c e p t i o n {17 / / Cr ia uma l i s t a para armazenar as p e s s o a s18 L i s t l i s t a = new A r r a y L i s t ( ) ;1920 / / Cr ia a c o n s u l t a do c d i go f o n t e21 Query que ry = new Query ( " c o n s u l t " ,22 new Term [ ] { new Atom ( f o n t e P r o l o g ) } ) ;2324 / / V e r i f i c a se o c d i go f o n t e pde s e r a b e r t o25 query . h a s S o l u t i o n ( ) ;2627 / / Cr ia a c o n s u l t a : pe s s oa ( X ) .28 V a r i a b l e X = new V a r i a b l e ( "X" ) ;29 Query c o n s u l t a P e s s o a s = new Query ( " p e s s o a " , new Term [ ] {X} ) ;3031 / / A d i c i o n a as p e s s o a s na l i s t a , enquan to houver s o l u e s32 whi le ( c o n s u l t a P e s s o a s . hasMoreElements ( ) ) {33 H a s h t a b l e t a b e l a = c o n s u l t a P e s s o a s . n e x t S o l u t i o n ( ) ;3435 l i s t a . add ( t a b e l a . g e t (X. name ( ) ) ) ;36 }3738 / / Fecha as c o n s u l t a s a b e r t a s39 query . c l o s e ( ) ;40 c o n s u l t a P e s s o a s . c l o s e ( ) ;4142 / / Re to rna a l i s t a de p e s s o a s43 re turn l i s t a ;44 }4546 / 47 Re torna um l i t e r a l com os nomes dos g e n i t o r e s de uma p es so a48 /49 p u b l i c S t r i n g g e n i t o r e s ( S t r i n g p e s s o a ) {50 / / Cr ia uma v a r i v e l de r e s p o s t a , i n i c i a l m e n t e v a z i a

  • Integrao de Java e Prolog com JPL 11

    51 S t r i n g r e s p o s t a = " " ;5253 Query que ry = new Query ( " c o n s u l t " ,54 new Term [ ] { new Atom ( f o n t e P r o l o g ) } ) ;55 que ry . h a s S o l u t i o n ( ) ;5657 / / Cr ia a c o n s u l t a : g e n i t o r ( X , pe s s oa ) .58 V a r i a b l e X = new V a r i a b l e ( "X" ) ;59 Query c o n s u l t a G e n i t o r e s = new Query ( " g e n i t o r " ,60 new Term [ ] {X, new Atom ( p e s s o a ) } ) ;6162 i n t c o n t = 0 ; / / Contador para s e p a r a r os nomes dos g e n i t o r e s6364 / / Enquanto houver g e n i t o r65 whi le ( c o n s u l t a G e n i t o r e s . hasMoreElements ( ) ) {66 i f ( c o n t ++ != 0) r e s p o s t a += " e " ;6768 H a s h t a b l e t a b e l a = c o n s u l t a G e n i t o r e s . n e x t S o l u t i o n ( ) ;6970 Term termo = ( Term ) t a b e l a . g e t (X. name ( ) ) ;7172 r e s p o s t a += termo . name ( ) ; / / A d i c i o n a o nome do g e n i t o r73 }7475 / / Fecha as c o n s u l t a s76 query . c l o s e ( ) ;77 c o n s u l t a G e n i t o r e s . c l o s e ( ) ;7879 / / Re to rna os nomes dos g e n i t o r e s s e p a r a d o s por e 80 re turn r e s p o s t a ;81 }8283 / 84 Re torna os f i l h o s de uma p es soa85 /86 p u b l i c S t r i n g f i l h o s ( S t r i n g p e s s o a ) {87 S t r i n g r e s p o s t a = " " ;8889 Query que ry = new Query ( " c o n s u l t " ,90 new Term [ ] { new Atom ( f o n t e P r o l o g ) } ) ;91 que ry . h a s S o l u t i o n ( ) ;9293 / / Cr ia a c o n s u l t a : g e n i t o r ( pessoa , X ) .94 V a r i a b l e X = new V a r i a b l e ( "X" ) ;95 Query c o n s u l t a F i l h o s = new Query ( " g e n i t o r " ,96 new Term [ ] { new Atom ( p e s s o a ) , X} ) ;9798 / / A d i c i o n a na r e s p o s t a os f i l h o s99 i n t c o n t = 0 ;

    100 whi le ( c o n s u l t a F i l h o s . hasMoreElements ( ) ) {101 i f ( c o n t ++ != 0) r e s p o s t a += " e " ;

  • Integrao de Java e Prolog com JPL 12

    102103 H a s h t a b l e t a b e l a = c o n s u l t a F i l h o s . n e x t S o l u t i o n ( ) ;104105 Term termo = ( Term ) t a b e l a . g e t (X. name ( ) ) ;106107 r e s p o s t a += termo . name ( ) ;108 }109110 / / Fecha as c o n s u l t a s111 query . c l o s e ( ) ;112 c o n s u l t a F i l h o s . c l o s e ( ) ;113114 / / Re to rna a l i s t a de f i l h o s s e p a r a d o s por e 115 re turn r e s p o s t a ;116 }117 }

    Nota-se que a classe apresentada no Exemplo 6 foi chamada de PessoaDAO devido aopadro de projeto Data Access Object (DAO).

    No entanto, quando se utiliza o Prolog nestas consultas, podem haver regras de inferncia.Estas regras podem ser vistas como um conflito na diviso entre o padro DAO e o padroBusiness Object (BO).

    Mesmo assim, este problema pode ser resolvido atravs da separao clara entre os cdi-gos fontes feitos no Prolog.

    5 Consideraes finaisO uso da API JPL facilita a criao de sistemas inteligentes atravs da integrao de

    programas escritos na linguagem Java e programas escritos em Prolog, na implementao SWI-Prolog.

    A principal vantagem no uso da JPL o aproveitamento total do motor de inferncia doProlog, pois no se trata de um simulador e sim de uma integrao com o motor do Prolog.

    A desvantagem no uso da JPL que ele compromete a portabilidade do software desen-volvido. Mas, a partir desta integrao, pode-se criar um servidor de servios utilizando SOA(Service-oriented architecture) fortemente acoplado ao sistema operacional e um cliente desteservidor totalmente portvel.

    Assim, pode-se concluir que o uso da JPL em programas Java facilita a criao de sistemasinteligentes utilizando todo o poder de inferncia do SWI-Prolog.

    6 AgradecimentoAo Prof. Dr. Plnio de S Leito Jnior pela avaliao do presente texto e pelas sugestes

    feitas, as quais muito contriburam para a melhoria do texto original.

    Referncias[1] BERNERS-LEE, T; CAILLIAU, R. WorldWideWeb: Proposal for a HyperText Project.

    http://www.w3.org/Proposal, 1990.

  • Integrao de Java e Prolog com JPL 13

    [2] BOOCH, G; RUMBAUGH, J; JACOBSON, I. UML Guia do Usurio. Editora Campus,2005.

    [3] BRATKO, I. PROLOG Progamming for Artificial Intelligence. Addison Wesley, 2001.

    [4] FOR STANDARDIZATION, I. O. ISO/IEC 13211: Information technology - Program-ming languages - Prolog. 1995.

    [5] MICROSYSTEMS, I. S. Welcome to NetBeans. http://www.netbeans.org/,ltimo acesso em Dezembro de 2009, 2009.

    [6] SUN MICROSYSTEMS, I. JavaFX Technology At a Glance. http://java.sun.com/javafx/,2009.

    [7] SUN MICROSYSTEMS, I. The Source for Java Developers. http://java.sun.com, 2009.

    [8] SWI-PROLOG. SWI-Prologs home. http://www.swi-prolog.org/, 2009.