O Poder dos Grafos de Relacionamento

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:

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

PlantUML Syntax:
@startuml
object Adao
object Caim
object Abel

Adao –> Caim : pai
Adao –> Abel : pai
Caim ..> Abel : irmao (inferido)

@enduml

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:

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:

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):

Definição por regra (boa):

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.





Deixe um comentário