Relacionando Tabelas em Prolog

 

Consultas relacionais no estilo SQL, mas com a alma lógica

Assim como em SQL, frequentemente precisamos relacionar informações que estão em tabelas diferentes.
Em Prolog, fazemos isso de forma natural usando variáveis compartilhadas — que atuam como
“chaves estrangeiras”. Neste artigo, vamos construir um pequeno sistema de funcionários e dependentes,
e aprender a fazer joins, consultas com condições e até encontrar registros sem correspondência.

1. O problema: funcionários e dependentes

Imagine que temos duas tabelas em um banco de dados relacional:

  • Funcionários — com código, nome e salário.
  • Dependentes — com código do funcionário a quem estão vinculados e seu nome.

O campo código em funcionários é a chave primária; em dependentes,
é uma chave estrangeira que referencia o funcionário.

2. Modelando em Prolog

Em Prolog, cada “tabela” vira um conjunto de fatos com uma aridade fixa:


 

🔑 Chave de relacionamento: O campo Código é o elo entre as duas tabelas.
Em dep/2, o primeiro argumento é o código do funcionário, que deve existir em func/3.

3. O campo Código como chave relacional

Assim como em SQL, a integridade referencial é implícita: se um dependente tem código 2,
esperamos que exista func(2, ...). O Prolog não valida isso automaticamente, mas nossas
consultas vão explorar essa relação.

4. “Joins” com variáveis compartilhadas

Para fazer um join entre as duas tabelas, usamos a mesma variável no lugar
do código em ambas as chamadas. O Prolog unifica as ocorrências e encontra as combinações que satisfazem
todos os fatos.

Exemplo: “Quem são os dependentes do Ivo?”

Sabemos que Ivo tem código 2. Queremos os nomes dos dependentes associados a esse código.


 

Se não soubéssemos o código, poderíamos deixar o Prolog descobrir:

 

🔎 Leitura: “Encontre um código C tal que C seja funcionário
chamado Ivo, e depois encontre um dependente com esse mesmo C.”

Exemplo: “De quem o Ary é dependente?”

Agora partimos do dependente para o funcionário.


 

Na base, ary aparece como funcionário (código 4), mas não como dependente. A consulta retorna
false porque não há nenhum dependente chamado ary.

5. Consultas com condições adicionais

Podemos filtrar usando comparações numéricas, como em SQL com WHERE.

“Quem depende de funcionário com salário < 950?”

Funcionários com salário menor que 950: Eva (800).


 

Isso retorna o funcionário eva e seu dependente Nino.

6. Negação por falha: “Funcionários sem dependentes”

Em SQL, usaríamos LEFT JOIN ... WHERE dep.codigo IS NULL. Em Prolog, usamos
negação por falha com o predicado not (ou \+).


 

O Prolog tenta provar dep(C, _); se falha, a negação é bem-sucedida. O resultado mostra
que Lia (código 3) não tem dependentes.

⚠️ Cuidado com a instanciação! Para que not funcione corretamente,
a variável C deve estar instanciada no momento em que not
é chamado. Por isso, colocamos func(C, N, _) antes de not(dep(C, _)).
Se trocássemos a ordem, o Prolog poderia não encontrar soluções ou gerar erro.

8. Comparação com SQL

O mesmo “join” em SQL seria:


 

Em Prolog, a consulta equivalente é:


 

Abaixo, um resumo das principais correspondências:

SQL Prolog
FROM func JOIN dep ON func.codigo = dep.codigo func(C, ...), dep(C, ...)
WHERE salario > 1000 func(_, _, S), S > 1000
IS NULL (left join) not(dep(C, _))
SELECT nome Variável no lugar do campo (ex: N)

✅ O Prolog oferece uma maneira elegante e declarativa de relacionar dados, sem necessidade de sintaxe
especial para joins. Basta compartilhar variáveis e deixar o mecanismo de unificação fazer o trabalho
pesado. Combine isso com comparações e negação, e você terá todo o poder de um SGBD relacional —
com a flexibilidade da programação lógica.

Deixe um comentário