Aritmética e Comparações em Prolog

Lidando com números de forma declarativa — e sem sustos

Se você vem de linguagens como Python, Java ou C, pode estranhar o comportamento do Prolog com números.
Prolog não avalia expressões aritméticas automaticamente.
Ao contrário do que acontece em 2 + 3 em Python (que já retorna 5),
em Prolog a expressão 2 + 3 é apenas uma estrutura simbólica — a não ser
que você peça explicitamente para avaliá-la.

Neste artigo, vamos explorar como fazer cálculos, comparar valores numéricos e extrair informações
de uma base de dados de países. Tudo com exemplos práticos e explicações passo a passo.

1. Prolog não avalia automaticamente

Em Prolog, termos como 2 + 3 são vistos como uma estrutura com um operador functor +
e dois argumentos. Se você perguntar X = 2 + 3, o Prolog unificará X com a
estrutura +(2,3), e não com o número 5. Para efetivamente calcular, precisamos
de um predicado especial: is/2.

🧠 Lembre-se: is/2 é um predicado que avalia a expressão
aritmética do lado direito e unifica o resultado com o lado esquerdo (que deve ser uma variável ou um número).

2. O predicado is/2 — o avaliador

O uso clássico é: X is 2 + 3. Isso faz o Prolog calcular 2 + 3 e unificar
X com 5.

?- X is 2 + 3.
X = 5.

is/2 só funciona se o lado direito for uma expressão aritmética totalmente instanciada
(sem variáveis). Caso contrário, ocorrerá um erro.

3. Operadores aritméticos no Prolog

O Prolog oferece os operadores que você espera, com algumas particularidades:

  • + adição
  • - subtração
  • * multiplicação
  • / divisão real (resultado em ponto flutuante)
  • // divisão inteira (trunca para inteiro)
  • mod resto da divisão inteira
  • ^ exponenciação (potência)

 

4. Base de dados: países (área, população)

Vamos trabalhar com uma base de fatos no estilo país(nome, área, população),
onde área está em milhões de km² e população em milhões de habitantes.


 

5. Calculando densidade demográfica

A densidade populacional é D = P / A (população / área). Vamos criar uma regra
que calcula a densidade de um país.


 

Consultando:


 

🔎 Interpretação: O Brasil tem cerca de 25 habitantes por milhão de km² (na verdade,
usando milhões, a unidade fica coerente).

6. Predicados de comparação

Para comparar valores numéricos, usamos os seguintes operadores (todos avaliados aritmeticamente):

  • =:= igualdade aritmética (ex: 2 + 3 =:= 5 é verdadeiro)
  • =\= diferente aritmético
  • > maior que
  • < menor que
  • >= maior ou igual
  • =< menor ou igual (atenção: não é <= !)

 

7. “A área do Brasil é igual à área dos EUA?”

Para comparar áreas, podemos consultar diretamente:

?- país(brasil, A1, _), país(eua, A2, _), A1 =:= A2.
false.

O resultado é false, pois as áreas são diferentes (8.516 vs 9.834).

Se quiséssemos países com a mesma área (o que não ocorre nessa base), poderíamos usar
=:= na condição.

8. Selecionando dados: “Países com população > 500 milhões?”

Podemos usar comparações dentro de regras ou consultas para filtrar países.


 

Também podemos criar uma regra:


 

Consultando: ?- populoso(X). retorna X = india.

📊 Outras perguntas:
• Países com área maior que 5 milhões de km²? ?- país(N, A, _), A > 5. → Brasil, EUA.
• Densidade maior que 100? ?- país(N, A, P), D is P/A, D > 100. → Índia (≈426), Portugal (≈112).

9. Atenção: = (unificação) vs =:= (igualdade aritmética)

Essa é uma das maiores fontes de confusão para quem está aprendendo Prolog:

  • = é o operador de unificação. Ele tenta tornar dois termos
    sintaticamente idênticos, sem avaliar expressões aritméticas.
  • =:= é um predicado que avalia ambas as expressões
    aritméticas e compara os resultados numéricos.

 

⚠️ Importante: Use =:= e =\= para comparar valores numéricos.
Use = para unificar termos (inclusive variáveis). Para diferença sintática, use \=.


✅ A aritmética em Prolog é poderosa, mas exige precisão: use is/2 para calcular,
=:= para comparar valores e lembre-se que = é unificação, não igualdade numérica.
Pratique com a base de países e explore outras métricas como densidade, crescimento ou PIB per capita.

Deixe um comentário