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.
is/2 é um predicado que avalia a expressãoaritmé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)modresto da divisão inteira^exponenciação (potência)
|
1 2 3 4 5 6 7 8 |
?- X is 10 / 3. % 3.3333333333333335 X = 3.3333333333333335. ?- Y is 10 // 3. % 3 (divisão inteira) Y = 3. ?- Z is 10 mod 3. % 1 Z = 1. |
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.
|
1 2 3 4 5 6 7 |
% país(Nome, Area_em_milhoes_km2, Populacao_em_milhoes) país(brasil, 8.516, 213). país(eua, 9.834, 331). país(india, 3.287, 1400). país(portugal, 0.092, 10.3). país(japao, 0.378, 125). |
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.
|
1 2 3 |
densidade(Nome, D) :- país(Nome, A, P), D is P / A. |
Consultando:
|
1 2 |
?- densidade(brasil, D). D = 25.006... % 213 / 8.516 ≈ 25.0 hab/milhão km² |
🔎 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 é<=!)
|
1 2 3 4 5 |
?- 2 + 3 =:= 5. % true ?- 10 / 2 =:= 5. % true ?- 4 * 2 =\= 9. % true (8 ≠ 9) ?- 7 > 5. % true ?- 3 =< 4. % true (3 ≤ 4) |
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.
|
1 2 3 |
?- país(Nome, _, Pop), Pop > 500. Nome = india, Pop = 1400 ; false. |
Também podemos criar uma regra:
|
1 |
populoso(Nome) :- país(Nome, _, Pop), Pop > 500. |
Consultando: ?- populoso(X). retorna X = india.
• 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.
|
1 2 3 4 5 |
?- 2 + 3 = 5. % false (estruturas diferentes) ?- 2 + 3 =:= 5. % true (avalia e compara) ?- X = 2 + 3. % X = 2 + 3 (unifica com a estrutura) ?- X =:= 2 + 3. % erro: X não é numérico (se não instanciado) |
=:= 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.