O Poder dos Grafos de Relacionamento

filósofo

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.





Regras em Prolog: Indo Além dos Fatos

filósofo
Fatos são a base do conhecimento em Prolog, mas eles sozinhos são limitados. Se precisássemos declarar cada relação manualmente — como “avô”, “bisavô”, “irmão” — nossa base de conhecimento seria imensa e repetitiva. Regras são a solução: elas nos permitem derivar novos conhecimentos a partir dos fatos existentes. Neste artigo, vamos aprender como criar regras e transformar uma simples árvore genealógica em um sistema poderoso de consultas.

1. O que são regras e por que são essenciais?

Uma regra em Prolog é uma afirmação condicional: “X é verdadeiro se Y e Z forem verdadeiros”. Enquanto fatos são verdades absolutas, regras são verdades dependentes — elas só são verdadeiras quando suas condições são satisfeitas.

🧠 Analogia: Se os fatos são como “Adão é pai de Seth” e “Seth é pai de Enos”, as regras são como “Alguém é avô se for pai do pai de alguém”. As regras capturam o conhecimento geral, não apenas casos específicos.

As regras são essenciais porque permitem:

  • Evitar repetição: Não precisamos declarar cada avô explicitamente.
  • Generalização: A regra funciona para qualquer pessoa na árvore.
  • Manutenção: Se adicionarmos novos fatos, as regras funcionam automaticamente.
  • Abstração: Expressamos conceitos de alto nível (avô, irmão) em termos de conceitos mais básicos (pai).

2. Sintaxe: cabeça e corpo

A estrutura básica de uma regra é:

  • Cabeça: É o predicado que estamos definindo (ex: avo(X, Y)).
  • :-: Lê-se “se” ou “se … então”.
  • Corpo: Uma conjunção de objetivos (fatos ou regras) que devem ser verdadeiros para que a cabeça seja verdadeira.
📝 Atenção: A regra termina com ponto final (.), assim como os fatos. A cabeça e o corpo podem ter variáveis que serão compartilhadas.

3. Exemplo clássico: a relação “avô”

A definição de “avô” em Prolog é elegantemente simples:

Interpretação: X é avô de Y se X é pai de Z e Z é pai de Y. A variável Z é compartilhada entre os dois objetivos, representando o pai intermediário (a “ponte” entre avô e neto).

📖 Leitura lógica: “X é avô de Y se existe uma pessoa Z tal que X é pai de Z e Z é pai de Y.”

4. O significado lógico de :- (se)

O operador :- é a espinha dorsal das regras em Prolog. Ele expressa uma implicação lógica:

  • Lado direito (corpo): as condições que devem ser satisfeitas.
  • Lado esquerdo (cabeça): a conclusão que podemos inferir.
🧩 Lógica: A regra diz: “Se o corpo é verdadeiro, então a cabeça é verdadeira.” O Prolog usa essa regra de trás para frente: quando você pergunta se a cabeça é verdadeira, ele tenta provar o corpo.

5. Adicionando a regra à árvore genealógica

Nosso arquivo familia.pl atualizado com a regra:

No SWI-Prolog ou SWISH, carregue o arquivo:

6. Consultando a nova regra: avo/2

Agora podemos fazer perguntas que antes seriam impossíveis apenas com fatos:

🔹 Quem é o avô de Enos?

🔹 Quem são os netos de Adão?

🔹 Quem são todos os avós e netos?

💡 Poder da regra: A mesma regra funciona para todas as pessoas na árvore, sem que tenhamos declarado um único fato “avô” explicitamente!

7. Como o Prolog executa uma regra (passo a passo)

Quando você pergunta avo(adão, enos), o Prolog:

Passo 1: Unifica a cabeça da regra avo(X, Y) com a consulta avo(adão, enos)X = adão, Y = enos.
Passo 2: Substitui as variáveis no corpo: pai(adão, Z), pai(Z, enos).
Passo 3: Tenta satisfazer o primeiro objetivo: pai(adão, Z). Encontra pai(adão, seth)Z = seth.
Passo 4: Tenta o segundo objetivo com Z = seth: pai(seth, enos) → é verdade!
Passo 5: Todos os objetivos do corpo são verdadeiros → a regra é satisfeita → a consulta retorna true (com X = adão).
🧠 Entenda: Se o segundo objetivo falhasse (ex: pai(seth, X) não encontrasse enos), o Prolog volta atrás (backtracking) e tenta outra solução para o primeiro objetivo.

8. Regra vs. Fatos: elegância e concisão

Com fatos explícitos (ruim):

Com regra (bom):

A regra é mais elegante porque:

  • Concisão: uma linha substitui muitas.
  • Generalidade: funciona para qualquer número de pessoas.
  • Manutenibilidade: se a definição de avô mudar, só precisamos alterar um lugar.
  • Corretude: a lógica é clara e verificável.

9. Predicados definidos pelo usuário vs. primitivos

Predicados Primitivos (built-in)Predicados Definidos pelo Usuário
Já vêm com o Prolog.São criados por você.
Ex: write/1, listing/1, findall/3.Ex: avo/2, neto/2, irmao/2.
São implementados em C/linguagem de baixo nível.São implementados em Prolog puro (fatos + regras).
Não podem ser modificados.Você pode adicionar ou alterar quantas regras quiser.
Exemplo: ?- listing(pai).Exemplo: ?- avo(adão, X).
💡 Dica: A maioria dos seus programas Prolog será composta de seus próprios predicados, construídos a partir de fatos e regras. Os predicados primitivos são ferramentas auxiliares.

10. Resumo: o poder das regras

O que aprendemos:

  • Regras são definições condicionais: cabeça :- corpo.
  • O corpo é uma conjunção de objetivos que devem ser verdadeiros.
  • Regras permitem derivar conhecimento a partir de fatos.
  • São mais concisas, gerais e fáceis de manter do que fatos explícitos.
  • O Prolog executa regras unificando a cabeça e depois provando o corpo.
  • Predicados definidos pelo usuário são a espinha dorsal de programas Prolog.

Com regras, sua árvore genealógica se transforma em um sistema de inferência completo. Você pode fazer perguntas complexas sem precisar declarar cada relação individualmente. No próximo artigo, vamos explorar regras com múltiplas definições e recursão — onde as regras se tornam ainda mais poderosas!