Você está na página 1de 47

Fundamentos de Prolog: uma breve

introduo programao em lgica


Jacques Robin, DI-UFPE
jr@di.ufpe.br, www.di.ufpe.br/~jr
O que Prolog?
Primeiro e mais usado linguagem do paradigma da
Programao em Lgica (PL)
Operacionalizao simples, prtica e eficiente da
PL
PL unifica:
Engenharia de Software (especificao formal, linguagens
de programao)
IA (raciocino e Representao do Conhecimento (RC))
Banco de Dados -- Dedutivos (BDDs)
Teoria Lgica (TL) das provas
Metfora da programao em lgica
Teoria Lgica = Programa = BD dedutivo = BC
Programar = apenas declarar axiomas e regras
Axiomas da TL:
fatos da BC
parte extensional do BDD
dados explcitos de um BD tradicional
Regras da TL (e da BC):
parte intencional do BDD
Teoremas da TL:
deduzidos a partir dos axiomas e das regras
dados implcitos do BDD
Linguagens de PL
Interpretadas (interatividade) e compiladas
(eficincia)
Interpretadores-Compiladores (IC) de PL:
SGBD dedutivos (em geral em memria central)
Motores de inferncia
Provadores de teoremas para lgicas com grande interseo com
a Lgica da 1a ordem (L1)
Interao:
Declarar o que verdadeiro (axiomas e regras do PL/BDD)
Chamar o IC e carregar o PL/BDD
Perguntar o que verdadeiro (tentar provar teoremas =
executar o PL = consultar o BDD)
PL x resto do mundo
PL x programao imperativa, funcional e 00:
mais declarativa, mais alto-nvel
mais verstil -- linguagem nica para:
especificar formalmente e implementar
programar aplicaes, scripts e consultas em BD
PL x outros formalismos de RC:
melhor fundamentao terica
melhor integrao com o resto da cincia computao
PL = base interessante para integrao de
paradigmas
PL = caso particular de programao por restries
Clusulas de Horn
Formulas de L1:
em forma normal implicativa (todas as variveis
implicitamente universalmente quantificadas)
com premissas todas positivas
e uma concluso nica e positiva.
Padro: P1 & ... & Pn => C
Muitas mas nem todas as formulas de L1 tem
conjunto equivalente de clusulas de Horn, cex:
V X,Y animal_lover(X) & animal(Y) & kills(X,Y) => F
Programa Prolog = conjunto (implicitamente
conjuntivo) de clusulas de Horn
Programa Prolog e clusulas de Horn
Fatos Prolog:
clusulas de Horn com premissa nica T implcita
ex: C. <=> T => C
Regras Prolog:
outras clusulas de Horn
ex: C :- P1, ... ,Pn. <=> P1 & ... & Pn => C
Premissas de clusulas com a mesma concluso so
implicitamente disjuntivas:
ex: {C :- P1, ... ,Pn., C :- Q1, ... ,Qm}
<=> (P1& ... & Pn) v (Q1 & ... & Qm) => C
Escopo das variveis = uma clusula
Interpretador Prolog: controle e busca
Aplica regra de resoluo:
com estratgia linear (sempre tenta unificar ultimo fato a
provar com a concluso de uma clusula do programa),
na ordem de escritura das clusulas no programa,
com encadeamento de regras para trs,
busca em profundidade e
da esquerda para direita das premissas das clusulas,
e com backtracking sistemtico e linear quando a
unificao falha,
e sem occur-check na unificao.
Estratgia eficiente mas incompleta.
Verificao de ocorrncia
Ao contrario da unificao da resoluo:
unificao de Prolog sem occur-check,
quando chamado com uma varivel X e um literal l,
instncia X com l, sem verificar antes se X ocorre em l.
Junto com a busca em profundidade:
faz que Prolog pode entrar em loop com regras recursivas,
ex: c(X) :- c(p(X)). gera lista infinita de objetivos:
c(p(U)), c(p(p(U))), c(p(p(p(U)))), ...
cabe ao programador de no escrever tais regras,
torna a unificao linear no lugar de quadrtica
no tamanho dos termos a unificar
West criminoso? em L1
V P,W,N american(P) &
weapon(W) & nation(N) &
hostile(N) & sells(P,N,W) =>
criminal(P)
E W owns(nono,W) & missile(W)
V W owns(nono,W) & missile(W)
=> sells(west,nono,W)
V X missile(W) => weapon(W)
V X enemy(N,america) =>
hostile(N)
american(west)
nation(nono)
enemy(nono,america)
nation(america)
american(P) & weapon(W) &
nation(N) & hostile(N) &
sells(P,N,W) => criminal(P)
owns(nono,m1)
missile(m1)
owns(nono,W) & missile(W) =>
sells(west,nono,W)
missile(W) => weapon(W)
enemy(N,america) => hostile(N)
american(west)
nation(nono)
enemy(nono,america)
nation(america)
West criminoso? em Prolog
american(P) & weapon(W) &
nation(N) & hostile(N) &
sells(P,N,W) => criminal(P)
owns(nono,m1)
missile(m1)
owns(nono,W) & missile(W) =>
sells(west,nono,W)
missile(W) => weapon(W)
enemy(N,america) => hostile(N)
american(west)
nation(nono)
enemy(nono,america)
nation(america)
criminal(P) :- american(P),
weapon(W), nation(N),
hostile(N), sells(P,N,W).
owns(nono,m1).
missile(m1).
sells(west,nono,W) :-
owns(nono,W), missile(W).
weapon(W) :- missile(W).
hostile(N) :- enemy(N,america).
american(west).
nation(nono).
enemy(nono,america).
nation(america).
West criminoso? busca
criminal(P) :- american(P),
weapon(W), nation(N),
hostile(N), sells(P,N,W).
owns(nono,m1).
missile(m1).
sells(west,nono,W) :-
owns(nono,W), missile(W).
weapon(W) :- missile(W).
hostile(N) :- enemy(N,america).
american(west).
nation(nono).
enemy(nono,america).
nation(america).
criminal(west)? <- yes.
american(west)? -> yes.
weapon(W)? <- W = m1.
missile(W)? -> W = m1.
nation(N)? -> N = nono.
hostile(nono)? <- yes.
enemy(nono,america)? -> yes.
sells(west,nono,m1)? <- yes.
owns(nono,m1)? -> yes.
missile(m1)? -> yes.
Ordem influencia a eficincia
criminal(P) :- american(P),
weapon(W), nation(N),
hostile(N), sells(P,N,W).
owns(nono,m1).
missile(m1).
sells(west,nono,W) :-
owns(nono,W), missile(W).
weapon(W) :- missile(W).
hostile(N) :- enemy(N,america).
american(west).
nation(america).
enemy(nono,america).
nation(nono).
criminal(west)? <- yes.
american(west)? -> yes.
weapon(W)? <- W = m1.
missile(W)? -> W = m1.
nation(N)? -> N = america.
hostile(america)? <- no.
enemy(america,america)? -> no.
backtrack: nation(N),
N \ {america}? -> N = nono.
hostile(nono)? <- yes.
enemy(nono,america)? -> yes.
sells(west,nono,m1)? <- yes.
owns(nono,m1)? -> yes.
missile(nono,m1)? -> yes.
Prolog devolve a primeira resposta
g1(a).
g21(a).
g3(a).
g4(a).
g1(b).
g21(b).
g22(b).
g3(b).
g(X) :- g1(X), g2(X).
g1(X) :- g3(X), g4(X).
g2(X) :- g21(X), g22(X).
$ prolog
?- consult(g.pl).
yes
?- g(U).
U = b
?- ;
U = a
?- ;
no
?- halt.
$


