Download JavaProlog

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Prolog
Java 
x Prolog
A integração entre dois mundos
Carlos Figueira Filho
[email protected]
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
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 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 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 {
private static Set
fatos = new
HashSet();
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.hasNext(); ) {
Fato f = (Fato)
i.next();
pai(joao,
marcos).
if (f.getPredicateName().equals(“Pai”) &&
mae(sandra, jose).
g.getParam(1).equals(x) {
jose). f.getParam(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[] 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); }
}
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
Arquitetura em 2 camadas (ex.)
InterfaceProlog
Objeto
+ assert(String)
+ checkGoal(String)
+ findAll(String)
Classes Java que
implementam
o motor prolog
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
Arquitetura em 3 camadas (ex.)
InterfaceProlog
Objeto
+ assert(String)
+ checkGoal(String)
+ findAll(String)
Rede ou JNI
Motor prolog
Arquitetura em 3 camadas (ex. 2)
termoProlog :javaMessage(...).
InterfaceJava.pl
javaMessage(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
3-tier
JNI
Desempenho
+
+
+/-
+/-
+/-
Depuração
via IDEs
+
-
+
+/-
+/-
Similaridade
das Regras
+/-
-
+/-
+
+
+
+
+
+/-
+
Time-to-market
+/-
-
+/-
+/-
+
Facilidade
de uso
+/-
+/-
+/-
+
+/-
Robustez
Sistemas existentes
• Kiev

• Prolog Café
• DGKS
•
•
•
•

jProlog
JavaLog
LL
Minerva
• Amzi Logic Server

•
•
•
•
•
B-Prolog
BinProlog
Jasper
JIPL (K-Prolog)
JPL
• InterProlog


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 paiOuMae;
{
pai(nome, paiOuMae),
; pai(nome, paiOuMae),
; mae(nome, paiOuMae),
; mae(nome, paiOuMae),
}
public rule pai(String
oPai.equals(“jose”),
oPai.equals(“joao”),
}
nome, pvar String neto)
pai(paiOuMae,
mae(paiOuMae,
pai(paiOuMae,
mae(paiOuMae,
neto)
neto)
neto)
neto)
oPai, String oFilho) {
oFilho.equals(“joao”) ;
oFilho.equals(“marcos”) ...
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 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
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());
}
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 ?
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/
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
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’()).
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!’))).
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)+”)”);
}
});
}
InterProlog - Arquitetura
Aplicações
Java
Programa
Prolog
Classes
InterProlog
Predicados
InterProlog
JVM
Redirecionam. I/O
sockets
Executável
Prolog
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());
}
)
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)).
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).
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)).
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 + “)”));
}
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);
}
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’()).
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
– 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/
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/
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