Fatos em Prolog: A Base do Conhecimento Lógico

filósofo
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!


Roteiro Python

Início de uma jornada
Python é uma linguagem versátil e poderosa. Primeiramente, ela se torna ótima para começar a programar. Além disso, muitos profissionais a utilizam no mercado de trabalho. Ademais, a linguagem possui uma comunidade muito ativa. Neste guia, você entenderá os principais conceitos. Da mesma forma, aprenderá os diferentes estilos de programação disponíveis. Então, vamos explorar cada um de forma simples e direta. Portanto, prepare-se para uma jornada incrível no mundo da programação. Em suma, você está prestes a dar um passo importante. (104 palavras)

Conhecimento base da linguagem Python

Primeiramente, você precisa entender os fundamentos do Python. Variáveis armazenam dados como números e textos. Estruturas como listas e dicionários organizam informações. Condicionais if e else criam decisões no código. Laços for e while repetem ações automaticamente. Funções são blocos reutilizáveis que evitam repetição. Cada função pode receber dados e retornar resultados. Além disso, os blocos try e except tratam erros de forma elegante. Esses elementos formam a base para tudo que virá. Consequentemente, eles são ensinados nos primeiros passos do aprendizado. Dessa forma, você constrói uma fundação sólida. (112 palavras) Todos esses fundamentos ganham vida em projetos reais. Por exemplo, um programa pode calcular descontos em compras. Outro exemplo seria organizar uma lista de contatos. A sintaxe do Python foi projetada para ser legível. Assim, iniciantes aprendem com mais facilidade. Muitos recursos gratuitos estão disponíveis na internet. A prática constante é o segredo para fixar o conhecimento. Sendo assim, reserve um tempo diário para estudar. Além disso, tente criar pequenos projetos pessoais. Desse modo, você evolui rapidamente. Em outras palavras, a prática leva à perfeição. (91 palavras)

Estilos de programação: web, paralela e concorrente

Na programação web, Python cria sites e APIs poderosas. Frameworks como Django e Flask são muito usados. Eles gerenciam rotas, bancos de dados e segurança. O código executa no servidor, não no navegador. Portanto, o usuário vê apenas o resultado final. A comunicação ocorre via protocolo HTTP/HTTPS. A programação paralela executa múltiplas tarefas ao mesmo tempo. Para isso, ela usa vários núcleos do processador. O módulo multiprocessing do Python é um exemplo. Cada processo tem sua própria memória isolada. Assim sendo, tarefas pesadas rodam de forma independente. (94 palavras) Por outro lado, a programação concorrente lida com muitas tarefas de forma eficiente. Em outras palavras, elas não precisam rodar literalmente em paralelo. O módulo asyncio permite isso de forma elegante. Uma tarefa pode pausar enquanto outra executa. Essas técnicas são essenciais para sistemas de alto desempenho. Além disso, elas aparecem frequentemente combinadas nos projetos. Portanto, vale a pena estudar cada uma delas com atenção. Dessa maneira, você escolhe a ferramenta certa para cada problema. (84 palavras) Três abordagens diferentes foram explicadas acima. A web é uma programação orientada a requisições. A paralela resolve cálculos pesados em CPU. A concorrente é ideal para operações de entrada/saída. Cada uma resolve problemas distintos de forma elegante. Por exemplo, um servidor web usa concorrência para muitos usuários. Já um processador de imagens usa paralelismo real. Decisões de arquitetura dependem do tipo de problema. A escolha correta melhora drasticamente a performance geral. Assim sendo, analise seu cenário antes de decidir. Além disso, combine técnicas quando for necessário. Por fim, teste cada abordagem na prática. (118 palavras)

Iniciando: POO, funcional e imperativa

A programação orientada a objetos (POO) organiza código em classes. Uma classe funciona como um molde para criar objetos. Cada objeto tem atributos (dados) e métodos (ações). A herança permite reutilizar código entre classes diferentes. O polimorfismo faz objetos responderem de formas variadas. O encapsulamento protege dados internos contra acessos indevidos. Métodos mágicos como __init__ são chamados automaticamente. Dessa forma, o código fica mais organizado e reutilizável. (72 palavras) A programação funcional evita mudanças de estado e dados mutáveis. Funções puras sempre dão o mesmo resultado para mesma entrada. Funções map e filter transformam listas sem efeitos colaterais. Compreensões de lista são uma forma concisa e declarativa. Já a programação imperativa/procedural descreve passo a passo o que fazer. Ela lembra uma receita de bolo: sequencial e clara. Laços, variáveis e condicionais são seus elementos principais. Esse paradigma funciona naturalmente para quem está começando agora. Portanto, inicie por ele antes dos demais. Em outras palavras, comece pelo mais intuitivo. (98 palavras) Notavelmente, Python suporta todos esses três paradigmas juntos. Um mesmo programa pode usar classes, funções puras e comandos sequenciais. Isso torna a linguagem extremamente flexível para projetos. Por exemplo, uma classe pode conter um método funcional internamente. Além disso, a legibilidade do Python favorece o estilo imperativo quando necessário. Cada desenvolvedor escolhe a abordagem mais adequada. A mistura consciente desses estilos é uma habilidade avançada. Com o tempo, você aprenderá quando usar cada um deles. Sendo assim, não tenha medo de experimentar combinações. Consequentemente, você se tornará um programador mais versátil. Desse modo, aproveite o melhor de todos os mundos. (113 palavras)

Avançado: aspectos, eventos, declarativa e lógica

A programação orientada a aspectos separa preocupações transversais. Logging, segurança e cache são exemplos dessas preocupações. Decoradores em Python implementam aspectos de maneira elegante. Um decorador pode medir o tempo de execução de qualquer função. A programação orientada a eventos reage a ações do usuário ou sistema. Interfaces gráficas (GUI) usam esse modelo intensivamente. Um clique de mouse dispara uma função específica. Assim, o sistema responde instantaneamente às interações. (71 palavras) A programação declarativa descreve o que fazer, não como fazer. SQL para bancos de dados é um exemplo clássico. Compreensões de lista em Python também são declarativas. Por fim, a programação lógica usa regras e fatos para deduzir conclusões. A fórmula lógica \(p \rightarrow q\) significa "se p então q". Bibliotecas como pyDatalog trazem isso para o Python. Embora menos comum, essa abordagem é útil para sistemas especialistas e inteligência artificial. Portanto, conheça esses paradigmas mesmo que superficialmente. Em suma, cada um amplia seu repertório técnico. (92 palavras) Esses paradigmas avançados aparecem em nichos específicos. Por exemplo, jogos usam eventos para cada ação do jogador. Bancos de dados relacionais usam lógica declarativa nas consultas. Frameworks web usam decorators (aspectos) para rotas e permissões. A programação genérica aparece em bibliotecas como NumPy e Pandas. Cada um desses estilos expande o horizonte do que é possível. Eles foram desenvolvidos para resolver problemas complexos de forma elegante. Com prática, você reconhecerá quando aplicar cada técnica. Python é a ferramenta ideal para explorar todos esses mundos. Assim sendo, continue estudando e praticando sempre. Além disso, compartilhe seu conhecimento com outros iniciantes. Dessa forma, você aprende ainda mais ensinando. (117 palavras)
✅ Este índice organiza os principais tópicos para aprendizado da linguagem Python em uma sequência lógica. (12 palavras) Abaixo você encontra os links dos posts sobre Python Básico com uma ordem sugerida de aprendizagem. Por enquanto, omitimos a programação genérica para não sobrecarregar iniciantes. (21 palavras)
LinkedIn
Share
Instagram