Forar o backtracking para obter todas
as respostas
g1(a).
g21(a).
g3(a).
g4(a).
g1(b).
g21(b).
g22(b).
g3(b).
g(X) :- g1(X), g2(X).
g(X) :- g3(X), g4(X).
g2(X) :- g21(X), g22(X).
g(U)? <- U = b.
g1(U)? -> U = a.
g2(a)? <- no.
g21(a)? -> yes.
g22(a)? -> no.
g1(U), U \ {a}? -> U = b.
g2(b)? <- yes.
g21(b)? -> yes.
g22(b)? -> yes.
;
g1(U), U \ {a,b} ? -> no.
Backtracking em cascadas
g1(a).
g21(a).
g3(a).
g4(a).
g1(b).
g21(b).
g22(b).
g3(b).
g(X) :- g1(X), g2(X).
g(X) :- g3(X), g4(X).
g2(X) :- g21(X), g22(X).
g(U), g \ {g1,g2}? <- U = a.
g3(U)? -> U = a.
g4(a)? -> yes.
;
g3(U), U \ {a}? -> U = b.
g4(b)? -> no.
g3(U), U \ {a,b}? -> no.
g(U), g \ {g1,g2 ; g3,g4}? -> no.
Sintaxe 1
fato -> fa. (abrev. para Formula Atmica)
regra -> fa0 :- fa1, ... , faN.
consulta -> fa1, ... , faN.
fa -> pred(termo1, ... , termoN) | preop termo1
termo2
| termo1 inop termo2 | termo1 termo2
postop
termo -> constante | varivel | fa
constante -> tomos | numeros
pred -> tomo
Ao invs de L1: nenhuma distino entre
predicados e funes
Sintaxe 2
varivel ex: G, Glr, geber-ramalho, 1geber, _glr, _
tomo ex: g, glr, =>, geber_ramalho, geber1, geber
ramalho
nmero ex: 23
termos, fatos, regras e consultas sem variveis:
instanciadas (ground)
termos, fatos e regras com variveis: universais
consultas com variveis: existenciais
Predicados built-in
op de unificao = e lista .
teste e converso de tipos: atom, integer, real, var,
name, list, etc.
controle de busca: !, fail, true, repeat
negao por falha: not
op aritmticos: is, +, -, *, /, mod, =:=, >, <, etc.
entrada/sada: read, write, nl, consult, reconsult, etc.
inspeo de cdigo: functor, arg, =.., listing, clause
meta-programao: assert, retract, call
manipulao de conjuntos: bagof, setof
Semntica
Programa Prolog P possui 2 semnticas:
semntica declarativa =
semntica das formulas de L1 correspondendo as
clusulas de P
em geral:
conjunto mnimo de termos instanciados verificando P
extenso de P como BDD
modelo de Herbrand
semntica procedimental =
execuo do algoritmo de resoluo sobre P
Maioria dos predicados built-in:
funcionam por efeitos colaterais
no possuem semntica declarativa em L1
Listas
[ e ]: incio e fim de lista
, separao entre eltos
|: separao entre 1o elto e resto da lista
?- [a,b,X,p(Y,C)] = [Head|Tail]
Head = a, Tail = [b,X,p(Y,C)]
?- [[p(X),[a]],q([b,c])] = [[H|T1]|T2]
H = p(X), T1 = [[a]], T2 = [q([b,c])]
member(X,[X|_]).
member(X,[Y|Z]) :- member(X,Z).
?- member(b,[a,b,c]) -> yes.
?- member(X,[a,b,c]) -> X = a ; X = b ; X = c ; no.
Igualdade x unificao
Ao invs de L1, Prolog no inclui operador de
igualdade semntica.
= operador de unificao sinttica:
no declara nada, apenas teste se 2 termos podem se
tornar igual por unificao das suas variveis
falha com termos ground sintaticamente diferentes
== operador de igualdade sinttica:
tambm apenas teste igualdade de 2 termos, sem tentar
unificar as suas variveis
falha com termos sintaticamente diferentes, mesmo
universais
Igualdade x unificao: exemplos
?- geber = senior -> no.
?- prof(X,disc(Y,dept(di,ufpe))) = prof(geber,disc(ia,Z)).
-> X = geber, Y = ia, Z = dept(di,ufpe).
?- prof(X,disc(Y,dept(di,ufpe))) == prof(geber,disc(ia,Z). -> no.
?- prof(X,disc(Y,dept(di,ufpe))) == prof(U,disc(V,dept(di,ufpe))). -> no.
?- prof(X,disc(Y,dept(di,ufpe))) == prof(X,disc(Y,dept(di,ufpe))). -> yes.
prof(ia,di,ufpe,geber).
musico(senior).
?- geber = senior, prof(X,ia,di,ufpe), musico(X). -> no.
e no: X = geber = senior.
prof(ia,di,ufpe,pessoa(geber,_).
musico(pessoa(_,senior)).
pessoa(geber, senior).
?- prof(X,ia,di,ufpe), musico(X). -> X = pessoa(geber,senior).
Evitar backtracking intil: ! (o cut)
op built-in de pruning, logicalmente sempre
verificado
com efeito colateral de impedir backtracking:
na sua esquerda na clusula que ocorre
em outras clusulas com a mesma concluso
ex: A :- B, C, D.
C :- M, N, !, P, Q.
C :- R.
impede backtracking P -> N
permite backtracking N -> M, Q -> P,
D -> (R xor Q), (P xor R) -> B
R tentado:
unicamente se M ou N falha
nunca se P ou Q falha
Cut: exemplo
f1(X,0) :- X < 3.
f1(X,2) :- 3 =< X, X < 6.
f1(X,4) :- 6 =< X.

f1(1,Y), 2 < Y? <- no
f1(1,Y)? -> X = 1, Y = 0
1 < 3? -> yes
2 < 0? -> no
f1(1,Y)? -> X = 1, Y = 2
3 =< 1? -> no
f1(1,Y)? -> X = 1, Y = 4
6 =< 1? -> no
f2(X,0) :- X < 3, !.
f2(X,2) :- 3 =< X, < 6, !.
f2(X,4) :- 6 <= X, !.

f2(1,Y), 2 < Y? <- no
f2(1,Y)? -> X = 1, Y = 0
1 < 3? -> yes
2 < 0? -> no
Cut: exemplo (cont.)
f3(X,0) :- X < 3, !.
f3(X,2) :- X < 6, !.
f3(X,4).
?- f3(1,Y).
Y = 0
?- ;
no.
?-
Esses cuts modificam at a
semntica declarativa do
programa
f4(X,0) :- X < 3.
f4(X,2) :- X < 6.
f4(X,4).
?- f4(1,Y).
Y = 0
?- ;
Y = 2.
?-


Hiptese do mundo fechado
Ao invs de L1, Prolog no permite nem fatos, nem
concluses de regras negativos, cex:
~animal_lover(geber).
~kill(X,Y) :- animal_lover(X), animal(Y).
Princpio de economia:
declarar e deduzir apenas o que verdadeiro,
supor que tudo que no mencionado nem deduzvel
falso (hiptese do mundo fechado)
Operador de negao por falha em premissas:
not p(X) verificado sse p(X) falha
=/= de ~p(X) verificado sse ~p(X) no BDE ou na concluso
de uma regra com premissas verificadas
Negao por Falha (NF) 1
Permite raciocnio no montono, ex:
ave(piupiu).
road_runner(bipbip).
ave(X) :- road_runner(X).
voa1(X) :- ave(X), not road_runner(X).
voa1(X)? -> X = piupiu ; no.
Sem semntica declarativa em L1
Depende da ordem, ex:
voa2(X) :- not road_runner(X), ave(X).
voa2(X)? -> no.
Negao por Falha 2
NF pode ser implementado apenas com ! e fail, ex:
voa3(X) :- road_runner(X), !, fail.
voa3(X) :- ave(X).
no(X) :- X, !, fail ; true.
NF torna resoluo de Prolog (Select Depth-1st
Linearly w/ Negation as Failure (SDLNF))
inconsistente
ex: edge(a,b).
sink(X) :- not edge(X,Y).
sink(a)? -> no.
sink(b)? -> yes.
sink(X)? -> no.
Prolog x sistemas de produo: controle
Raciocino dirigido pelo objetivo (e no pelos dados)
Regras encadeada para trs (e no para frente)
Busca em de cima para baixo e em profundidade na
rvore de prova (e no de baixo para cima e em
largura)
Sempre dispara 1a regra aplicvel encontrada (ie,
sem resoluo de conflitos)
Backtracking quando 1a regra leva a uma falha
Prolog x sistemas de produo:
poder expressivo
Fatos universais (e no apenas instanciados):
ex: ancestral(X,ado).
Unificao (e no apenas matching):
bidirecional
variveis lgicas podem ser instanciadas com termos
compostos (e no apenas atmicos)
ex: ?- prof(X,disc(ia,dept(di,ufpe)))
= prof(pessoa(geber,Y),disc(ia,Z))
-> X = pessoa(geber,Y), Z = dept(di,ufpe).

Prolog x resoluo em L1
Restries de Prolog com respeito a L1:
apenas clusulas de Horn
sem igualdade semntica
unificao sem verificao de ocorrncia
Extenses de Prolog com respeito a L1:
predicados (e no apenas funes) como construtores de
termos
predicados built-in de segunda ordem
Outras diferencias com respeito a L1:
negao por falha (limitada mas no montona)
Outras linguagens de PL
PL com semntica declarativa estendida:
negao explcita
concluses disjuntivas
igualdade semntica (Eqlog)
PL com semntica procedimental estendida:
backtracking inteligente
controle de busca por meta-regras (MRS, Metalog)
PL para SGBD dedutivo (Datalog):
encadeamento para frente
busca em aprofundamento iterativo
otimizao de acesso memria segundaria
resoluo completa e correta
Prolog x programao imperativa 1
Interativo:
compilao transparente integrada na interpretao
rodar programa = consultar um BD
Gerenciamento automtico da memria
Mecanismo nico de manipulao de dados --
unificao de termos lgicos -- implementando:
atribuio de valor
passagem de parmetros
alocao de estruturas
leitura e escritura em campos de estruturas
Prolog x programao imperativa 2
Estrutura de dados nica: termo Prolog
variveis lgicas sem tipo esttico
Controle implcito built-in na estrategia de
resoluo, ex: Em programao imperativa
procedure c(E)
const e0:tipoE0;
var E:tipoE, S0:tipoS0, l1:tipo-I1, S1:tipoS1;
do if E = e0 then do S0 := call p0(e0); return S0; end;
else do I1 := call p1(E); S1 := call p2(E,l1); return S1; end;
end;
Em Prolog
c(e0,S0) :- p0(e0,S0).
c(E,S1) :- p1(E,I1), p2(E,I1,S1).
Prolog x programao funcional 1
Matematicamente, predicado = relao:
no-determinismo:
respostas mltiplas (disponveis por backtracking),
unificao e busca built-in,
livra o programador da implementao do controle;
bi-direcionalidade:
cada argumento pode ser entrada ou sada, dependendo
do contexto de chamada,
nica definio para usos diferentes: verificador,
instanciador, resolvedor de restries, enumerador.
integrao imediata com BD relacional
Prolog x programao funcional 2
Append em Lisp:
(defun append(L1,L2)
(cond ((null L1) L2))
(T (cons (first L1) (append (rest L1) L2))))))
?- append([a,b],[c,d])
[a,b,c,d]
Append em Prolog:
append([],L,L).
append([H|T1],L,[H|T2]) :- append(T1,L,T2).
?- append([a,b],[c,d],R).
R = [a,b,c,d].
Append relacional codifica 8 funes
Vrios usos do mesmo predicado
verificador:
?- append([a,b],[c],[a,b,c]). -> yes.
?- append([a,b],[c],[a]). -> no.
instanciador:
?- append([a,b],[c],R). -> R = [a,b,c].
?- append(H,[c],[a,b,c]). -> H = [a,b].
resolvedor de restries:
?- append(X,Y,[a,b,c]). -> X = [], Y = [a,b,c]
; -> X = [a], Y = [b,c] ...
enumerador:
?- append(X,Y,Z). -> X = [], Y =[], Z = []
; -> X = [_], Y = [], Z = [_] ...
Prolog x programao OO
Funcionalidades built-in:
+ unificao e busca
- tipos, herna e encapsulao
Ontologicalmente:
Entidade Atmica (EA): em OO, valor de tipo built-in
em Prolog, tomo (argumento ou predicado)
Entidade Composta (EC): em OO, objeto
em Prolog, fato
Relao simples entre EC e EA: em OO, atributo de tipo built-in
em Prolog, posio em um predicado
Relao simples entre ECs: em OO, atributo de tipo objeto
em Prolog, predicado
Relao complexa entre entidades: em OO, mtodo
em Prolog, conjunto de regras
Prolog x programao OO: exemplo
Em OO:
pt[subclass_of planobj;
attrs[X inst_of int, Y inst_of int];
mets[right(Pt inst_of pt) {return self.X >= Pt.X}]]
pt1[inst_of pt; attrs[X = 0, Y = 0]]
pt2[inst_of pt; attrs[X = 1, Y =1]]
?- pt1.above(pt2) -> no.
Em Prolog:
pt(0,0).
pt(1,1).
planobj(pt(_,_)).
right(pt(X1,_),pt(X2,_) :- X1 >= X2.
?- above(pt(0,0),pt(1,1)). -> no.
Programao por restries
Programar = declarar restries sobre os valores
v1, ... vn, de um conjunto de variveis V1, ..., Vn:
o dominio Di associado a cada varivel Vi
equaes e inequaes Pj(Vp, ..., Vq) ligando-as
Executar programa:
fazer uma consulta sobre a compatibilidade de restries
de entrada Pk(Vr, ..., Vs) com as restries do programa
recuperar em sada todos os valores (v11, ... , vn1) ... (v1l,
..., vnl) de (V1, ... , Vn) que satisfazem ambos
Pj(Vp, ... , Vq) e Pk(Vr, ..., Vs).
Programao por restries: exemplo
integer(N).
integer(S).
sumto(0,0).
sumto(N,S) :- 1 =< N, N =< S, sumto(N - 1, S - N).
?- S =< 3, sumto(N,S).
(N = 0, S = 0), (N = 1, S = 1), (N = 2, S = 3).
Propagao recursiva de restries:
1: 1 =< N1 = N =< S1 = S =< 3
(N1,S1) in {(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)}
2: 1 =< N2 = N1 - 1 =< S2 = S1 - N1 =< 2
(N2,S2) in {(1,1),(1,2),(2,1),(2,2)} => (N1,S1) in {(2,3),(2,4),(3,4),(3,5)}
N1 = 2, S1 = 3 => N2 = 1, S2 = 1
Programao por restries: exemplo
integer(N).
integer(S).
sumto(0,0).
sumto(N,S) :- 1 =< N, N =< S,
sumto(N - 1, S - N).
?- S =< 3, sumto(N,S).
(N = 0, S = 0), (N = 1, S = 1),
(N = 2, S = 3).

restries usadas no
programa, na entrada, na sada
e para o controle
1: 1=<N1=N=<S1=S=< 3
(N1,S1) in {(1,1),(1,2),(1,3), (2,1),
(2,2),(2,3),(3,1),(3,2),(3,3)}
2: 1=<N2=N1-1=<S2=S1-N1=<2
(N2,S2) in {(1,1),(1,2),(2,1),(2,2)}
(N1,S1) in {(2,3),(2,4),(3,4),(3,5)}
N1=2, S1=3 => N2=1, S2=1
3: 1=<N3=N2-1=<S3=S2-N2=<0
contradio, no h mais solues
devolve:
(0,0) regra 1
(1,1) e (2,3) regra 2, 2a iterao
Prolog x programao por restries
Em Prolog:
predicados aritmticos no podem ser chamados como
resolvedores de restries
mas apenas como verificadores
a consulta S =< 3, sumto(N,S) gera erro por chamar
predicados aritmticos com termos no instanciados
Prolog pode ser visto como:
uma linguagem de programao por restrio
cujo nico operador a unificao
cujo domnio o conjunto de arvores finitas que
representam os termos Prolog
Prolog como restries: exemplo
prof(X,disc(ia,dept(di,ufpe)))
?- prof(pessoa(geber,Y),disc(ia,Z))
1: prof = prof, 2 = 2
2: X = pessoa(geber,Y), disc = disc, 2 = 2,
3: ia = ia, dept(di,ufpe) = Z
4: fundo das arvores atingindas
devolve as equaes no trivais:
X = pessoa(geber,Y),
Z = dept(di,ufpe).

Linguagens de PL multiparadigma
PL concorrente, paralela (Concurrent Prolog,
Parlog)
PL funcional (Lambda-Prolog, LeFun)
PL OO (Logtalk, Objlog, Login, F-Logic)
PL por restries, ie, Prolog + (in)equaes:
aritmticas (CLP(R), CHIP, Prolog3)
de tipos (Login)
buleanas (CHIP, Prolog3)
PL para Internet, predicados built-in para:
protocolos http, ftp, mail, news, etc.
parsing de pginas HTML para termos Prolog
PiLLoW, Logicweb
Ficou curioso? Tem mais!
Disciplina de Programao em Lgica:
Prolog
LIFE: PL funcional, OO e por restries de tipos, e com
interface para BD relacional
Florid: PL OO com igualdade semntica e sintaxe de ordem
superior, para BD dedutivo e Internet
projeto: implementar agentes inteligentes para a RoboCup
Projetos de pesquisa:
CRUIJFF: ambiente de programao de agentes inteligentes
integrando os paradigmas lgica, funcional, e por restries
sobre uma base Java.
Web SKWASH: agentes inteligentes de data mining de Web log
file e gerao de resumos hipertextuais

Você também pode gostar