Visualize regras antes de codificá-las — uma abordagem gráfica para projetar predicados lógicos.
1. Projetar regras com grafos
Antes de escrever uma única linha de Prolog, desenhe um grafo de relacionamento. Nele:
- Objetos (pessoas, coisas) são nós.
- Relacionamentos (pai, mãe, irmão) são arcos direcionados ou não.
Essa técnica força você a pensar na topologia da lógica: quem se conecta a quem, e quais caminhos definem a relação que você quer codificar.
2. Arcos pontilhados: a regra em construção
Use arcos sólidos para fatos conhecidos (ex.: pai(adão, caim)) e arcos pontilhados para a relação que está sendo definida (ex.: irmao/2). O arco pontilhado representa a inferência que a regra criará.
3. Exemplo clássico: irmao(X,Y)
Definição em Prolog:
|
|
irmao(X, Y) :- pai(Z, X), pai(Z, Y), X \= Y. |
Leitura: X é irmão de Y se existe um Z tal que Z é pai de X e Z é pai de Y, e X é diferente de Y.
Grafo da regra irmao/2

Tradução lógica: O nó Adão é pai de Caim e de Abel. O arco pontilhado entre Caim e Abel representa a regra: “eles são irmãos porque compartilham o mesmo pai”. O grafo deixa explícito que a relação irmao não é um fato atômico, mas uma conexão derivada.
O código UML acima representa a mesma estrutura: arcos sólidos de paternidade e o arco pontilhado (relação derivada) de irmão.
5. A condição X \= Y — por que é essencial?
Com a condição X \= Y (diferente), garantimos que os dois argumentos sejam distintos.
Ou seja:Neste caso queremos garantir que o programa não chegue a conclusão errada que Caim é irmão dele mesmo, por isso a condição.
6. Consulta: irmao(caim, abel).
Com os fatos pai(adão, caim). e pai(adão, abel)., a consulta retorna:
|
|
?- irmao(caim, abel). true. |
E a consulta irmao(abel, caim). também é verdadeira, porque a regra é simétrica (embora não explicitamente, ela deriva de um pai comum).
7. Encontrando todos os pares de irmãos
Se tivermos mais filhos de Adão (ex.: pai(adão, set).), a consulta irmao(X, Y). enumerará todos os pares ordenados com X \= Y:
|
|
?- irmao(X, Y). X = caim, Y = abel ; X = caim, Y = set ; X = abel, Y = caim ; X = abel, Y = set ; X = set, Y = caim ; X = set, Y = abel ; false. |
O Prolog gera todas as combinações de dois filhos do mesmo pai, excluindo a identidade.
8. Regras vs. Fatos — manutenibilidade
Definição por fatos (ruim):
|
|
irmao(caim, abel). irmao(abel, caim). irmao(caim, set). irmao(set, caim). irmao(abel, set). irmao(set, abel). |
Definição por regra (boa):
|
|
irmao(X,Y) :- pai(Z,X), pai(Z,Y), X\=Y. |
A regra é mantenível: ao adicionar um novo filho, todos os pares de irmãos são automaticamente inferidos. Com fatos, você precisaria adicionar O(n²) fatos manualmente — propenso a erros e esquecimentos.
9. Consistência com regras
Regras garantem consistência porque a lógica é centralizada. Se a definição de “irmão” mudar (ex.: incluir meios-irmãos), basta alterar uma única regra. Com fatos, você teria que revisar todas as combinações.
Além disso, a base de fatos (pai/mãe) permanece enxuta e semânticamente limpa — cada fato é uma verdade atômica, e as regras constroem o conhecimento derivado.
Recapitulando: grafos de relacionamento transformam a regra em uma imagem mental. Arcos pontilhados mostram o que será inferido, e a condição X \= Y é o guardião da lógica. Use essa técnica antes de iniciar seu código Prolog, pois ficará mais claro, correto e elegante.