O modelo relacional de dados — popularizado por SQL — é baseado em operações como seleção
(filtrar linhas), projeção (escolher colunas) e junção.
Em Prolog, essas operações surgem naturalmente com regras, variáveis e unificação.
Vamos explorar cada uma delas usando uma base de filmes.
1. Base de dados: filmes
Considere a tabela filme(Título, Gênero, Ano, Duração), com os seguintes fatos:
|
1 2 3 4 5 6 7 8 9 10 11 |
% filme(Titulo, Genero, Ano, Duracao) filme('O Poderoso Chefão', 'drama', 1972, 175). filme('Star Wars', 'ficcao', 1977, 121). filme('Amarcord', 'comedia', 1973, 123). filme('Cidadão Kane', 'drama', 1941, 119). filme('Os Caçadores da Arca Perdida', 'aventura', 1981, 115). filme('Tubarão', 'suspense', 1975, 124). filme('ET - O Extraterrestre', 'ficcao', 1982, 115). filme('O Iluminado', 'terror', 1980, 146). filme('A Viagem de Chihiro', 'animacao', 2001, 125). |
2. Seleção — filtrar linhas (WHERE)
A seleção corresponde ao WHERE do SQL: escolhemos apenas as tuplas que
satisfazem uma condição. Em Prolog, criamos uma regra que inclui a condição como uma meta adicional.
Regra: classico(T, G, A, D) — filmes até 1985
|
1 2 3 |
classico(T, G, A, D) :- filme(T, G, A, D), A =< 1985. |
Consultando:
|
1 2 3 4 5 6 7 |
?- classico(T, G, A, _). T = 'O Poderoso Chefão', G = drama, A = 1972 ; T = 'Star Wars', G = ficcao, A = 1977 ; T = 'Amarcord', G = comedia, A = 1973 ; ... (todos até 1985) Em SQL, seria: SELECT * FROM filme WHERE ano <= 1985; |
3. Projeção — escolher colunas (SELECT)
A projeção seleciona apenas algumas colunas. Em Prolog, basta incluir apenas as variáveis
que nos interessam na cabeça da regra e usar _ para ignorar as demais.
Regra: classico(T, G) — apenas título e gênero
|
1 2 3 |
classico(T, G) :- filme(T, G, A, _), A =< 1985. |
Consultando:
|
1 2 3 4 5 |
?- classico(T, G). T = 'O Poderoso Chefão', G = drama ; T = 'Star Wars', G = ficcao ; T = 'Amarcord', G = comedia ; ... |
_: Usamos _ para ignorar o ano e a duração.O Prolog não unifica
_ com nenhum valor específico — ele simplesmente “joga fora” a informação.Em SQL: SELECT titulo, genero FROM filme WHERE ano <= 1985;
4. Consultas com seleção e projeção
Podemos combinar as regras para fazer perguntas mais específicas:
|
1 |
?- classico(T, comedia). → T = 'Amarcord'. |
|
1 |
?- classico(T, _, _, D), D > 120. → T = 'O Poderoso Chefão', T = 'O Iluminado'. |
5. Negação por Falha — not / \+
A negação por falha é uma forma de dizer “não existe prova” para uma determinada meta.
Internamente, o Prolog tenta satisfazer a meta; se falha, not sucede.
Exemplo: filmes que não são clássicos (lançados após 1985)
|
1 2 3 |
filme_novo(T) :- filme(T, _, A, _), not (A =< 1985). |
Consultando:
|
1 2 |
?- filme_novo(T). T = 'A Viagem de Chihiro' . |
O Prolog tenta provar A =< 1985; como falha (pois 2001 > 1985), not sucede.
Ela só funciona quando a meta está totalmente instanciada. Se houver variáveis livres,
o comportamento pode ser inesperado. Por isso, sempre coloque a geração das variáveis antes do
not.6. Comparação com SQL
Veja como as operações relacionais se traduzem entre SQL e Prolog:
| Operação | SQL | Prolog |
|---|---|---|
| Seleção (linhas) | WHERE ano <= 1985 |
A =< 1985 na regra |
| Projeção (colunas) | SELECT titulo, genero |
Cabeça da regra com T, G |
| Ignorar coluna | (não selecionar) | Usar _ no lugar |
| Negacao (não clássico) | WHERE NOT (ano <= 1985) |
not (A =< 1985) |
7. Conclusão: Prolog como extensão do modelo relacional
O Prolog implementa de forma elegante as operações fundamentais da álgebra relacional:
- Seleção → condições em regras.
- Projeção → escolha de variáveis na cabeça da regra.
- Junção → variáveis compartilhadas entre predicados.
- Negacao →
not/\+.
Além disso, o Prolog vai além, permitindo recursão, geração de hipóteses
e raciocínio lógico que não são possíveis no SQL puro. É uma ferramenta poderosa para quem
quer explorar o lado lógico dos dados.