Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho [email protected].

37
Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho [email protected]

Transcript of Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho [email protected].

Page 1: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

Java PrologJava x Prolog

A integração entre dois mundos

Carlos Figueira Filho

[email protected]

Page 2: 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

Page 3: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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

Page 4: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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

Page 5: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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

Page 6: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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.)

Page 7: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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); }

}

Page 8: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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

Page 9: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

Arquitetura em 2 camadas (ex.)

Objeto + assert(String)+ checkGoal(String)+ findAll(String)

InterfaceProlog

Classes Java queimplementamo motor prolog

Page 10: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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

Page 11: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

Arquitetura em 3 camadas (ex.)

Objeto + assert(String)+ checkGoal(String)+ findAll(String)

InterfaceProlog

Motor prolog

Rede ou JNI

Page 12: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

Arquitetura em 3 camadas (ex. 2)

javaMessage(T,R,E,M,A,RA,N) :- socket_get(S,T,...), socket_put(S,T,M,...)...

InterfaceJava.pl

Objetos Java

Rede ou JNI

termoProlog :- javaMessage(...).

Page 13: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

Arquiteturas - comparação

Desempenho

Depuraçãovia IDEs

Similaridadedas Regras

1-tiertradução

1-tierextensão

2-tier 3-tiersockets

3-tierJNI

Robustez

+ + +/- +/- +/-

+ - + +/- +/-

+/- - +/- + +

+ + + +/- +

Time-to-market +/- - +/- +/- +

Facilidadede uso +/- +/- +/- + +/-

Page 14: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

Sistemas existentes

• Kiev

• Prolog Café

• DGKS • jProlog• JavaLog• LL• Minerva

• Amzi Logic Server

• B-Prolog• BinProlog• Jasper• JIPL (K-Prolog)• JPL

• InterProlog

Page 15: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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/

Page 16: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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”) ...

}

Page 17: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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);

}

}

Page 18: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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

Page 19: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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());

}

Page 20: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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 ?

Page 21: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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/

Page 22: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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

Page 23: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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’()).

Page 24: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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!’))).

Page 25: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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)+”)”);

}

});

}

Page 26: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

InterProlog - Arquitetura

AplicaçõesJava

ProgramaProlog

ClassesInterProlog

JVM

PredicadosInterProlog

ExecutávelPrologsockets

Redirecionam. I/O

Page 27: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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());}

)

Page 28: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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)).

Page 29: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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).

Page 30: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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)).

• local(Objeto, Local) :-

javaMessage(Objeto, Local, getLocal()).

Page 31: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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 + “)”)); }

Page 32: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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); }

Page 33: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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’()).

Page 34: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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

Page 35: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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/

Page 36: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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/

Page 37: Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.ufpe.br.

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