Java Prolog Java x Prolog A integrao entre

  • Slides: 37
Download presentation
Java Prolog Java x Prolog A integração entre dois mundos Carlos Figueira Filho csff@di.

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

Conteúdo • Motivação • Arquiteturas • Sistemas Existentes – Java com Prolog – Prolog com Java – Java com Prolog com Java com. . . • Exemplo - Inter. Prolog • Conclusões • Referências

Motivação • Utilização do mecanismo de busca e inferência de prolog em programas Java

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

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

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 {

Arquitetura em 1 camada (ex. ) Programa Java (Familia. java) public class Familia { private static Set fatos = new Hash. Set(); 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. has. Next(); ) { Fato f = (Fato) i. next(); pai(joao, marcos). if (f. get. Predicate. Name(). equals(“Pai”) && mae(sandra, jose). g. get. Param(1). equals(x) { jose). f. get. Param(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[] str. Array =

Arquitetura em 1 camada (ex. 2) Exemplo de regra Kiev String[] str. Array = {“one”, “two”, “three”}; public static rule check(pvar String s) { s ? = “hello” ; s @= str. Array } 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

Arquitetura em 2 camadas • Biblioteca de classes Java que implementam a funcionalidade do motor de prolog • Emulação do motor prolog em Java • Exemplos – j. Prolog, Java. Log, LL

Arquitetura em 2 camadas (ex. ) Interface. Prolog Objeto + assert(String) + check. Goal(String)

Arquitetura em 2 camadas (ex. ) Interface. Prolog Objeto + assert(String) + check. Goal(String) + find. All(String) Classes Java que implementam o motor prolog

Arquitetura em 3 camadas • Biblioteca de classes Java servem como ponte para algum

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. : Inter. Prolog – Ponte Java para algum sistema integrado de alguma linguagem (geralmente C) com prolog. • Interface com diversas outras linguagens. • Exs. : Amzi Logic Server, Bin. Prolog

Arquitetura em 3 camadas (ex. ) Interface. Prolog Objeto + assert(String) + check. Goal(String)

Arquitetura em 3 camadas (ex. ) Interface. Prolog Objeto + assert(String) + check. Goal(String) + find. All(String) Rede ou JNI Motor prolog

Arquitetura em 3 camadas (ex. 2) termo. Prolog : java. Message(. . . ).

Arquitetura em 3 camadas (ex. 2) termo. Prolog : java. Message(. . . ). Interface. Java. pl java. Message(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

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 • • j. Prolog Java.

Sistemas existentes • Kiev • Prolog Café • DGKS • • j. Prolog Java. Log LL Minerva • Amzi Logic Server • • • B-Prolog Bin. Prolog Jasper JIPL (K-Prolog) JPL • Inter. Prolog

Kiev • Extensão da linguagem Pizza, que por sua vez é uma extensão de

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 pai. Ou. Mae; {

Kiev - exemplo • Exemplo public rule avo(String pvar String pai. Ou. Mae; { pai(nome, pai. Ou. Mae), ; mae(nome, pai. Ou. Mae), } public rule pai(String o. Pai. equals(“jose”), o. Pai. equals(“joao”), } nome, pvar String neto) pai(pai. Ou. Mae, mae(pai. Ou. Mae, neto) o. Pai, String o. Filho) { o. Filho. equals(“joao”) ; o. Filho. equals(“marcos”). . .

Kiev - exemplo (cont. ) • Exemplo (cont. ) public static void main(String[] args)

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

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/Technical. Group/sicstus_12. html

Jasper (exemplo 1) • Exemplo SICStus sp = new SICStus(new String[], null); sp. load(“familia.

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). put. Variable(); SPQuery query = new Query(pred, new SPTerm[] {maria, netos}); while (query. next. Solution()) { System. out. println(way. to. String()); }

Jasper (exemplo 2) • Em Java: public class Teste { public static int strlen(String

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. pl ? - compile(strlen). ? - strlen(‘Hello, world’, L). L = 11 ?

Inter. Prolog • Sistema 3 -tier que integra Java e Prolog via comunicação Runtime

Inter. Prolog • 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/

Inter. Prolog - Prolog Java • Predicado java. Message usado para enviar mensagens a

Inter. Prolog - Prolog Java • Predicado java. Message usado para enviar mensagens a objetos Java • 3 sabores: – java. Message(Objeto, Mensagem) – java. Message(Objeto, Resultado, Excecao, Mensagem, Argumentos. Depois) • Objetos referenciados por identificadores

Inter. Prolog - Prolog Java (cont). • Exemplo: java. Message(‘java. util. Date’, Hoje, ‘Date’),

Inter. Prolog - Prolog Java (cont). • Exemplo: java. Message(‘java. util. Date’, Hoje, ‘Date’), java. Message(‘System’ -out, println(Hoje)). java. Message(‘java. awt. Frame’, Frame, ‘Frame’(string(‘Frame Teste’))), java. Message(‘java. awt. Button, Botao, ‘Button’(string(‘Press me’))), java. Message(Frame, ‘add’(Botao)), java. Message(Frame, ‘set. Size’(100, 200)), java. Message(Frame, ‘show’()).

Inter. Prolog - Java Prolog • Classe Prolog. Engine – – register. Java. Object(Object)

Inter. Prolog - Java Prolog • Classe Prolog. Engine – – register. Java. Object(Object) add. Prolog. Output. Listener(Prolog. Output. Listener) deterministic. Goal(String) send. And. Flush(String) • Exemplo (lado de Prolog): diz. Alo. Em(Text. ID) : - java. Message(Text. ID, set. Text(string(‘Hello, world!’))).

Inter. Prolog - Java Prolog (cont) • Exemplo (lado de Java): public static void

Inter. Prolog - Java Prolog (cont) • Exemplo (lado de Java): public static void main(String[] args) { Frame f = new Frame(“Teste Inter. Prolog”); final Text. Field tf = new Text. Field(15); Button bt = new Button(“Alo!”); Prolog. Engine motor = new Prolog. Engine(. . . ); . . . bt. add. Action. Listener(new Action. Listener() { public void action. Performed(Action. Event e) { motor. deterministic. Goal(“diz. Alo. Em(“+ motor. register. Java. Object(tf)+”)”); } }); }

Inter. Prolog - Arquitetura Aplicações Java Programa Prolog Classes Inter. Prolog Predicados Inter. Prolog

Inter. Prolog - Arquitetura Aplicações Java Programa Prolog Classes Inter. Prolog Predicados Inter. Prolog JVM Redirecionam. I/O sockets Executável Prolog

Java / Prolog - Exemplo (Relembrando Civilization. . . • Já sei me defender.

Java / Prolog - Exemplo (Relembrando Civilization. . . • Já sei me defender. . . quero agora ampliar meus domínios. . . rule ataca. Cidade { // Se eu estiver perto de uma cidade inimiga, declarations // devo atacá-la!!! Jogador eu; Cidade cid; Unid. Combate meu. Exerc; preconditions eu. get. Nome(). equals(“Carlos”); cid. get. Dono() != eu; meu. Exerc. get. Dono() == eu; meu. Exerc. get. Ataque() >= 3; // Não vou atacar com qualquer um cid. get. Local(). dist(meu. Exerc. get. Local()) <= meu. Exerc. get. Movim(); !eu. em. Paz(cid. get. Dono()); actions meu. Exerc. ataca(cid. get. Local()); } )

Java / Prolog - Exemplo (cont. ) • acao(Jogador) : acao. ATomar(Jogador, _, _,

Java / Prolog - Exemplo (cont. ) • acao(Jogador) : acao. ATomar(Jogador, _, _, _). • acao. ATomar(Exerc, Loc, Cid, Exerc. Inim) : atacar(Exerc, Loc), java. Message(Exerc, ‘ataca’(Loc)). • acao. ATomar(Exerc, Loc, Cid, Exerc. Inim) : defender. Atacar(Exercito, Cid, Exerc. Inim), local(Cid, Loc), java. Message(Exercito, ‘ataca’(Loc)).

Java / Prolog - Exemplo (cont. ) • atacar(Exercito, Loc. Cidade) : dono(Exercito, Jogador),

Java / Prolog - Exemplo (cont. ) • atacar(Exercito, Loc. Cidade) : dono(Exercito, Jogador), Nome(Jogador, ‘Carlos’), local(Cidade, Loc. Cidade), dono(Cidade, Jogador 2), diferente(Jogador, Jogador 2), forca. Ataque(Exercito, Forca), maior. Ou. Igual(Forca, 3), em. Guerra(Jogador, Jogador 2), local(Exercito, Loc. Exercito), distancia(Loc. Cidade, Loc. Exercito, Dist. Ex. Cid), movimento(Exercito, Mov. Exercito), maior. Ou. Igual(Mov. Exercito, Dist. Ex. Cid).

Java / Prolog - Exemplo (cont. ) • dono(Exercito, Jogador) : java. Message(Exercito, Jogador,

Java / Prolog - Exemplo (cont. ) • dono(Exercito, Jogador) : java. Message(Exercito, Jogador, get. Dono()). • nome(Jogador, Nome) : java. Message(Jogador, Nome, get. Nome()). • forca. Ataque(Exercito, Forca) : java. Message(Exercito, Forca, get. Ataque()). • em. Guerra(Jogador 1, Jogador 2) : java. Message(Jogador 1, yes, em. Paz. Com(Jogador 2)). • • local(Objeto, Local) : java. Message(Objeto, Local, get. Local()). • distancia(Local 1, Local 2, Dist) : java. Message(Local 1, Dist, dist(Local 2)).

Java / Prolog - Exemplo (cont. ) • E o lado Java. . .

Java / Prolog - Exemplo (cont. ) • E o lado Java. . . public static void main(String[] args) { Prolog. Engine pe = new Prolog. Engine(); Jogador eu = new Jogador(“Carlos”, “Brasil”); int eu. Id = pe. register. Java. Object(eu); pe. register. Java. Object(new Settler(eu, Localizacao. get. Random())); . . . while (pe. deterministic. Goal(“acao. ATomar(”+ eu. Id + “)”)); }

Java / Prolog - Exemplo 2 • Ou ainda eu posso criar uma nova

Java / Prolog - Exemplo 2 • Ou ainda eu posso criar uma nova cidade. . . rule cria. Cidade { declarations Jogador eu; Settler meu. Exerc; preconditions eu. get. Nome(). equals(“Carlos”); meu. Exerc. get. Dono() == eu; meu. Exerc. get. Local(). ha. Oceano. Por. Perto(); meu. Exerc. get. Local(). ha. Comida. Por. Perto(); !meu. Exerc. get. Local(). ha. Cidade. Por. Perto(); actions Cidade nova = new Cidade(eu); retract(meu. Exerc); assert(nova); }

Java / Prolog - Exemplo 2 cria. Cidade(Settler) : dono(Settler, Jogador), nome(Jogador, “Carlos”), local(Settler,

Java / Prolog - Exemplo 2 cria. Cidade(Settler) : dono(Settler, Jogador), nome(Jogador, “Carlos”), local(Settler, Local), java. Message(Local, yes, ‘ha. Oceano. Por. Perto’()), java. Message(Local, yes, ‘ha. Comida. Por. Perto’()), java. Message(Local, no, ‘ha. Cidade. Por. Perto’()), java. Message(Settler, Classe, ‘get. Class()’). , java. Message(Classe, string(‘Settler’), ‘get. Name’()).

Conclusões • Comparação com EOOPS – Uniformidade • Duas linguagens • Uma linguages –

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 –

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. html • Bin. Prolog (e JINNI) – http: //www. binnetcorp. com/Bin. Prolog/interface. html • DGKS – http: //www. geocities. com/Silicon. Valley/Campus/7816/ • Inter. Prolog – http: //dev. servisoft. pt/interprolog/

Referências • Jasper – http: //cswww. essex. ac. uk/Technical. Group/sicstus_12. html • Java. Log

Referências • Jasper – http: //cswww. essex. ac. uk/Technical. Group/sicstus_12. html • Java. Log – http: //www. exa. unicen. edu. ar/~azunino/javalog. html • JPL – http: //blackcat. syr. edu/~fadushin/software/jpl/ • j. Prolog – http: //www. cs. kuleuven. ac. be/~bmd/Prolog. In. Java/ • Kiev – http: //www. forestro. com/kiev/

Referências • K-Prolog – http: //prolog. isac. co. jp/doc/en/jipl. html • LL – http:

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/Prolog. Cafe/index. html