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.
2. Sintaxe correta dos fatos
A sintaxe de um fato em Prolog é simples, mas rigorosa. Cada fato segue a estrutura:
|
1 |
predicado(argumento1, argumento2, ...). |
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.
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
% Fatos sobre pais % Fatos sobre pais pai(adão, cain). mae(eva, cain). pai(adão, abel). mae(eva, abel). pai(adão, seth). mae(eva, seth). |
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
paijuntos). - 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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
% =========================================== % Árvore genealógica da família % =========================================== % Relação pai pai(adão, cain). pai(adão, abel). pai(adão, seth). % Relação mãe mae(eva, cain). mae(eva, abel). mae(eva, seth). |
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:
|
1 2 |
?- consult('familia.pl'). true. |
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:
|
1 2 |
?- cd('c:/meus_projetos/prolog'). ?- consult('familia.pl'). |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
?- listing(pai). % listando fatos de pai... pai(jose, ana). pai(jose, carlos). pai(joao, jose). ?- listing(mae). % listando fatos de mae... mae(maria, ana). mae(maria, carlos). mae(paula, jose). mae(ana, pedro). |
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)
| Erro | Exemplo errado | Correção |
|---|---|---|
| Esquecer o ponto final | pai(jose, ana) | pai(jose, ana). |
| Predicado com maiúscula | Pai(jose, ana). (vira variável) | pai(jose, ana). |
| Átomo com maiúscula | pai(Jose, ana). (vira variável) | pai(jose, ana). |
| Espaço entre predicado e parêntese | pai (jose, ana). | pai(jose, ana). (sem espaço) |
| Vírgula faltando entre argumentos | pai(jose ana). | pai(jose, ana). |
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:
- Crie o arquivo com seus fatos.
- Carregue no SWI-Prolog.
- Use
listing.para confirmar. - Faça consultas simples:
?- prato(lasanha, Preco).(a variávelPrecoserá ligada ao valor). - 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!