Fatos em Prolog: A Base do Conhecimento Lógico

Em Prolog, tudo começa com fatos. Eles são as verdades fundamentais sobre o mundo que o programa conhece. Enquanto em linguagens imperativas você declara variáveis e atribui valores, em Prolog você declara relações que são sempre verdadeiras. Neste artigo, vamos construir essa base sólida e aprender a criar, organizar e consultar fatos — o primeiro degrau para dominar a programação em lógica.

1. O que são fatos na programação em lógica?

Um fato é uma afirmação incondicionalmente verdadeira sobre o domínio do problema. Ele estabelece uma relação entre objetos do mundo real (ou abstratos) sem nenhuma condição adicional. Em Prolog, fatos são a base de conhecimento a partir da qual o sistema irá raciocinar.

Por exemplo, se estamos modelando uma árvore genealógica, podemos afirmar que “José é pai de Ana” e “Maria é mãe de Ana”. Essas são verdades absolutas no nosso universo — não dependem de nada mais para serem verdadeiras.

💡 Analogia: Pense nos fatos como as “linhas da verdade” em um banco de dados relacional, mas com muito mais poder: eles não apenas armazenam dados, mas também servem como base para inferências lógicas.

2. Sintaxe correta dos fatos

A sintaxe de um fato em Prolog é simples, mas rigorosa. Cada fato segue a estrutura:

Regras de nomenclatura (essenciais!)

  • Predicados e átomos (nomes de relações e objetos) devem começar com letra minúscula. Exemplos: pai, ana, jose.
  • Variáveis (que ainda não conhecem valor) começam com letra maiúscula ou underscore. Exemplos: X, Pessoa, _Temp.
  • O ponto final (.) é obrigatório no final de cada fato e de cada consulta. Esquecê-lo é o erro mais comum entre iniciantes!
  • Números podem ser usados como átomos (ex: idade(jose, 42).), mas não podem iniciar um predicado.
⚠️ Atenção: Prolog diferencia maiúsculas de minúsculas. Escrever Pai(jose, ana). (com P maiúsculo) cria uma variável Pai, não o predicado pai. Isso é uma fonte clássica de erros!

3. Construindo nossa árvore genealógica (passo a passo)

Vamos criar uma base de fatos sobre uma família fictícia. Queremos registrar relações de pai e mãe.

Considere a seguinte família:

  • adão e eva são pai e mãe de cain, abel e set.

No arquivo familia.pl, escrevemos:

Observe que usamos dois predicados diferentes (pai/2 e mae/2) para modelar relações progenitoras. Cada fato tem exatamente dois argumentos: o primeiro é o progenitor, o segundo é o descendente.

4. Organizando fatos em um arquivo .pl

Arquivos Prolog têm extensão .pl e contêm fatos, regras e consultas. Organize seu código de forma legível:

  • Agrupe fatos relacionados (ex: todos os pai juntos).
  • Use comentários com % para explicar seções.
  • Mantenha um fato por linha — isso facilita a leitura e a depuração.

Nosso arquivo familia.pl completo ficaria:

5. Carregando fatos no SWI-Prolog com consult/1

Com o arquivo salvo, inicie o SWI-Prolog no mesmo diretório (ou use o caminho completo). Para carregar os fatos, use o predicado consult/1:

Atalho: você também pode usar ?- [familia]. (sem aspas e sem extensão).

Se o arquivo estiver em outro diretório, use o caminho absoluto ou mude o diretório com cd/1:

Verificação: Se o carregamento for bem-sucedido, o sistema responde com true. Se houver erro de sintaxe, ele apontará a linha e o problema — preste atenção ao ponto final e às maiúsculas/minúsculas.

6. Verificando os fatos carregados com listing/1

Para conferir se todos os fatos foram carregados corretamente, use o predicado listing/1. Ele exibe todos os fatos e regras de um predicado específico:

Se você usar listing. (sem argumento), o sistema mostra todos os predicados carregados. Isso é útil para depuração geral.

7. Erros comuns de sintaxe (e como evitá-los)

ErroExemplo erradoCorreção
Esquecer o ponto finalpai(jose, ana)pai(jose, ana).
Predicado com maiúsculaPai(jose, ana). (vira variável)pai(jose, ana).
Átomo com maiúsculapai(Jose, ana). (vira variável)pai(jose, ana).
Espaço entre predicado e parêntesepai (jose, ana).pai(jose, ana). (sem espaço)
Vírgula faltando entre argumentospai(jose ana).pai(jose, ana).
Dica de ouro: Sempre que carregar um arquivo e receber false ou erro de sintaxe, verifique primeiro o ponto final e a capitalização. Mais de 80% dos erros de iniciantes vêm daí.

8. Exercício prático: crie uma base de fatos sobre um domínio diferente

Agora é sua vez! Escolha um domínio e crie um arquivo .pl com pelo menos 8 fatos. Exemplos:

  • Cardápio de restaurante: prato(lasanha, 25.90). bebida(agua, 4.50).
  • Biblioteca: livro(harry_potter, jk_rowling, 1997). autor(jk_rowling, britanica).
  • Times de futebol: time(flamengo, rio_de_janeiro). jogador(flamengo, gabigol).
  • Catálogo de filmes: filme(interestelar, ficcao, 2014). diretor(interestelar, christopher_nolan).

Passos sugeridos:

  1. Crie o arquivo com seus fatos.
  2. Carregue no SWI-Prolog.
  3. Use listing. para confirmar.
  4. Faça consultas simples: ?- prato(lasanha, Preco). (a variável Preco será ligada ao valor).
  5. Teste com consultas que falham: ?- livro(senhor_dos_aneis, _, _).

9. Resumo e desafio final

Resumo: Fatos são a base de qualquer programa Prolog. Eles estabelecem relações incondicionalmente verdadeiras usando predicados e átomos em minúsculas, terminados por um ponto final. Organize seus fatos em arquivos .pl, carregue com consult/1 e verifique com listing/1. Dominar a sintaxe dos fatos é o primeiro passo para criar sistemas de conhecimento complexos.

🚀 Desafio: expanda a árvore genealógica

Com base nos fatos de familia.pl que criamos, adicione mais duas gerações:

  • Inclua os avós de Carlos (paternos e maternos).
  • Adicione irmãos para José.
  • Crie fatos para casado/2 (ex: casado(jose, maria).).
  • Por fim, use listing. para ver todos os fatos carregados e consulte: Quem é avô de Pedro? (ainda sem regras, apenas com os fatos que você inseriu).

Esse exercício vai consolidar a sintaxe e preparar o terreno para as regras que veremos no próximo artigo!


Deixe um comentário