Introdução a LIFE
(Logic Inheritance Functions Equations):
uma linguagem multiparadigma
a base lógica
Jacques Robin
Ioram Schechtman Sette
DI-UFPE
Motivação:
Limitações de Prolog como LP
Estrutura de conhecimento:
• de aridade fixa => difícil modificar, estender
• com sub-estruturas indexadas por posição => difícil de ler
• não tipada => difícil verificar, manter consistência
ex, person(_,_,_,_,35,male,_,_,_...)
Aritmética mal integrada com computação simbólica
• dificulta aplicações híbridas
ex, > ?- C is 1 + 2.
C=3
• não tem mais bidirecionalidade, nem declaratividade no
sentido de independente da ordem
ex, > ?- C is D, D = 1 + 2.
Error.
Limitações de Prolog como LP (cont.)
Variáveis de ordem superior não disponíveis
• dificulta meta-programação
ex, P(a,Y)
Interface com protocolos da Internet externa à linguagem
• dificulta programação de agentes na Web
Bibliotecas gráficas externas à linguagem
• dificulta programação de GUIs
Limitações de Prolog como Formalismo de
Representação de Conhecimento (FRC)
Inadequação inferencial com conhecimento parcial
ex, pessoa(joao,35,consultor) não unifica com
pessoa(joao, consultor,maria)
Respostas para consultas sempre extensionais
• inadequação expressiva para resolução de restrições
ex, devolve como resultado: X = 2 mas não X >= 3, Y < 5
Hierarquias representadas por meio de regras
• inadequação aquisicional para conhecimento terminológico
• ineficiência inferencial para herança de propriedades
ex, pessoa(X) :- criança(X). para criança isa pessoa
Procedimentos simulados por encadeamento de regras
• inadequação aquisicional para conhecimento procedimental
A Química de LIFE: A molécula lpy
Y-cálculo
Tipos, herança,
FUF, Redes Semânticas
FOOL
Frames
CLOS
l-cálculo
Funções
Procedimentos
Daemons,Métodos
LogIn
LIFE
Prolog OO
Frames+
Regra
LeFun
Prolog
Funcional
p-cálculo
Relações.
Regras, Lógica.
Estrutura de dado de LIFE: termo y
Sintaxe:
• Alfabeta particionado em 5 espaços de símbolos:
•
•
•
•
sorts, predicados, funções, atributos (constantes) e variáveis
termo y --> sort | Var | Var:sort | Var:sort(atr1, ..., atrN) |
pred(atr1, ..., atrN) |
func(atr1, ..., atrN) | Var(atr1, ..., atrN).
atrI --> valorAtr | nomeAtr => valorAtr
nomeAtr --> inteiro | átomo
valorAtr --> termo y
sort --> builtInSort | userDefinedSort
Versatilidade dos termos y
Termo-y como declaração de classe:
• :: termo-y
• :: sort(atr1 => val1, ..., atrN => valN).
Termo-y como cláusula lógica (definição de predicado):
• termo-y0 :- termo-y1, ..., termo-yM.
• predA(argA1 => valA1, ..., argAn => valAn)
:- predB(argB1 => valB1, ..., argBn => valBn),
...
predK(argK1 => valK1, ..., argKn => valKn).
Termo-y como cláusula funcional (definição de função):
• termo-y0 -> termo-y1.
• funcA(paramA1 => valA1, ..., paramAn => valAn)
-> funcB(paramB1 => funcC(paramC1 => ... => val1) ...), ...
paramBK => funcI(paramI1 => valAn, ...)).
Exemplos de termos y
42, -5.66, “exemplo” : sorts built-in p/ inteiros, reais e
strings
específicos
int, real, string : sorts built-in que denotam todos os
inteiros,
reais e strings.
exemplo_abc, ‘%exemplo^&’ : sorts
date(friday, “XIII”) : sorts c/ atributos e rótulos
numéricos implicitos
date(1=>friday, 2=>”XIII”): sorts c/ atributos e rótulos
numéricos explícitos
freddy(nails=>long, face=>ugly): sorts c/ atributos e
Exemplos de termos y (cont.)
@, jogador, jogadorDeFutebol, romário, time
romário(time => flamengo, posição => atacante).
X:jogador
X:atacante(time => T:time, posição => atacante).
X:@(time => T:brasil(atacante => [romário,ronaldo])).
Variáveis nunca em posição de atributo:
• S(A1 => V1, A2 => atacante(A3 => V3)) gera erro de sintaxe
Hierarquia de Tipos
Sorts:
• Conjunto Parcialmente
Ordenado de Tipos
• Hierarquia definida pelo
operador:
<|
(é um subsort de)
• { } <| sort <| @
Exemplos:
• truck <| vehicle.
(truck é um subsort de vehicle)
• mobile(vehicle).
• useful(truck).
• mobile(X), useful(X)?
• X = truck
Built-In Sorts
Além de {} (bottom) e @ (top):
• todos os inteiros e reais
1 <| int. 1.2 <| real.
• list, [ ] ou nil, cons
[a,b,c] = [a,b|[c]] = [a,b,c|[]] =
[a|[b|[c|[]]]]
• strings
“exemplo” <| string.
• bool, true, false
• built_in (supersort de list, string,
real e bool)
Resumindo:
• built_in <| @
•
•
•
•
list <| built_in
string <| built_in
real <| built_in
bool <| built_in
• cons <| list
• [] <| list
• int <| real
• true <| bool
• false <| bool
Built-In Sorts (hierarquia)
@
built_in
list
[]
string
cons
real
int
{}
bool
true
false
glb (Greatest Lower Bound)
O glb de dois sorts r e s é o
maior subsort comum entre
r e s.
Semântica dos sorts baseada
na teoria dos conjuntos, glb
corresponde a interseção
entre eles.
Se glb é {}, os sorts são ditos
incompatíveis.
O glb pode ser dado pela
forma disjuntiva {s1;s2;s3}
caso seja composto por mais
de um sort.
estudante <| pessoa.
empregado <| pessoa.
staff <| empregado.
est_trab <| estudante.
est_trab <| staff.
s1 <| estudante.
s2 <| estudante.
w1 <| est_trab.
w2 <| est_trab.
e1 <| staff.
e2 <| staff.
glb(estudante,empregados) =
{est_trab}
glb (hierarquia de sorts)
pessoa
empregado
estudante
staff
professor
w2 e1 e2
f1 f2 f3
est_trab
s1
sn
w1
Atributos
Par consistindo em um rótulo e um termo y associado.
Exemplos:
• show(
titulo => “bewitched”,
genero => sitcom,
onde => televisao,
sogra => “Agnes Moorehead”).
• thing(a,b,c) é equivalente a thing(1 => a, 2 => b, 3=>c).
Variáveis
Começam por _ ou letra
maiúscula
Variável Anônima: _
(equivalente a @)
Pode ser associada a um termo y
Ex: X:t
Referência cíclica:
X:[42|X]
Associação implícita: X:@
Exemplos:
• father(name => N:string,
son => boy(name => N))
representa um pai que tem um
filho com o mesmo nome.
• [A,A]
é a lista onde o primeiro e
segundo elemento são identicos.
• L:[int,int,int|L]
lista cíclica de tamanho 3, onde
os 3 elementos são inteiros.
Exemplo de termo y pessoa
nome
pessoa
id
primeiro
conjuge
string
ultimo
string
nome
pessoa
ultimo
id
X:pessoa(nome=>id(primeiro=>string,
último=>S:string),
conjuge=>pessoa(nome=>id(último=>S),
conjuge=>X)).
Caracteristicas de termos y
Recursivo,expressivo,simples e eficiente.
Co-referência x Caminhos.
Mais semântica : Propriedades por rótulo, não por posição, como
Prolog.
Pode ter disjunções :
P:{charlatao
;pessoa(id=>nome(primeiro=>X:’john’’,
ultimo=>Y:{‘doe’;X}),
amigo=>{P;pessoa(id=>nome(primeiro=>Y,
último=>X))})}
Unificação
Unificar 2 termos y consiste em:
•
•
•
•
computar o glb de seus sort principais,
casar as variáveis principais,
ligá-las a todos os atributos dos 2 termos y pais,
unificar recursivamente os termos y relativos aos atributos.
Se durante a unificação o glb for { }, ela falha, caso
contrário ela sucede.
Exemplo de Unificação
pessoa
empregado
estudante
staff
professor
w2 e1 e2
f1 f2 f3
est_trab
s1
sn
w1
Exemplo de Unificação (cont.)
X:estudante(orientador => professor( secretária=>Y:staff,
assistente=>X),
colega_de_quarto=>empregado(representante=>Y)).
empregado(orientador=>f1(secretária=>empregado,
assistente=>U:pessoa),
colega_de_quarto=>V:estudante(representante=>V),
ajudante=>w1(esposa=>U))
Unificação:
W:est_trab(orientador=>f1(secretária=>Z:est_trab(representante=>Z),
assistente=>W),
colega_de_quarto=>Z,
ajudante=>w1(esposa=>W))
Exemplo de unificação (cont.)
X estudante
X.orientador professor
X.orientador.secretaria Y staff
X.orientad
or.assiste
nte
X
X.colegaDeQuarto empregado
X.colegaDeQuarto.representante Y
W empregado
W.orientador f1
W.orientador.secretaria empregado
W.orientador.assistente U pessoa
W.colegaDeQuarto V estudante
W.colegaDeQuarto.representante V
W.ajudante w1
W.ajudante.esposa U
W est_trab
W.orientador f1
W.orientador.secretaria Z est_trab
W.orientador.secretaria.representante Z
W.orientador.assistente W
W.colegaDeQuarto Z
W.ajudante w1
W.ajudante.esposa W
Exemplo de Unificação (cont.)
X
estudante
orientador
assistente
professor
colega_de_quarto
secretária
staff
Y
representante
X:estudante(orientador => professor( secretária=>Y:staff,
assistente=>X),
colega_de_quarto=>empregado(representante=>Y)).
Exemplo de Unificação (cont.)
empregado
f1
secretária
empregado
assistente
colega_de_quarto
ajudante
V
estudante
representante
orientador
pessoa
U
esposa
w1
empregado(orientador=>f1(secretária=>empregado,
assistente=>U:pessoa),
colega_de_quarto=>V:estudante(representante=>V),
ajudante=>w1(esposa=>U))
Exemplo de Unificação (cont.)
w1
esposa
ajudante
est_trab
orientador
f1
assistente
colega_de_quarto
secretária
est_trab
representante
Unificação:
W:est_trab(orientador=>f1(secretária=>Z:est_trab(representante=>Z),
assistente=>W),
colega_de_quarto=>Z,
ajudante=>w1(esposa=>W))
Declaração de Atributos em Sorts (Classes)
:: Head
onde Head é um termo y
arbitrário.
:: person (age=> int).
Assegura que todo termo com o
sort person terá um campo age
cujo valor é um inteiro.
man <| person.
A = man?
*** Yes
A = man(age=>int).
:: vehicle(make => string,
wheels => int).
:: car(wheels => 4).
Se a relação car <| vehicle
existir, todas as propriedades
de car devem ser compatíveis
com as de vehicle.
Exemplo de Declaração de Atributos
:: rectangle(lenght=>L:real,
width=>W:real,
area=>L*W).
:: square(lenght=>S, width=>S,
side =>S).
square <| rectangle.
R=rectangle(area=>16,width=>4)
?
*** Yes
R=rectangle(area=>16,
lenght=>4,
width=>4).
R=square?
*** Yes
R = square(area=>16,
lenght => _A: 4,
side => _A,
width => _A).
Declaração de Sorts com Restrições
::Head | Goal.
ex, ::X:person | X.age = int.
herança de X.age=int em todas as instâncias de person
exatamente como :: person(age=>int).
::date(day_of_week => day_of_week,
day_of_month => D:int,
month_name => Mname:month,
month_num => Mnum:month_num,
year => Y:int) | day_month_p(D,Mname,Y),
month_p(Mname,Mnum).
day_month_p(D,month31,_) :- D >= 1, D =< 31.
day_month_p(D,month30,_) :- D >= 1, D =< 30.
day_month_p(D,feb,Y) :- leaf_year(Y), D >= 1, D =< 29.
day_month_p(D,feb,Y) :- \+(leaf_year(Y)), D >= 1, D =< 28.
month_p(jan,1).
... month_p(dez,12)
month := {month30;month31}.
Possíveis Declarações de Sorts
:: t (atr).
:: t (atr) | restrições.
t (atr) <| u.
t (atr) <| u | restrições.
t := u (atr).
t := u (atr) | restrições.
t (atr) <| {u;v;w}.
t (atr) <| {u;v;w} | restrições.
t := {u (atr); v (atr); w(atr)}.
t := {u (atr); v (atr); w(atr)} | rest.
::car(wheels=>4).
::car | car.wheels = 4.
car(wheels=>4) <| vehicle.
car <| vehicle | car.wheels = 4.
car := vehicle(wheels => 4).
car := vehicle(wheels => X:int) | X=4.
car <| {four_wheels;vehicle}.
car <| {four_wheels;vehicle} |
vehicle.wheels = 4.
tree := {leaf;node}
tree := {leaf;node} | node.left = tree,
node.right=tree.
Notar a Assimetria de comportamento de :=
t := {u;v;w}. abrevia
u <| t . v <| t . w <|t .
t := {u}. abrevia
u <| t .
mas
t := u. abrevia
t <| u.
Exemplo:
tree := {leaf;
node( left => tree,
right => tree)}
é igual a
leaf <| tree.
node <| tree.
:: node (left => tree,
right => tree).