3. Base de Dados
Princı́pios da Programação Lógica Vamos ampliar um pouco as
relações familiares. (Ver SWISH)
3/23
4. Regras Recursivas
Definir uma coisa em termos dela própria (kkkk). Vejamos a
definição de ancestral. Observemos as relações recursivas.
avô(Ancestral,Descendente) :- pai1(Ancestral, Pessoa),
pai(Pessoa, Descendente)
bisavô(Ancestral,Descendente) :- pai(Ancestral, Pessoa),
avô(Pessoa, Descendente)
trisavô(Ancestral,Descendente) :- pai(Ancestral, Pessoa),
bisavô(Pessoa, Descendente)
Isto nos leva ao padrão:
ancestral(Ancestral,Descendente)
:-pai(Ancestral,Pessoa),ancestral(Pessoa,Descendente)
Não leva a um loop infinito??
1
Vamos abstrair das mães por enquanto
4/23
5. Caso Base
Em algum momento a recursão deve ser obrigada a parar.
ancestral(Ancestral, Descendente) :- pai(Ancestral,Descendente).
5/23
7. Fechamento Transitivo
É dito que a relação ancestral é um fechamento transitivo da
relação de parentesco e portanto facilmente realizada através de
uma regra recursiva.
7/23
8. Recursão Linear
Um programa é recursivo linear se possui apenas uma meta
recursiva no corpo da cláusula.
Ex de definição de ancestral não linear:
ancestral(Ancestral,Descendente) :- ancestral(Ancestral,Pessoa),
ancestral(Pessoa,Descendente).
8/23
10. Descrevendo o grafo
% fatos
eixo(a,b). eixo(a,c). eixo(b,d).
eixo(c,d). eixo(d,e). eixo(f,g).
% caso base
conectado(nó,nó).
% regra recursiva
conectado(nó1,nó2) :- eixo(nó1,Link), conectado(Link,nó2).
10/23
11. Aritmética
Uma nova maneira de pensar a aritmética.
Definição de Número Natural
% Zero é um número natural (Controvérsias à parte ;-) )
número natural(0).
% Definindo número natural
número natural(s(X)) :- número natural(X).
então os números serão definidos aqui como sucessores do zero.
1 - s(0), 2 - s(s(0)) - 3 - s(s(s(0))) ... N - sn(0)
11/23
12. Correção e Completude
Dissemos que um programa P é correto com relação a um
significado esperado M se o significado do programa M(P) é
subconjunto do significado M. Ou seja M(P) ⊂ M
Um programa é completo se o significado esperado M(P) está
contido no significado do programa. Ou seja M ⊂ M(P).
Logo, o programa é correto e completo quando o significado do
programa é igual ao significado esperado. Ou seja M(P) = M.
12/23
13. Prova de Completude
Proposição: O Programa definindo os números naturais é correto e
completo para o conjunto de metas definidas como :
numero natural(si (0)), ∀i ≥ 0
13/23
15. Prova de Correção
I Suponha que o número natural(X) seja dedutı́vel em N
deduções.
I Então, por indução, número natural(X) está no significado
esperado.
I Se N = 0, basta observar a cláusula unitária
(número natural(0))
I Se N > 0 , a meta deve ser número natural(X’) onde X’ =
sk(0) ∀k ≥ 0. Então X’ estará no significado esperado do
programa.
15/23
16. Definindo as Desigualdades
%Menor ou Igual
menor ou igual(0,X) :- número natural(X).
%Isto também poderia ter sido escrito assim
0 menor ou igual X :- número natural(X).
% Ou ainda ...
0 ≤ X :- número natural(X).
% Concluindo
menor ou igual(s(X),s(Y)) :-menor ou igual(X,Y).
16/23
17. Definindo a Soma
Você nunca pensou em somar desse jeito
soma(0,X,X) :- natural number(X).
soma(s(X),Y,s(Z)):- soma(X,Y,Z).
número natural(0).
número natural(s(X)) :- número natural(X).
17/23
19. Exponenciação
/* exp(N,X,Y) :- N, X e Y são números naturais tais que Y igual X
elevado a N. */
exp(s(N),0,0).
exp(0,s(X),s(0)).
exp(s(N),X,Y) :- exp(N,X,Z), vezes(Z,X,Y).
vezes(0,Y,0).
vezes(s(X),Y,Z) :- vezes(X,Y,XY), somar(XY,Y,Z).
somar(0,X,X) :- número natural(X).
somar(s(X),Y,s(Z)):- somar(X,Y,Z).
número natural(0).
número natural(s(X)) :- número natural(X).
19/23
20. Fatorial
/* fatorial(N,F) :- F igual a N fatorial. */
fatorial(0,s(0)).
fatorial(s(N),F) :- fatorial(N,F1), vezes(s(N),F1,F).
vezes(0,X,0).
vezes(s(X),Y,Z) :- vezes(X,Y,XY), somar(XY,Y,Z).
somar(0,X,X) :- número natural(X).
somar(s(X),Y,s(Z)):- somar(X,Y,Z).
número natural(0).
número natural(s(X)) :- número natural(X).
20/23
21. O menor entre dois números
:- op(40, xfx, menor ou igual). % definição de operador
mı́nimo(N1,N2,N1) :- N1 menor ou igual N2.
mı́nimo(N1,N2,N2) :- N2 menor ou igual N1.
0 menor ou igual X :- número natural(X).
s(X) menor ou igual s(Y) :- X menor ou igual Y.
número natural(0).
número natural(s(X)) :- número natural(X).
21/23
22. Resto da Divisão
mod(X,Y,Z) :- Z < Y, vezes(Y,Q,QY), somar(QY,Z,X).
vezes(0,X,0).
vezes(s(X),Y,Z) :- vezes(X,Y,XY), somar(XY,Y,Z).
somar(0,X,X) :- número natural(X).
somar(s(X),Y,s(Z)):- somar(X,Y,Z).
número natural(0).
número natural(s(X)) :- número natural(X).
22/23