Datalog Recursivo
description
Transcript of Datalog Recursivo
Datalog Recursivo
AULA 6PGC 107 - Sistemas de Banco de Dados
Profa. Sandra de Amo Pós-graduação em Ciência da Computação – UFU
2012-2
P1(x) :- ...., P2(x),...P1(x) :- ..., P3(x),...
P2(x) :- ....P3(x):- ...
Estratificação
P(x) :- ...., P1(x),....P(x) :- ...., not(P2(x)), ...
Q(x):- ...not( P(x) ),...Q(x) :- ..., not(P2(x)), ....
....
Predicados do estrato 1
Predicados do estrato 2
Predicados do estrato 3
...
EstratificaçãoSeja P um programa (consulta) DatalogSeja idb(P) = predicados intensionais de P
Uma estratificação de P é uma partição das regras de Pem subprogramas P1,...,Pn juntamente com uma aplicação F :
idb(P) {1,...,n}
(1) Para cada predicado R, todas as regras que definem R estão no mesmo subprograma,
(2) Se R(x) :- ...., R’(y), .... então F(R’) ≤ F(R)(3) Se R(x) :- ...., not(R’(y)), ... então F(R’) < F(R)
Exemplor1 S(x) :- R1(x), not(R(x))
r2 T(x) :- R2(x), not(R(x))
r3 U(x) :- R3(x), not(T(x))
r4 V(x):- R4(x), not(S(x)), not(U(x))
Possíveis estratificações{r1}, {r2}, {r3}, {r4}
{r2}, {r1}, {r3}, {r4}
{r2}, {r3}, {r1}, {r4}
{r1,r2}, {r3}, {r4}
{r2}, {r1, r3}, {r4}
Grafo de precedência com sinalr1 S(x) :- R1’(x), not(R(x))
r2 T(x) :- R2’(x), not(R(x))
r3 U(x) :- R3’(x), not(T(x))
r4 V(x):- R4’(x), not(S(x)), not(U(x))
S
V
T
U
TeoremaSeja P um programa com estratificação F
(1) Se existe um caminho de R para S então F(R) ≤ F(S)
(2) Se existe um caminho de R para S contendo arco negativo, então F(R) < F(S)
Teste: P é estratificável ?Um programa é estratificável se e somente se
não existe ciclo no grafo de dependência com sinal contendo uma aresta negativa
Exemplop(x) :- q(x,y), s(y), ¬ r(x)
r(x):- q(x,y), ¬(p(x)
Não é estratificável
Como encontrar uma estratificação Início: para toda relação R do programa, estrato(R) = 1 Se uma regra com R na cabeça possui uma relação negada Q
em seu corpo, e estrato(Q) ≥ estrato(P), então incrementa estrato(P).
Se uma regra com R na cabeça possui uma relação não-negada Q em seu corpo, e estrato(Q) > estrato(P), então redefina estrato(P) := estrato(Q).
Se os estratos de cada relação se estabilizam, então o algoritmo pára e retorna a estratificação produzida.
Se os estratos não se estabilizam e atingem um valor maior do que o número de predicados, o algoritmo pára e responde: “Programa não estratificável”.
AlgoritmoPara cada relação p faça
estrato(p):= 1;
Repita
Para cada regra r com cabeça p faça
Para cada relação negada q no corpo de r faça
estrato(p) := max(estrato(p), 1+estrato(q));
Para cada relação não-negada q no corpo de r faça
estrato(p) := max(estrato(p), estrato(q));
Até que não exista mais mudanças dos estratos de nenhuma relação ou
algum estrato excede o número total de relações
ExemploP(x):- R(x), ¬ Q(x)
Q(x):- R(x), P(x)
Início
Estrato(P) = 1
Estrato(P) = 1
Estrato(R) = 1
Iteração 1
Estrato(P) = 2
Estrato(Q) = 2
Iteração 2
Estrato(P) = 3
Estrato(Q) = 3
Iteração 3
Estrato(P) = 4
Estrato(Q) = 4
Como o número de relações do programa é 3 e estrato(P) = 4 então o algoritmo pára e retorna
“Não estratificável”.
ExemploS(x) :- R1(x), not(R(x))T(x) :- R2(x), not(R(x))U(x) :- R(x), not(T(x))V(x):- R(x), not(S(x)), not(U(x))
InícioEstrato(S) = 1 Estrato(R) = 1Estrato(R1) = 1 Estrato(R2) = 1Estrato(T) = 1 Estrato(U) = 1Estrato(V) = 1
Iteração 1Estrato(S) = 2 Estrato(R)=Estrato(R1)=1Estrato(R2) = 1 Estrato(T) = 2 Estrato(U) = 3 Estrato(V) = 4
Iteração 2Estrato(S) = 2 Estrato(R)=Estrato(R1)=1Estrato(R2) = 1 Estrato(T) = 2 Estrato(U) = 3 Estrato(V) = 4
Como não há mais modificações no estrato de nenhuma relação, o programa é estratificável e uma estratificação é:
Estrato 1 = {R, R1, R2} Estrato 2 = {S,T} Estrato 3 = {U} Estrato 4 ={V}
Programas semi-positivosUm programa é semi-positivo se as negações no corpo
de suas regras só aparecem em predicados extensionais
Programas semi-positivos têm modelo minimal único
Resposta ao programa = modelo minimal do programa = calculado através do método da resolução
Programas semi-positivos – Como calcular a resposta Exemplos(x) :- p(x), ¬ r(x)t(x) :- s(x), ¬ r(x)
Extensionais = {p, r}Intensionais = {s,t}Relação resposta = t
R = {a, b} P = {b, c}
T0 = {r(a), r(b), p(b), p(c)}
T1 = T0 U {s(c)}
T2 = T1 U {t(c)}
T3 = T2
Portanto T2 é o ponto fixo do programa = modelo minimal
Resposta: {t(c)}
Resposta – Método Negação por Falha
t(x)s(x) :- p(x), ¬ r(x)t(x) :- s(x), ¬ r(x) r(a) :- r(b) :-p(b) :-p(c) :-
s(x1), ¬ r(x1)
p(x2), ¬ r(x2), ¬ r(x2)
p(b), ¬ r(b), ¬ r(b)
¬ r(b), ¬ r(b)
falha
p(c), ¬ r(c), ¬ r(c)
¬ r(c), ¬ r(c)
□
x x1
x1 x2
x2 bx2 c
¬ r(c)Resposta = {x x1, x1 x2 , x2 c}
={ x c }
Estratos podem ser vistos como programas positivos Cada estrato em um programa estratifiável
pode ser visto como programa semi-positivo
Resposta de um programa estratificável = composição das respostas de seus estratos.
ExemploQuais as cidades que não estão conectadas a São Paulo por rotas aéreas ?
conecta(x,y) :- voo(x,y)conecta(x,y) :- voo(x,z), conecta(z,y)
Query(x) :- ¬ conecta(x, SP)
(regra não é segura !)
Transformando em regras seguras :
Query(x) :- voo(x,z), ¬ conecta(x, SP) Query(x) :- voo(z,x), ¬ conecta(x, SP)
Exemplo - continuação(r1) conecta(x,y) :- voo(x,y)
(r2) conecta(x,y) :- voo(x,z), conecta(z,y)
(r3) Query(x) :- voo(x,z), ¬ conecta(x, SP)
(r4) Query(x) :- voo(z,x), ¬ conecta(x, SP)
Estrato 0 = { voo(a,b), voo(b,c), voo(c,SP), voo(b,d) }
Estrato 1 = { r1, r2}
Estrato 2 = {r3, r4}
Exemplo - ContinuaçãoResolvendo Estrato 1 : programa positivo
conecta = {(a,b), (b,c), (b,d), (a,c), (a,d), (b,d), (b,SP), (a,SP), (c,SP)}
Resolvendo Estrato 2 = programa semi-positivo
Query = {d}
Exercícior1 S(x) :- R1(x), not(R(x))
r2 T(x) :- R2(x), not(R(x))
r3 U(x) :- R3(x), not(T(x))
r4 V(x):- R4 (x), not(S(x)), not(U(x))
R1 = {a, b, c}
R = {a}
R2 = {a, d}
R3 = {a, c}
R4 = {a,d}